diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-05-26 21:45:50 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-05-26 21:45:50 +0000 |
commit | 4c464b9702af8ec5e76d5eb184e76df1d40c23ec (patch) | |
tree | b7f8a1d2f3432922eee057be149b02d36d6a1d46 | |
parent | f0af777aff72b58333edcf258e30998e865bdef3 (diff) |
Patch to fix a irgen crash accessing an initialized local static
variable in a local function. Fixes pr7101.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104743 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGDecl.cpp | 5 | ||||
-rw-r--r-- | test/CodeGenCXX/static-local-in-local-class.cpp | 12 |
2 files changed, 15 insertions, 2 deletions
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 8115e384db..07edca0f5f 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -239,8 +239,6 @@ void CodeGenFunction::EmitStaticBlockVarDecl(const VarDecl &D, // Store into LocalDeclMap before generating initializer to handle // circular references. DMEntry = GV; - if (getContext().getLangOptions().CPlusPlus) - CGM.setStaticLocalDeclAddress(&D, GV); // We can't have a VLA here, but we can have a pointer to a VLA, // even though that doesn't really make any sense. @@ -269,6 +267,9 @@ void CodeGenFunction::EmitStaticBlockVarDecl(const VarDecl &D, if (D.hasAttr<UsedAttr>()) CGM.AddUsedGlobal(GV); + if (getContext().getLangOptions().CPlusPlus) + CGM.setStaticLocalDeclAddress(&D, GV); + // We may have to cast the constant because of the initializer // mismatch above. // diff --git a/test/CodeGenCXX/static-local-in-local-class.cpp b/test/CodeGenCXX/static-local-in-local-class.cpp index d9e044ce9d..ebf560ab98 100644 --- a/test/CodeGenCXX/static-local-in-local-class.cpp +++ b/test/CodeGenCXX/static-local-in-local-class.cpp @@ -19,3 +19,15 @@ void X::f() { } (void)i; } + +// pr7101 +void foo() { + static int n = 0; + struct Helper { + static void Execute() { + n++; + } + }; + Helper::Execute(); +} + |