Index: cfe/trunk/lib/Sema/TreeTransform.h =================================================================== --- cfe/trunk/lib/Sema/TreeTransform.h +++ cfe/trunk/lib/Sema/TreeTransform.h @@ -10510,9 +10510,16 @@ // The scope type is now known to be a valid nested name specifier // component. Tack it on to the end of the nested name specifier. - if (ScopeType) - SS.Extend(SemaRef.Context, SourceLocation(), - ScopeType->getTypeLoc(), CCLoc); + if (ScopeType) { + if (!ScopeType->getType()->getAs()) { + getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), + diag::err_expected_class_or_namespace) + << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; + return ExprError(); + } + SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), + CCLoc); + } SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. return getSema().BuildMemberReferenceExpr(Base, BaseType, Index: cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp =================================================================== --- cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp +++ cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s template struct X1 { static void member() { T* x = 1; } // expected-error{{cannot initialize a variable of type 'int *' with an rvalue of type 'int'}} @@ -11,4 +12,41 @@ typedef instantiate<&X1::member> i; // expected-note{{in instantiation of}} }; -X2 x; +X2 x; + +template class C { +public: + int i; + void f(T &t) { + T *q = new T(); + t.T::~T(); + q->~T(); + // expected-error@+2 {{'int' is not a class, namespace, or scoped enumeration}} + // expected-error@+1 {{no member named '~Colors' in 'Colors'}} + q->A::~A(); + // expected-error@+2 {{no member named '~int' in 'Q'}} + // expected-error@+1 {{no member named '~Colors' in 'Q'}} + q->~A(); + + delete q; + } +}; + +class Q { +public: + Q() {} + ~Q() {} +}; + +enum Colors {red, green, blue}; + +C dummy; +C dummyColors; +int main() { + Q qinst; + // expected-note@+1 {{in instantiation of member function 'C::f' requested here}} + dummy.f(qinst); + // expected-note@+1 {{in instantiation of member function 'C::f' requested here}} + dummyColors.f(qinst); +} +