diff options
| author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2011-05-19 16:25:27 +0000 |
|---|---|---|
| committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2011-05-19 16:25:27 +0000 |
| commit | 8035d1c435e7df31f1497c23cd99d5982ec1a84d (patch) | |
| tree | b4cb952a29c9e585d812e291ab7c1624bffa75ef | |
| parent | ec0810e1c8e690ebbf571670820392d52fb23b75 (diff) | |
| download | bcm5719-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.cpp | 6 | ||||
| -rw-r--r-- | clang/test/CXX/special/class.dtor/p3-0x.cpp | 29 |
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 |

