diff options
author | John McCall <rjmccall@apple.com> | 2010-09-03 18:58:50 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-09-03 18:58:50 +0000 |
commit | 9c20fa9d46645480872f239a2fc631996ba7dc23 (patch) | |
tree | d59f497820d5aab333db66e2efb44968f96935b0 | |
parent | aaa80b208de3e2c706badf45060bd126fa747b84 (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.cpp | 2 | ||||
-rw-r--r-- | test/CodeGen/const-init.c | 7 |
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; +} |