Skip to content

Commit 9c8349f

Browse files
[clang][Sema] Unwrap reference types in HeuristicResolverImpl::resolveTypeToRecordDecl()
Partially fixes #124450
1 parent 753028b commit 9c8349f

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

clang/lib/Sema/HeuristicResolver.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ TemplateName getReferencedTemplateName(const Type *T) {
133133
CXXRecordDecl *HeuristicResolverImpl::resolveTypeToRecordDecl(const Type *T) {
134134
assert(T);
135135

136-
// Unwrap type sugar such as type aliases.
137-
T = T->getCanonicalTypeInternal().getTypePtr();
136+
// Unwrap references and type sugar such as type aliases.
137+
T = T->getCanonicalTypeInternal().getNonReferenceType().getTypePtr();
138138

139139
if (const auto *DNT = T->getAs<DependentNameType>()) {
140140
T = resolveDeclsToType(resolveDependentNameType(DNT), Ctx)

clang/unittests/Sema/HeuristicResolverTest.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,27 @@ TEST(HeuristicResolver, MemberExpr_Chained) {
213213
cxxMethodDecl(hasName("foo")).bind("output"));
214214
}
215215

216+
TEST(HeuristicResolver, MemberExpr_ReferenceType) {
217+
std::string Code = R"cpp(
218+
struct B {
219+
int waldo;
220+
};
221+
template <typename T>
222+
struct A {
223+
B &b;
224+
};
225+
template <typename T>
226+
void foo(A<T> &a) {
227+
a.b.waldo;
228+
}
229+
)cpp";
230+
// Test resolution of "waldo" in "a.b.waldo".
231+
expectResolution(
232+
Code, &HeuristicResolver::resolveMemberExpr,
233+
cxxDependentScopeMemberExpr(hasMemberName("waldo")).bind("input"),
234+
fieldDecl(hasName("waldo")).bind("output"));
235+
}
236+
216237
TEST(HeuristicResolver, MemberExpr_TemplateArgs) {
217238
std::string Code = R"cpp(
218239
struct Foo {

0 commit comments

Comments
 (0)