Skip to content

Commit 497210d

Browse files
committed
[FOLD] emit better missing 'template' keyword diagnostics for dependent class member access
1 parent 01c3db0 commit 497210d

File tree

5 files changed

+39
-10
lines changed

5 files changed

+39
-10
lines changed

clang/include/clang/Parse/Parser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1967,7 +1967,7 @@ class Parser : public CodeCompletionHandler {
19671967
//===--------------------------------------------------------------------===//
19681968
// C++ Expressions
19691969
ExprResult tryParseCXXIdExpression(CXXScopeSpec &SS, bool isAddressOfOperand,
1970-
Token &Replacement);
1970+
Token *Replacement = nullptr);
19711971

19721972
ExprResult tryParseCXXPackIndexingExpression(ExprResult PackIdExpression);
19731973
ExprResult ParseCXXPackIndexingExpression(ExprResult PackIdExpression);

clang/lib/Parse/ParseExpr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,8 +1163,7 @@ ExprResult Parser::ParseCastExpression(CastParseKind ParseKind,
11631163
case tok::annot_non_type_dependent:
11641164
case tok::annot_non_type_undeclared: {
11651165
CXXScopeSpec SS;
1166-
Token Replacement;
1167-
Res = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
1166+
Res = tryParseCXXIdExpression(SS, isAddressOfOperand);
11681167
assert(!Res.isUnset() &&
11691168
"should not perform typo correction on annotation token");
11701169
break;

clang/lib/Parse/ParseExprCXX.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ bool Parser::ParseOptionalCXXScopeSpecifier(
603603

604604
ExprResult Parser::tryParseCXXIdExpression(CXXScopeSpec &SS,
605605
bool isAddressOfOperand,
606-
Token &Replacement) {
606+
Token *Replacement) {
607607
ExprResult E;
608608

609609
// We may have already annotated this id-expression.
@@ -657,7 +657,7 @@ ExprResult Parser::tryParseCXXIdExpression(CXXScopeSpec &SS,
657657
E = Actions.ActOnIdExpression(
658658
getCurScope(), SS, TemplateKWLoc, Name, Tok.is(tok::l_paren),
659659
isAddressOfOperand, /*CCC=*/nullptr, /*IsInlineAsmIdentifier=*/false,
660-
&Replacement);
660+
Replacement);
661661
break;
662662
}
663663

@@ -747,12 +747,12 @@ ExprResult Parser::ParseCXXIdExpression(bool isAddressOfOperand) {
747747

748748
Token Replacement;
749749
ExprResult Result =
750-
tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
750+
tryParseCXXIdExpression(SS, isAddressOfOperand, &Replacement);
751751
if (Result.isUnset()) {
752752
// If the ExprResult is valid but null, then typo correction suggested a
753753
// keyword replacement that needs to be reparsed.
754754
UnconsumeToken(Replacement);
755-
Result = tryParseCXXIdExpression(SS, isAddressOfOperand, Replacement);
755+
Result = tryParseCXXIdExpression(SS, isAddressOfOperand);
756756
}
757757
assert(!Result.isUnset() && "Typo correction suggested a keyword replacement "
758758
"for a previous keyword suggestion");

clang/lib/Parse/ParseOpenMP.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3016,12 +3016,10 @@ OMPClause *Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
30163016
SmallVector<SemaOpenMP::UsesAllocatorsData, 4> Data;
30173017
do {
30183018
CXXScopeSpec SS;
3019-
Token Replacement;
30203019
ExprResult Allocator =
30213020
getLangOpts().CPlusPlus
30223021
? ParseCXXIdExpression()
3023-
: tryParseCXXIdExpression(SS, /*isAddressOfOperand=*/false,
3024-
Replacement);
3022+
: tryParseCXXIdExpression(SS, /*isAddressOfOperand=*/false);
30253023
if (Allocator.isInvalid()) {
30263024
SkipUntil(tok::comma, tok::r_paren, tok::annot_pragma_openmp_end,
30273025
StopBeforeMatch);

clang/lib/Parse/ParseTemplate.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,6 +1802,38 @@ bool Parser::checkPotentialAngleBracketDelimiter(
18021802
return true;
18031803
}
18041804

1805+
if (OpToken.is(tok::greater) && Tok.is(tok::coloncolon)) {
1806+
SourceLocation StartLoc = Tok.getLocation();
1807+
CXXScopeSpec SS;
1808+
ParseOptionalCXXScopeSpecifier(SS, /*ObjectType=*/nullptr,
1809+
/*ObjectHasErrors=*/false,
1810+
/*EnteringContext=*/false);
1811+
ExprResult Result =
1812+
tryParseCXXIdExpression(SS, /*isAddressOfOperand=*/false);
1813+
bool Invalid = !Result.isUsable() || Result.get()->containsErrors();
1814+
Result = Actions.CorrectDelayedTyposInExpr(Result);
1815+
1816+
if (PP.isBacktrackEnabled())
1817+
PP.RevertCachedTokens(1);
1818+
else
1819+
PP.EnterToken(Tok, /*IsReinject=*/true);
1820+
1821+
SourceLocation EndLoc = Tok.getLocation();
1822+
Tok.setLocation(StartLoc);
1823+
Tok.setKind(tok::annot_primary_expr);
1824+
setExprAnnotation(Tok, Result);
1825+
Tok.setAnnotationEndLoc(EndLoc);
1826+
PP.AnnotateCachedTokens(Tok);
1827+
1828+
if (Invalid) {
1829+
Actions.diagnoseExprIntendedAsTemplateName(
1830+
getCurScope(), LAngle.TemplateName, LAngle.LessLoc,
1831+
OpToken.getLocation());
1832+
AngleBrackets.clear(*this);
1833+
return true;
1834+
}
1835+
}
1836+
18051837
// After a '>' (etc), we're no longer potentially in a construct that's
18061838
// intended to be treated as a template-id.
18071839
if (OpToken.is(tok::greater) ||

0 commit comments

Comments
 (0)