You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@daffodil.apache.org by "Olabusayo Kilo (Jira)" <ji...@apache.org> on 2026/06/09 14:40:00 UTC
[jira] [Assigned] (DAFFODIL-3085) Abort when postfix separator is absent after optional element with discriminator
[ https://issues.apache.org/jira/browse/DAFFODIL-3085?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Olabusayo Kilo reassigned DAFFODIL-3085:
----------------------------------------
Assignee: Olabusayo Kilo
> Abort when postfix separator is absent after optional element with discriminator
> --------------------------------------------------------------------------------
>
> Key: DAFFODIL-3085
> URL: https://issues.apache.org/jira/browse/DAFFODIL-3085
> Project: Daffodil
> Issue Type: Bug
> Components: Back End
> Affects Versions: 4.1.0
> Reporter: Olabusayo Kilo
> Assignee: Olabusayo Kilo
> Priority: Major
>
> In a postfix-separated sequence with separatorSuppressionPolicy="anyEmpty", when an optional element contains a dfdl:discriminator that evaluates to true and the element's content parses successfully but the postfix separator is not present in the data, Daffodil aborts with an internal Assert.invariant failure rather than producing a clean parse error.
> Minimal reproducing schema:
> {code:xml}
> <xs:sequence dfdl:separator="//" dfdl:separatorPosition="postfix">
> <xs:element name="foo" minOccurs="0">
> <xs:complexType>
> <xs:sequence>
> <xs:sequence>
> <xs:annotation>
> <xs:appinfo source="http://www.ogf.org/dfdl/">
> <dfdl:discriminator test="{fn:true()}"/>
> </xs:appinfo>
> </xs:annotation>
> </xs:sequence>
> <xs:element name="bar" type="xs:string" dfdl:length="1" dfdl:lengthKind="explicit"/>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
> <xs:element name="baz" type="xs:string" minOccurs="0" dfdl:length="1" dfdl:lengthKind="explicit"/>
> </xs:sequence>
> {code}
> With Input data "ABCD", we expect the parse error "Failed to find postfix separator" but instead Daffodil is erroring out with an internal abort/Assert.invariant failure.
> Turns out this was because when the discriminator evaluated to true it resolved the inner PoU for foo (PostfixSeparatorHelper). The child then parsed successfully, but sep.parse1 faied to find //. The child-successful+sep-failed path in PostfixSeparatorHelper
> intended to backtrack via resetToPointOfUncertainty(pou), but first checked Assert.invariant(!pstate.isPointOfUncertaintyResolved(pou)). Since the discriminator had already resolved that PoU, the invariant fired.
> The code should detect the resolved PoU and call resolvePointOfUncertainty() instead of trying to reset, then proceed to signal the separator-not-found failure normally.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)