summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-09-03 18:58:50 +0000
committerJohn McCall <rjmccall@apple.com>2010-09-03 18:58:50 +0000
commit9c20fa9d46645480872f239a2fc631996ba7dc23 (patch)
treed59f497820d5aab333db66e2efb44968f96935b0
parentaaa80b208de3e2c706badf45060bd126fa747b84 (diff)
A constant initializer never matches the type of the variable it's
initializing; it at best matches the element type of the variable it's initializing. Fixes PR8073. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112992 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/CodeGen/CGDecl.cpp2
-rw-r--r--test/CodeGen/const-init.c7
2 files changed, 7 insertions, 2 deletions
diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp
index 8ce196b64e..5017ce720c 100644
--- a/lib/CodeGen/CGDecl.cpp
+++ b/lib/CodeGen/CGDecl.cpp
@@ -203,7 +203,7 @@ CodeGenFunction::AddInitializerToGlobalBlockVarDecl(const VarDecl &D,
// the global to match the initializer. (We have to do this
// because some types, like unions, can't be completely represented
// in the LLVM type system.)
- if (GV->getType() != Init->getType()) {
+ if (GV->getType()->getElementType() != Init->getType()) {
llvm::GlobalVariable *OldGV = GV;
GV = new llvm::GlobalVariable(CGM.getModule(), Init->getType(),
diff --git a/test/CodeGen/const-init.c b/test/CodeGen/const-init.c
index c7a53be02c..ac26b65e68 100644
--- a/test/CodeGen/const-init.c
+++ b/test/CodeGen/const-init.c
@@ -117,9 +117,14 @@ struct g22 {int x;} __attribute((packed));
struct g23 {char a; short b; char c; struct g22 d;};
struct g23 g24 = {1,2,3,4};
-// CHECK: @__func__.g25 = private constant [4 x i8] c"g25\00"
// CHECK: @g25.g26 = internal global i8* getelementptr inbounds ([4 x i8]* @__func__.g25, i32 0, i32 0)
+// CHECK: @__func__.g25 = private constant [4 x i8] c"g25\00"
int g25() {
static const char *g26 = __func__;
return *g26;
}
+
+// CHECK: @g27.x = internal global i8* bitcast (i8** @g27.x to i8*), align 4
+void g27() { // PR8073
+ static void *x = &x;
+}