Correctly profile CXXPseudoDestructorExprs.
authorEli Friedman <eli.friedman@gmail.com>
Fri, 9 Aug 2013 23:37:05 +0000 (23:37 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 9 Aug 2013 23:37:05 +0000 (23:37 +0000)
CXXPseudoDestructorExprs may not contain a type.  PR16852.

llvm-svn: 188123

clang/lib/AST/StmtProfile.cpp
clang/test/SemaTemplate/destructor-template.cpp

index a626f68aa588d9612119e73c11609d4462e7a1b5..eb93c1df0e2f8b14170eccaba399695b7ab7faf7 100644 (file)
@@ -910,7 +910,14 @@ StmtProfiler::VisitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *S) {
   VisitExpr(S);
   ID.AddBoolean(S->isArrow());
   VisitNestedNameSpecifier(S->getQualifier());
-  VisitType(S->getDestroyedType());
+  ID.AddBoolean(S->getScopeTypeInfo() != 0);
+  if (S->getScopeTypeInfo())
+    VisitType(S->getScopeTypeInfo()->getType());
+  ID.AddBoolean(S->getDestroyedTypeInfo() != 0);
+  if (S->getDestroyedTypeInfo())
+    VisitType(S->getDestroyedType());
+  else
+    ID.AddPointer(S->getDestroyedTypeIdentifier());
 }
 
 void StmtProfiler::VisitOverloadExpr(const OverloadExpr *S) {
index 6806c24a84ebafeb0177ea2ac69ceeab75277122..4e1af9ad1f96579c275b3cc2d27676029514466a 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
 
 template<typename A> class s0 {
 
@@ -76,3 +76,9 @@ namespace rdar13140795 {
     Marshal<int>::gc();
   }
 }
+
+namespace PR16852 {
+  template<typename T> struct S { int a; T x; };
+  template<typename T> decltype(S<T>().~S()) f(); // expected-note {{candidate template ignored: couldn't infer template argument 'T'}}
+  void g() { f(); } // expected-error {{no matching function for call to 'f'}}
+}