summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Redl <sebastian.redl@getdesigned.at>2011-05-19 16:25:27 +0000
committerSebastian Redl <sebastian.redl@getdesigned.at>2011-05-19 16:25:27 +0000
commit8035d1c435e7df31f1497c23cd99d5982ec1a84d (patch)
treeb4cb952a29c9e585d812e291ab7c1624bffa75ef
parentec0810e1c8e690ebbf571670820392d52fb23b75 (diff)
downloadbcm5719-llvm-8035d1c435e7df31f1497c23cd99d5982ec1a84d.tar.gz
bcm5719-llvm-8035d1c435e7df31f1497c23cd99d5982ec1a84d.zip
Fix PR9941 again, this time for templates.
llvm-svn: 131640
-rw-r--r--clang/lib/Sema/SemaDecl.cpp6
-rw-r--r--clang/test/CXX/special/class.dtor/p3-0x.cpp29
2 files changed, 33 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index fd28f2b6ee9..fcff0b8ea0d 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -8200,8 +8200,10 @@ void Sema::ActOnFields(Scope* S,
const CXXDestructorDecl *Dtor =
DelayedDestructorExceptionSpecChecks.back().first;
if (Dtor->getParent() == Record) {
- CheckOverridingFunctionExceptionSpec(Dtor,
- DelayedDestructorExceptionSpecChecks.back().second);
+ // Don't check if we're a template. The spec hasn't been adjusted.
+ if (!Dtor->getParent()->isDependentType())
+ CheckOverridingFunctionExceptionSpec(Dtor,
+ DelayedDestructorExceptionSpecChecks.back().second);
DelayedDestructorExceptionSpecChecks.pop_back();
}
}
diff --git a/clang/test/CXX/special/class.dtor/p3-0x.cpp b/clang/test/CXX/special/class.dtor/p3-0x.cpp
index c2d2496beb6..ffac158acb6 100644
--- a/clang/test/CXX/special/class.dtor/p3-0x.cpp
+++ b/clang/test/CXX/special/class.dtor/p3-0x.cpp
@@ -132,6 +132,10 @@ struct VX
struct VY : VX
{ virtual ~VY() {} };
+template<typename T>
+struct TVY : VX
+{ virtual ~TVY() {} };
+
struct VA {
B b;
@@ -140,3 +144,28 @@ struct VA {
struct VB : VA
{ virtual ~VB() {} };
+
+template<typename T>
+struct TVB : VA
+{ virtual ~TVB() {} };
+
+void tinst2() {
+ TVY<int> tvy;
+ TVB<int> tvb;
+}
+
+template <typename T>
+struct Sw {
+ T t;
+ ~Sw() {}
+};
+
+void tsw() {
+ Sw<int> swi;
+ Sw<B> swb;
+}
+// CHECK-NOT: define linkonce_odr void @_ZN2SwI1BED1Ev({{.*}} nounwind
+// CHECK: define linkonce_odr void @_ZN2SwI1BED1Ev({{.*}}
+// CHECK: _ZTIi
+// CHECK: __cxa_call_unexpected
+// CHECK: define linkonce_odr void @_ZN2SwIiED1Ev({{.*}} nounwind
OpenPOWER on IntegriCloud