From 7a343142901f7f6bd1965051a24ae6a12c6f2148 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Sun, 1 Nov 2009 17:08:18 +0000 Subject: [PATCH] Within a template, qualified name lookup can refer to a non-dependent type that is not known to be a base class at template definition time due to some dependent base class. Treat qualified name lookup that refers to a non-static data member or function as implicit class member access when the "this" type would be dependent. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85718 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprCXX.cpp | 6 ++++++ test/SemaTemplate/instantiate-method.cpp | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 32eeddb0fe..fad1f3e263 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -2395,6 +2395,12 @@ bool Sema::isImplicitMemberReference(const CXXScopeSpec *SS, NamedDecl *D, // Determine whether the declaration(s) we found are actually in a base // class. If not, this isn't an implicit member reference. ThisType = MD->getThisType(Context); + + // If the type of "this" is dependent, we can't tell if the member is in a + // base class or not, so treat this as a dependent implicit member reference. + if (ThisType->isDependentType()) + return true; + QualType CtxType = Context.getTypeDeclType(cast(Ctx)); QualType ClassType = Context.getTypeDeclType(cast(MD->getParent())); diff --git a/test/SemaTemplate/instantiate-method.cpp b/test/SemaTemplate/instantiate-method.cpp index f7c09ef879..df1e1d964e 100644 --- a/test/SemaTemplate/instantiate-method.cpp +++ b/test/SemaTemplate/instantiate-method.cpp @@ -81,3 +81,20 @@ int *a(A0 &x0, A1 &x1) { int *y0 = x0; int *y1 = x1; // expected-error{{initializing}} } + +struct X0Base { + int &f(); +}; + +template +struct X0 : X0Base { +}; + +template +struct X1 : X0 { + int &f2() { return X0Base::f(); } +}; + +void test_X1(X1 x1i) { + int &ir = x1i.f2(); +}