From: David Majnemer Date: Tue, 3 Mar 2015 04:38:34 +0000 (+0000) Subject: Sema: Caught exception objects should be unqualified X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=26405073dba71fe1359f1a2de3618cc54dc49b59;p=clang Sema: Caught exception objects should be unqualified The exception object should be unqualified. Using a qualified exception object results in the wrong copy constructor getting called when the catch handler executes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@231054 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index c78f214fbc..4b635c0ed7 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -11933,7 +11933,7 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S, // // We just pretend to initialize the object with itself, then make sure // it can be destroyed later. - QualType initType = ExDeclType; + QualType initType = Context.getExceptionObjectType(ExDeclType); InitializedEntity entity = InitializedEntity::InitializeVariable(ExDecl); diff --git a/test/SemaCXX/exceptions.cpp b/test/SemaCXX/exceptions.cpp index 5f4ff23eb7..6ac51b32e4 100644 --- a/test/SemaCXX/exceptions.cpp +++ b/test/SemaCXX/exceptions.cpp @@ -146,7 +146,7 @@ namespace Decay { void rval_ref() throw (int &&); // expected-error {{rvalue reference type 'int &&' is not allowed in exception specification}} expected-warning {{C++11}} -namespace ConstVolatile { +namespace ConstVolatileThrow { struct S { S() {} // expected-note{{candidate constructor not viable}} S(const S &s); // expected-note{{candidate constructor not viable}} @@ -158,3 +158,22 @@ void f() { throw CVS(); // expected-error{{no matching constructor for initialization}} } } + +namespace ConstVolatileCatch { +struct S { + S() {} + S(const volatile S &s); + +private: + S(const S &s); // expected-note {{declared private here}} +}; + +void f(); + +void g() { + try { + f(); + } catch (volatile S s) { // expected-error {{calling a private constructor}} + } +} +}