summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2013-08-09 23:37:05 +0000
committerEli Friedman <eli.friedman@gmail.com>2013-08-09 23:37:05 +0000
commit8564139c0ec56fe8f9e692294f7ae103b609dbcb (patch)
treefb4553078430b2dba3dfb57d27853877db414ae5
parentd6ce6cbdac5e0d433adb52499dc3ba9c59c4c5d1 (diff)
downloadbcm5719-llvm-8564139c0ec56fe8f9e692294f7ae103b609dbcb.tar.gz
bcm5719-llvm-8564139c0ec56fe8f9e692294f7ae103b609dbcb.zip
Correctly profile CXXPseudoDestructorExprs.
CXXPseudoDestructorExprs may not contain a type. PR16852. llvm-svn: 188123
-rw-r--r--clang/lib/AST/StmtProfile.cpp9
-rw-r--r--clang/test/SemaTemplate/destructor-template.cpp8
2 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index a626f68aa58..eb93c1df0e2 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -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) {
diff --git a/clang/test/SemaTemplate/destructor-template.cpp b/clang/test/SemaTemplate/destructor-template.cpp
index 6806c24a84e..4e1af9ad1f9 100644
--- a/clang/test/SemaTemplate/destructor-template.cpp
+++ b/clang/test/SemaTemplate/destructor-template.cpp
@@ -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'}}
+}
OpenPOWER on IntegriCloud