diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -158,6 +158,8 @@ - Fixed a crash in C++20 mode in Clang and Clangd when compile source with compilation errors. `Issue 53628 `_ +- The template arguments of a variable template being accessed as a + member will now be represented in the AST. Improvements to Clang's diagnostics diff --git a/clang/lib/Sema/SemaExprMember.cpp b/clang/lib/Sema/SemaExprMember.cpp --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -1161,10 +1161,10 @@ if (!Var->getTemplateSpecializationKind()) Var->setTemplateSpecializationKind(TSK_ImplicitInstantiation, MemberLoc); - return BuildMemberExpr( - BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, Var, FoundDecl, - /*HadMultipleCandidates=*/false, MemberNameInfo, - Var->getType().getNonReferenceType(), VK_LValue, OK_Ordinary); + return BuildMemberExpr(BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, Var, + FoundDecl, /*HadMultipleCandidates=*/false, + MemberNameInfo, Var->getType().getNonReferenceType(), + VK_LValue, OK_Ordinary, TemplateArgs); } // We found something that we didn't expect. Complain. diff --git a/clang/test/SemaCXX/cxx1z-ast-print.cpp b/clang/test/SemaCXX/cxx1z-ast-print.cpp --- a/clang/test/SemaCXX/cxx1z-ast-print.cpp +++ b/clang/test/SemaCXX/cxx1z-ast-print.cpp @@ -4,7 +4,7 @@ template static int x; // expected-note {{forward declaration of template entity is here}} template static int y; // expected-note {{forward declaration of template entity is here}} }; -// CHECK: int k = TypeSuffix().x + TypeSuffix().y; +// CHECK: int k = TypeSuffix().x<0L> + TypeSuffix().y<0L>; int k = TypeSuffix().x<0L> + TypeSuffix().y<0L>; // expected-warning {{instantiation of variable 'TypeSuffix::x<0>' required here, but no definition is available}} \ // expected-note {{add an explicit instantiation declaration to suppress this warning if 'TypeSuffix::x<0>' is explicitly instantiated in another translation unit}} \ // expected-warning {{instantiation of variable 'TypeSuffix::y<0L>' required here, but no definition is available}} \ diff --git a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp --- a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp @@ -2262,8 +2262,6 @@ template static constexpr T x = 42; }; -// FIXME: `` should be a child of `MemberExpression` and `;` of -// `ExpressionStatement`. This is a bug in clang, in `getSourceRange` methods. void test(S s) [[{ s.x; }]] @@ -2272,18 +2270,18 @@ CompoundStatement |-'{' OpenParen |-ExpressionStatement Statement -| `-MemberExpression Expression -| |-IdExpression Object -| | `-UnqualifiedId UnqualifiedId -| | `-'s' -| |-'.' AccessToken -| `-IdExpression Member -| `-UnqualifiedId UnqualifiedId -| `-'x' -|-'<' -|-'int' -|-'>' -|-';' +| |-MemberExpression Expression +| | |-IdExpression Object +| | | `-UnqualifiedId UnqualifiedId +| | | `-'s' +| | |-'.' AccessToken +| | `-IdExpression Member +| | `-UnqualifiedId UnqualifiedId +| | |-'x' +| | |-'<' +| | |-'int' +| | `-'>' +| `-';' `-'}' CloseParen )txt"})); }