Skip to content

Commit 5037350

Browse files
authored
[clang] Preserve found-decl when constructing VarTemplateIds (#82265)
1 parent 8b84de2 commit 5037350

File tree

3 files changed

+16
-11
lines changed

3 files changed

+16
-11
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8538,7 +8538,7 @@ class Sema final {
85388538
/// if the arguments are dependent.
85398539
ExprResult CheckVarTemplateId(const CXXScopeSpec &SS,
85408540
const DeclarationNameInfo &NameInfo,
8541-
VarTemplateDecl *Template,
8541+
VarTemplateDecl *Template, NamedDecl *FoundD,
85428542
SourceLocation TemplateLoc,
85438543
const TemplateArgumentListInfo *TemplateArgs);
85448544

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4958,11 +4958,10 @@ Sema::CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc,
49584958
return Decl;
49594959
}
49604960

4961-
ExprResult
4962-
Sema::CheckVarTemplateId(const CXXScopeSpec &SS,
4963-
const DeclarationNameInfo &NameInfo,
4964-
VarTemplateDecl *Template, SourceLocation TemplateLoc,
4965-
const TemplateArgumentListInfo *TemplateArgs) {
4961+
ExprResult Sema::CheckVarTemplateId(
4962+
const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo,
4963+
VarTemplateDecl *Template, NamedDecl *FoundD, SourceLocation TemplateLoc,
4964+
const TemplateArgumentListInfo *TemplateArgs) {
49664965

49674966
DeclResult Decl = CheckVarTemplateId(Template, TemplateLoc, NameInfo.getLoc(),
49684967
*TemplateArgs);
@@ -4978,8 +4977,7 @@ Sema::CheckVarTemplateId(const CXXScopeSpec &SS,
49784977
NameInfo.getLoc());
49794978

49804979
// Build an ordinary singleton decl ref.
4981-
return BuildDeclarationNameExpr(SS, NameInfo, Var,
4982-
/*FoundD=*/nullptr, TemplateArgs);
4980+
return BuildDeclarationNameExpr(SS, NameInfo, Var, FoundD, TemplateArgs);
49834981
}
49844982

49854983
void Sema::diagnoseMissingTemplateArguments(TemplateName Name,
@@ -5066,9 +5064,9 @@ ExprResult Sema::BuildTemplateIdExpr(const CXXScopeSpec &SS,
50665064
bool KnownDependent = false;
50675065
// In C++1y, check variable template ids.
50685066
if (R.getAsSingle<VarTemplateDecl>()) {
5069-
ExprResult Res = CheckVarTemplateId(SS, R.getLookupNameInfo(),
5070-
R.getAsSingle<VarTemplateDecl>(),
5071-
TemplateKWLoc, TemplateArgs);
5067+
ExprResult Res = CheckVarTemplateId(
5068+
SS, R.getLookupNameInfo(), R.getAsSingle<VarTemplateDecl>(),
5069+
R.getRepresentativeDecl(), TemplateKWLoc, TemplateArgs);
50725070
if (Res.isInvalid() || Res.isUsable())
50735071
return Res;
50745072
// Result is dependent. Carry on to build an UnresolvedLookupEpxr.

clang/test/AST/ast-dump-using.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace a {
44
struct S;
5+
template <typename T> T x = {};
56
}
67
namespace b {
78
using a::S;
@@ -21,4 +22,10 @@ typedef S e; // check the same UsingType is reused.
2122
// CHECK-NEXT: `-UsingType [[TYPE_ADDR]] 'a::S' sugar
2223
// CHECK-NEXT: |-UsingShadow [[SHADOW_ADDR]] 'S'
2324
// CHECK-NEXT: `-RecordType {{.*}} 'a::S'
25+
using a::x;
26+
27+
void foo() {
28+
x<int> = 3;
29+
// CHECK: DeclRefExpr {{.*}} 'x' {{.*}} (UsingShadow {{.*}} 'x')
30+
}
2431
}

0 commit comments

Comments
 (0)