================
@@ -1214,9 +1214,11 @@ class AnnotatingParser {
unsigned CommaCount = 0;
while (CurrentToken) {
- assert(!Scopes.empty());
+ if (Scopes.empty())
+ return false;
if (CurrentToken->is(tok::r_brace)) {
- assert(Scopes.back() == getScopeType(OpeningBrace));
+ if (Scopes.back() != getScopeType(OpeningBrace))
----------------
HazardyKnusperkeks wrote:
> Yes, it happens — it's not just a defensive change.
>
> hit by `enum E { { ? } a }` , outer `{` pushes ST_Enum, inner `{` pushes
> ST_Other. The stray `}` inside the `?` gets eaten by consumeToken's r_brace
> branch and pops the inner ST_Other. So when the inner parseBrace reaches its
> real `}`, the top is ST_Enum — wrong type, not empty — and the second assert
> trips.
Thanks for the reply and the analysis.
If we add to `parseConditional`
``` c++
if (CurrentToken->is(tok::r_brace))
return false;
```
That should also fix the issue and the assert can stay, right? I'd prefer that.
https://github.com/llvm/llvm-project/pull/199098
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits