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.

llvm-svn: 231054
This commit is contained in:
David Majnemer 2015-03-03 04:38:34 +00:00
parent a3ef8cad11
commit fba75df599
2 changed files with 21 additions and 2 deletions

View File

@ -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);

View File

@ -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}}
}
}
}