diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 5d6b53b3a4fcf..372661814ab9a 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -158,6 +158,8 @@ Bug Fixes - 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 index d7d67f92a8e0c..fc68b526e30ca 100644 --- a/clang/lib/Sema/SemaExprMember.cpp +++ b/clang/lib/Sema/SemaExprMember.cpp @@ -1161,10 +1161,10 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, 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 index 42b3cd35713d1..a6ba149e974ef 100644 --- a/clang/test/SemaCXX/cxx1z-ast-print.cpp +++ b/clang/test/SemaCXX/cxx1z-ast-print.cpp @@ -4,7 +4,7 @@ struct TypeSuffix { 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 index eef0e87ee093f..37e3546dc9087 100644 --- a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp +++ b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp @@ -2262,8 +2262,6 @@ struct S { 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 @@ void test(S s) [[{ 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"})); }