aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/SemaExprCXX.cpp5
-rw-r--r--test/SemaTemplate/instantiate-method.cpp21
2 files changed, 20 insertions, 6 deletions
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 209d3069ca..6f0cb8a270 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -2335,11 +2335,6 @@ bool Sema::isImplicitMemberReference(const CXXScopeSpec *SS, NamedDecl *D,
// 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<CXXRecordDecl>(Ctx));
QualType ClassType
= Context.getTypeDeclType(cast<CXXRecordDecl>(MD->getParent()));
diff --git a/test/SemaTemplate/instantiate-method.cpp b/test/SemaTemplate/instantiate-method.cpp
index df1e1d964e..a82e84d36c 100644
--- a/test/SemaTemplate/instantiate-method.cpp
+++ b/test/SemaTemplate/instantiate-method.cpp
@@ -84,6 +84,8 @@ int *a(A0<int> &x0, A1<int> &x1) {
struct X0Base {
int &f();
+ int& g(int);
+ static double &g(double);
};
template<typename T>
@@ -92,9 +94,26 @@ struct X0 : X0Base {
template<typename U>
struct X1 : X0<U> {
- int &f2() { return X0Base::f(); }
+ int &f2() {
+ return X0Base::f(); // expected-error{{call to non-static member function without an object argument}}
+ }
};
void test_X1(X1<int> x1i) {
int &ir = x1i.f2();
}
+
+template<typename U>
+struct X2 : X0Base, U {
+ int &f2() { return X0Base::f(); }
+};
+
+template<typename T>
+struct X3 {
+ void test(T x) {
+ double& d1 = X0Base::g(x);
+ }
+};
+
+
+template struct X3<double>;