Commit some missing changes to the previous patch.

This means we get C++0x jump-across-intializer semantics correct.

llvm-svn: 131204
This commit is contained in:
Alexis Hunt 2011-05-11 22:50:12 +00:00
parent ea6f0320f0
commit 466627ca2e
2 changed files with 16 additions and 4 deletions

View File

@ -5657,13 +5657,25 @@ void Sema::ActOnUninitializedDecl(Decl *RealDecl,
// program is ill-formed.
// C++0x [dcl.init]p11:
// If no initializer is specified for an object, the object is
// default-intiialized; [...].
// default-intialized; [...].
} else {
// Check for jumps past the implicit initializer. C++0x
// clarifies that this applies to a "variable with automatic
// storage duration", not a "local variable".
if (getLangOptions().CPlusPlus && Var->hasLocalStorage())
getCurFunction()->setHasBranchProtectedScope();
// C++0x [stmt.dcl]p3
// A program that jumps from a point where a variable with automatic
// storage duration is not ins cope to a point where it is in scope is
// ill-formed unless the variable has scalar type, class type with a
// trivial defautl constructor and a trivial destructor, a cv-qualified
// version of one of these types, or an array of one of the preceding
// types and is declared without an initializer.
if (getLangOptions().CPlusPlus && Var->hasLocalStorage() && Record) {
CXXRecordDecl *CXXRecord = cast<CXXRecordDecl>(Record->getDecl());
if (!getLangOptions().CPlusPlus0x ||
!CXXRecord->hasTrivialDefaultConstructor() ||
!CXXRecord->hasTrivialDestructor())
getCurFunction()->setHasBranchProtectedScope();
}
InitializedEntity Entity = InitializedEntity::InitializeVariable(Var);
InitializationKind Kind

View File

@ -3210,7 +3210,7 @@ bool Sema::ShouldDeleteDefaultConstructor(CXXConstructorDecl *CD) {
return true;
// Don't try to initialize the anonymous union
// This is technically non-conformant, but sanity deamands it.
// This is technically non-conformant, but sanity demands it.
continue;
}
}