зеркало из https://github.com/microsoft/clang-1.git
Don't consider all local variables in C++ to mandate scope-checking, just
those with initializers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109964 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
b60a77e453
Коммит
e46f62cbaa
|
@ -2793,8 +2793,7 @@ void Sema::CheckVariableDeclaration(VarDecl *NewVD,
|
|||
|
||||
bool isVM = T->isVariablyModifiedType();
|
||||
if (isVM || NewVD->hasAttr<CleanupAttr>() ||
|
||||
NewVD->hasAttr<BlocksAttr>() ||
|
||||
(LangOpts.CPlusPlus && NewVD->hasLocalStorage()))
|
||||
NewVD->hasAttr<BlocksAttr>())
|
||||
setFunctionHasBranchProtectedScope();
|
||||
|
||||
if ((isVM && NewVD->hasLinkage()) ||
|
||||
|
@ -3934,6 +3933,9 @@ void Sema::AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit) {
|
|||
return;
|
||||
}
|
||||
|
||||
if (getLangOptions().CPlusPlus && VDecl->hasLocalStorage())
|
||||
setFunctionHasBranchProtectedScope();
|
||||
|
||||
// Take ownership of the expression, now that we're sure we have somewhere
|
||||
// to put it.
|
||||
Expr *Init = init.takeAs<Expr>();
|
||||
|
@ -4253,6 +4255,12 @@ void Sema::ActOnUninitializedDecl(DeclPtrTy dcl,
|
|||
// program is ill-formed.
|
||||
// FIXME: DPG thinks it is very fishy that C++0x disables this.
|
||||
} 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())
|
||||
setFunctionHasBranchProtectedScope();
|
||||
|
||||
InitializedEntity Entity = InitializedEntity::InitializeVariable(Var);
|
||||
InitializationKind Kind
|
||||
= InitializationKind::CreateDefault(Var->getLocation());
|
||||
|
|
|
@ -121,3 +121,15 @@ namespace test6 {
|
|||
}
|
||||
}
|
||||
|
||||
// C++0x says it's okay to skip non-trivial initializers on static
|
||||
// locals, and we implement that in '03 as well.
|
||||
namespace test7 {
|
||||
struct C { C(); };
|
||||
|
||||
void test() {
|
||||
goto foo;
|
||||
static C c;
|
||||
foo:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче