From 3bb92693c3332c1e99870a4e45afff3892e1c6ae Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Tue, 26 Jan 2010 17:43:42 +0000 Subject: [PATCH] Use the right definition when emitting a global variable. Fixes PR5564. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94555 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Decl.h | 5 +++++ lib/CodeGen/CodeGenModule.cpp | 8 +++++--- test/CodeGenCXX/static-data-member.cpp | 10 ++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/include/clang/AST/Decl.h b/include/clang/AST/Decl.h index 6d52b2b2bc..5416c65306 100644 --- a/include/clang/AST/Decl.h +++ b/include/clang/AST/Decl.h @@ -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; diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 4eb8bd8d9f..ebd3df1cf9 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -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); diff --git a/test/CodeGenCXX/static-data-member.cpp b/test/CodeGenCXX/static-data-member.cpp index 53a1d5e4c4..b3a2af2aaf 100644 --- a/test/CodeGenCXX/static-data-member.cpp +++ b/test/CodeGenCXX/static-data-member.cpp @@ -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; }; -- 2.50.1