From: Sean Hunt Date: Wed, 11 May 2011 22:50:12 +0000 (+0000) Subject: Commit some missing changes to the previous patch. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a6bff2caf90d769e0b6bfe59c3e7f16ef8402e5a;p=clang Commit some missing changes to the previous patch. This means we get C++0x jump-across-intializer semantics correct. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131204 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 44e47ea8d8..6fafdbed69 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -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(Record->getDecl()); + if (!getLangOptions().CPlusPlus0x || + !CXXRecord->hasTrivialDefaultConstructor() || + !CXXRecord->hasTrivialDestructor()) + getCurFunction()->setHasBranchProtectedScope(); + } InitializedEntity Entity = InitializedEntity::InitializeVariable(Var); InitializationKind Kind diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index bd16cda9f1..b00d73d93c 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -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; } }