summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorManman Ren <manman.ren@gmail.com>2016-10-13 18:42:14 +0000
committerManman Ren <manman.ren@gmail.com>2016-10-13 18:42:14 +0000
commitaa0178e57a43cd093d5f2b9e8e0bfd99af8c09b1 (patch)
tree0af816472ebff9cf4071ac4c99381145bb2edad8 /clang
parent0b357ed2abd95162787a4cfb16ba1dc3963a6ba2 (diff)
downloadbcm5719-llvm-aa0178e57a43cd093d5f2b9e8e0bfd99af8c09b1.tar.gz
bcm5719-llvm-aa0178e57a43cd093d5f2b9e8e0bfd99af8c09b1.zip
Module: emit initializers for C/ObjC after r276159.
In r276159, we started to defer emitting initializers for VarDecls, but forgot to add the initializers for non-C++ language. rdar://28740482 llvm-svn: 284142
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaDecl.cpp8
-rw-r--r--clang/test/Modules/Inputs/objc-initializer/X.h3
-rw-r--r--clang/test/Modules/Inputs/objc-initializer/module.modulemap4
-rw-r--r--clang/test/Modules/objc-initializer.m9
4 files changed, 23 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 7baa85a6464..f3c85c33771 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -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/clang/test/Modules/Inputs/objc-initializer/X.h b/clang/test/Modules/Inputs/objc-initializer/X.h
new file mode 100644
index 00000000000..e7182a89f6b
--- /dev/null
+++ b/clang/test/Modules/Inputs/objc-initializer/X.h
@@ -0,0 +1,3 @@
+@interface NSString
+@end
+static const NSString * const kSimDeviceIOGetInterface = @"simdeviceio_get_interface";
diff --git a/clang/test/Modules/Inputs/objc-initializer/module.modulemap b/clang/test/Modules/Inputs/objc-initializer/module.modulemap
new file mode 100644
index 00000000000..8fe4c92a173
--- /dev/null
+++ b/clang/test/Modules/Inputs/objc-initializer/module.modulemap
@@ -0,0 +1,4 @@
+module X {
+ header "X.h"
+ export *
+}
diff --git a/clang/test/Modules/objc-initializer.m b/clang/test/Modules/objc-initializer.m
new file mode 100644
index 00000000000..90cc1824717
--- /dev/null
+++ b/clang/test/Modules/objc-initializer.m
@@ -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);
+}
OpenPOWER on IntegriCloud