]> granicus.if.org Git - clang/commitdiff
Use the right definition when emitting a global variable. Fixes PR5564.
authorAnders Carlsson <andersca@mac.com>
Tue, 26 Jan 2010 17:43:42 +0000 (17:43 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 26 Jan 2010 17:43:42 +0000 (17:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94555 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Decl.h
lib/CodeGen/CodeGenModule.cpp
test/CodeGenCXX/static-data-member.cpp

index 6d52b2b2bc9172b54d877f581c12c6c53cbb4611..5416c65306da90d43d67c63769af16dd7fd658ff 100644 (file)
@@ -620,6 +620,11 @@ public:
   /// initializer.
   const Expr *getDefinition(const VarDecl *&Def) const;
 
+  const Expr *getDefinition() const {
+    const VarDecl* Definition;
+    return getDefinition(Definition);
+  }
+  
   void setThreadSpecified(bool T) { ThreadSpecified = T; }
   bool isThreadSpecified() const {
     return ThreadSpecified;
index 4eb8bd8d9ffff69f3de319910ba6fba3f828628c..ebd3df1cf93e26b199df81031760b092ac4725e4 100644 (file)
@@ -979,7 +979,9 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
   QualType ASTTy = D->getType();
   bool NonConstInit = false;
 
-  if (D->getInit() == 0) {
+  const Expr *InitExpr = D->getDefinition();
+  
+  if (!InitExpr) {
     // This is a tentative definition; tentative definitions are
     // implicitly initialized with { 0 }.
     //
@@ -992,10 +994,10 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
     assert(!ASTTy->isIncompleteType() && "Unexpected incomplete type");
     Init = EmitNullConstant(D->getType());
   } else {
-    Init = EmitConstantExpr(D->getInit(), D->getType());
+    Init = EmitConstantExpr(InitExpr, D->getType());
 
     if (!Init) {
-      QualType T = D->getInit()->getType();
+      QualType T = InitExpr->getType();
       if (getLangOptions().CPlusPlus) {
         EmitCXXGlobalVarDeclInitFunc(D);
         Init = EmitNullConstant(T);
index 53a1d5e4c4504d3678164b4bc8d7b23b110ee453..b3a2af2aafe32c847e43f28380244491484bf3ab 100644 (file)
@@ -1,4 +1,14 @@
 // RUN: %clang_cc1 -emit-llvm -o - %s
+
+// CHECK: @_ZN1A1aE = constant i32 10
+
+// PR5564.
+struct A {
+  static const int a = 10;
+};
+
+const int A::a;
+
 struct S { 
   static int i;
 };