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.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133037 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Douglas Gregor 2011-06-15 03:23:34 +00:00
Родитель cf739927f9
Коммит 1454cb952b
3 изменённых файлов: 9 добавлений и 4 удалений

Просмотреть файл

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

Просмотреть файл

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

Просмотреть файл

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