Properly implement C++0x [stmt.dcl]p3, which requires a scope to be

protected in the case where a variable is being initialized by a
trivial default constructor but has a non-trivial destructor.

llvm-svn: 133037
This commit is contained in:
Douglas Gregor 2011-06-15 03:23:34 +00:00
parent 0870debb8b
commit 1778b030c0
3 changed files with 9 additions and 4 deletions

View File

@ -2421,6 +2421,8 @@ def err_indirect_goto_in_protected_scope : Error<
def note_indirect_goto_target : Note<"possible target of indirect goto">;
def note_protected_by_variable_init : Note<
"jump bypasses variable initialization">;
def note_protected_by_variable_nontriv_destructor : Note<
"jump bypasses variable with a non-trivial destructor">;
def note_protected_by_cleanup : Note<
"jump bypasses initialization of variable with __attribute__((cleanup))">;
def note_protected_by_vla_typedef : Note<

View File

@ -157,6 +157,9 @@ static std::pair<unsigned,unsigned>
: Record->isPOD()) &&
Constructor->isDefaultConstructor())
CallsTrivialConstructor = true;
if (CallsTrivialConstructor && !Record->hasTrivialDestructor())
InDiag = diag::note_protected_by_variable_nontriv_destructor;
}
if (!CallsTrivialConstructor)

View File

@ -30,13 +30,13 @@ struct Y {
void f();
void test_Y() {
goto end;
Y y;
goto end; // expected-error{{goto into protected scope}}
Y y; // expected-note{{jump bypasses variable with a non-trivial destructor}}
end:
f();
goto inner;
goto inner; // expected-error{{goto into protected scope}}
{
Y y2;
Y y2; // expected-note{{jump bypasses variable with a non-trivial destructor}}
inner:
f();
}