]> granicus.if.org Git - clang/commitdiff
If a global variable has an initializer with side effects, it can never be deferred...
authorAnders Carlsson <andersca@mac.com>
Tue, 26 Jan 2010 06:15:16 +0000 (06:15 +0000)
committerAnders Carlsson <andersca@mac.com>
Tue, 26 Jan 2010 06:15:16 +0000 (06:15 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94525 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp
test/CodeGenCXX/anonymous-namespaces.cpp

index cf504a7c2a0cc7997d1c564e8b1be6e917bcdbc8..65b29313c60fc38a613513d94bfeb84541374d33 100644 (file)
@@ -580,9 +580,8 @@ bool CodeGenModule::MayDeferGeneration(const ValueDecl *Global) {
       
   // Static data may be deferred, but out-of-line static data members
   // cannot be.
-  if (VD->isInAnonymousNamespace())
-    return true;
-  if (VD->getLinkage() == VarDecl::InternalLinkage) {
+  if (VD->getLinkage() == VarDecl::InternalLinkage ||
+      VD->isInAnonymousNamespace()) {
     // Initializer has side effects?
     if (VD->getInit() && VD->getInit()->HasSideEffects(Context))
       return false;
index 7689c941e10352ad823755c01b9b7888190e92d9..695f8f59defc93893d58e74e7e0969a3da15e4fe 100644 (file)
@@ -1,9 +1,25 @@
 // RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s
 
+
+int f();
+
 namespace {
+  // CHECK: @_ZN12_GLOBAL__N_11bE = internal global i32 0
+  // CHECK: @_ZN12_GLOBAL__N_1L1cE = internal global i32 0
+  // CHECK: @_ZN12_GLOBAL__N_11D1dE = internal global i32 0
   // CHECK: @_ZN12_GLOBAL__N_11aE = internal global i32 0
   int a = 0;
 
+  int b = f();
+
+  static int c = f();
+
+  class D {
+    static int d;
+  };
+  
+  int D::d = f();
+
   // CHECK: define internal i32 @_ZN12_GLOBAL__N_13fooEv()
   int foo() {
     return 32;