From 9c20fa9d46645480872f239a2fc631996ba7dc23 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 3 Sep 2010 18:58:50 +0000 Subject: 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 --- lib/CodeGen/CGDecl.cpp | 2 +- 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; +} -- cgit v1.2.3