================ @@ -1269,10 +1269,17 @@ class AnnotatingParser { if (CurrentToken && CurrentToken->is(tok::less)) { CurrentToken->setType(TT_TemplateOpener); next(); - if (!parseAngle()) + TemplateDeclarationDepth++; + if (!parseAngle()) { + TemplateDeclarationDepth--; return false; - if (CurrentToken) + } + TemplateDeclarationDepth--; + if (CurrentToken && + (TemplateDeclarationDepth == 0 || + !CurrentToken->isOneOf(tok::kw_typename, tok::kw_class))) { ---------------- owenca wrote:
> If parseAngle fails, wouldn't that cause InTemplateDeclaration to forever be > true? Is that not an issue? If `parseAngle()` returns false, it probably means that the template decl is ill-formed. If so, it doesn't matter if `InTemplateDeclaration` is set to false? An alternative solution: ``` - bool parseTemplateDeclaration() { - if (CurrentToken && CurrentToken->is(tok::less)) { - CurrentToken->setType(TT_TemplateOpener); - next(); - if (!parseAngle()) - return false; - if (CurrentToken) - CurrentToken->Previous->ClosesTemplateDeclaration = true; - return true; - } - return false; + bool parseTemplateDeclaration(bool InTemplateParameter) { + if (!CurrentToken || CurrentToken->isNot(tok::less)) + return false; + + InTemplateDeclaration = true; + CurrentToken->setType(TT_TemplateOpener); + next(); + + const bool WellFormed = parseAngle(); + InTemplateDeclaration = InTemplateParameter; + + if (!WellFormed) + return false; + + if (CurrentToken && !InTemplateParameter) + CurrentToken->Previous->ClosesTemplateDeclaration = true; + + return true; } ``` https://github.com/llvm/llvm-project/pull/95025 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits