]> granicus.if.org Git - clang/commitdiff
Module: emit initializers for C/ObjC after r276159.
authorManman Ren <manman.ren@gmail.com>
Thu, 13 Oct 2016 18:42:14 +0000 (18:42 +0000)
committerManman Ren <manman.ren@gmail.com>
Thu, 13 Oct 2016 18:42:14 +0000 (18:42 +0000)
In r276159, we started to defer emitting initializers for VarDecls, but
forgot to add the initializers for non-C++ language.

rdar://28740482

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@284142 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/Modules/Inputs/objc-initializer/X.h [new file with mode: 0644]
test/Modules/Inputs/objc-initializer/module.modulemap [new file with mode: 0644]
test/Modules/objc-initializer.m [new file with mode: 0644]

index 7baa85a6464cab467631fd1dc6f04df2be2ceeb0..f3c85c3377178b739f82f23f7ee67a1011172fb6 100644 (file)
@@ -10511,7 +10511,13 @@ void Sema::CheckCompleteVariableDeclaration(VarDecl *var) {
   }
 
   // All the following checks are C++ only.
-  if (!getLangOpts().CPlusPlus) return;
+  if (!getLangOpts().CPlusPlus) {
+      // If this variable must be emitted, add it as an initializer for the
+      // current module.
+     if (Context.DeclMustBeEmitted(var) && !ModuleScopes.empty())
+       Context.addModuleInitializer(ModuleScopes.back().Module, var);
+     return;
+  }
 
   if (auto *DD = dyn_cast<DecompositionDecl>(var))
     CheckCompleteDecompositionDeclaration(DD);
diff --git a/test/Modules/Inputs/objc-initializer/X.h b/test/Modules/Inputs/objc-initializer/X.h
new file mode 100644 (file)
index 0000000..e7182a8
--- /dev/null
@@ -0,0 +1,3 @@
+@interface NSString
+@end
+static const NSString * const kSimDeviceIOGetInterface = @"simdeviceio_get_interface";
diff --git a/test/Modules/Inputs/objc-initializer/module.modulemap b/test/Modules/Inputs/objc-initializer/module.modulemap
new file mode 100644 (file)
index 0000000..8fe4c92
--- /dev/null
@@ -0,0 +1,4 @@
+module X {
+  header "X.h"
+  export *
+}
diff --git a/test/Modules/objc-initializer.m b/test/Modules/objc-initializer.m
new file mode 100644 (file)
index 0000000..90cc182
--- /dev/null
@@ -0,0 +1,9 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules-cache-path=%t -fmodules -fimplicit-module-maps -I %S/Inputs/objc-initializer %s -emit-llvm -o - -fobjc-arc | FileCheck %s
+// CHECK: kSimDeviceIOGetInterface = internal constant {{.*}} bitcast
+
+#import <X.h>
+void test2(const NSString*);
+void test() {
+  test2(kSimDeviceIOGetInterface);
+}