From: Alexey Bataev Date: Thu, 7 May 2015 06:28:46 +0000 (+0000) Subject: Fix for http://llvm.org/PR23392: magick/feature.c from ImageMagick-6.9.1-2 ICEs. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f681a19b9cee2d6c1db6ef3d8155077562988dd4;p=clang Fix for http://llvm.org/PR23392: magick/feature.c from ImageMagick-6.9.1-2 ICEs. Fix for codegen of static variables declared inside of captured statements. Captured statements are actually a transparent DeclContexts, so we have to skip them when trying to get a mangled name for statics. Differential Revision: http://reviews.llvm.org/D9522 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236701 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 874cf69380..fdbf1f62d7 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -156,6 +156,8 @@ static std::string getStaticDeclName(CodeGenModule &CGM, const VarDecl &D) { assert(!D.isExternallyVisible() && "name shouldn't matter"); std::string ContextName; const DeclContext *DC = D.getDeclContext(); + if (auto *CD = dyn_cast(DC)) + DC = cast(CD->getNonClosureContext()); if (const auto *FD = dyn_cast(DC)) ContextName = CGM.getMangledName(FD); else if (const auto *BD = dyn_cast(DC)) diff --git a/test/CodeGen/captured-statements.c b/test/CodeGen/captured-statements.c index 64af3c0604..53861097d7 100644 --- a/test/CodeGen/captured-statements.c +++ b/test/CodeGen/captured-statements.c @@ -14,9 +14,12 @@ void test1() { int i = 0; #pragma clang __debug captured { + static float inner = 3.0; + (void)inner; i++; } // CHECK-1: %struct.anon = type { i32* } + // CHECK-1: {{.+}} global float 3.0 // // CHECK-1: test1 // CHECK-1: alloca %struct.anon diff --git a/test/CodeGenCXX/captured-statements.cpp b/test/CodeGenCXX/captured-statements.cpp index 56fe4c61c9..058e737893 100644 --- a/test/CodeGenCXX/captured-statements.cpp +++ b/test/CodeGenCXX/captured-statements.cpp @@ -21,6 +21,8 @@ struct TestClass { Foo f; #pragma clang __debug captured { + static double inner = x; + (void)inner; f.y = x; } } @@ -29,22 +31,26 @@ struct TestClass { void test1() { TestClass c; c.MemberFunc(); - // CHECK-1: %[[Capture:struct\.anon[\.0-9]*]] = type { %struct.Foo*, %struct.TestClass* } + // CHECK-1: %[[Capture:struct\.anon[\.0-9]*]] = type { %struct.TestClass*, %struct.Foo* } + // CHECK-1: [[INNER:@.+]] = {{.+}} global double // CHECK-1: define {{.*}} void @_ZN9TestClass10MemberFuncEv // CHECK-1: alloca %struct.anon // CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* %{{[^,]*}}, i32 0, i32 0 - // CHECK-1: store %struct.Foo* %f, %struct.Foo** // CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* %{{[^,]*}}, i32 0, i32 1 + // CHECK-1: store %struct.Foo* %f, %struct.Foo** // CHECK-1: call void @[[HelperName:[A-Za-z0-9_]+]](%[[Capture]]* // CHECK-1: call {{.*}}FooD1Ev // CHECK-1: ret } // CHECK-1: define internal void @[[HelperName]] -// CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* {{[^,]*}}, i32 0, i32 1 -// CHECK-1: getelementptr inbounds %struct.TestClass, %struct.TestClass* {{[^,]*}}, i32 0, i32 0 // CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* {{[^,]*}}, i32 0, i32 0 +// CHECK-1: call i32 @__cxa_guard_acquire( +// CHECK-1: store double %{{.+}}, double* [[INNER]], +// CHECK-1: call void @__cxa_guard_release( +// CHECK-1: getelementptr inbounds %struct.TestClass, %struct.TestClass* {{[^,]*}}, i32 0, i32 0 +// CHECK-1: getelementptr inbounds %[[Capture]], %[[Capture]]* {{[^,]*}}, i32 0, i32 1 void test2(int x) { int y = [&]() {