r219897 - Bugfix in template instantiation in CXXPseudoDestructorExpr.

Alexey Bataev a.bataev at hotmail.com
Wed Oct 15 20:04:35 PDT 2014


Author: abataev
Date: Wed Oct 15 22:04:35 2014
New Revision: 219897

URL: http://llvm.org/viewvc/llvm-project?rev=219897&view=rev
Log:
Bugfix in template instantiation in CXXPseudoDestructorExpr.
Fix for clang crash when instantiating a template with qualified lookup for members in non-class types.
Differential Revision: http://reviews.llvm.org/D5769

Modified:
    cfe/trunk/lib/Sema/TreeTransform.h
    cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp

Modified: cfe/trunk/lib/Sema/TreeTransform.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=219897&r1=219896&r2=219897&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/TreeTransform.h (original)
+++ cfe/trunk/lib/Sema/TreeTransform.h Wed Oct 15 22:04:35 2014
@@ -10510,9 +10510,16 @@ TreeTransform<Derived>::RebuildCXXPseudo
 
   // 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<TagType>()) {
+      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,

Modified: cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp?rev=219897&r1=219896&r2=219897&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-non-dependent-types.cpp Wed Oct 15 22:04:35 2014
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
 template<typename T>
 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 @@ struct X2 {
   typedef instantiate<&X1<int>::member> i; // expected-note{{in instantiation of}}
 };
 
-X2<int> x; 
+X2<int> x;
+
+template <class T, class A> class C {
+public:
+  int i;
+  void f(T &t) {
+    T *q = new T();
+    t.T::~T();
+    q->~T();
+    // expected-error at +2 {{'int' is not a class, namespace, or scoped enumeration}}
+    // expected-error at +1 {{no member named '~Colors' in 'Colors'}}
+    q->A::~A();
+    // expected-error at +2 {{no member named '~int' in 'Q'}}
+    // expected-error at +1 {{no member named '~Colors' in 'Q'}}
+    q->~A();
+
+    delete q;
+  }
+};
+
+class Q {
+public:
+  Q() {}
+  ~Q() {}
+};
+
+enum Colors {red, green, blue};
+
+C<Q, int> dummy;
+C<Q, Colors> dummyColors;
+int main() {
+  Q qinst;
+  // expected-note at +1 {{in instantiation of member function 'C<Q, int>::f' requested here}}
+  dummy.f(qinst);
+  // expected-note at +1 {{in instantiation of member function 'C<Q, Colors>::f' requested here}}
+  dummyColors.f(qinst);
+}
+





More information about the cfe-commits mailing list