summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/ms-integer-static-data-members.cpp
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2013-11-21 00:15:56 +0000
committerHans Wennborg <hans@hanshq.net>2013-11-21 00:15:56 +0000
commitfeedf8515b72343426959fd708460db957c4c285 (patch)
treecc085a9a8288a3f06e59d3a1c80fbc63814620b7 /clang/test/CodeGenCXX/ms-integer-static-data-members.cpp
parent9c9d7d14d1b53d4147d9438ab3bc3f13ce23dd43 (diff)
downloadbcm5719-llvm-feedf8515b72343426959fd708460db957c4c285.tar.gz
bcm5719-llvm-feedf8515b72343426959fd708460db957c4c285.zip
[-cxx-abi microsoft] Emit linkonce_odr definitions for declarations of static data members with inline initializers (PR17689)
This makes Clang emit a linkonce_odr definition for 'val' in the code below, to be compatible with MSVC-compiled code: struct Foo { static const int val = 1; }; Differential Revision: http://llvm-reviews.chandlerc.com/D2233 llvm-svn: 195283
Diffstat (limited to 'clang/test/CodeGenCXX/ms-integer-static-data-members.cpp')
-rw-r--r--clang/test/CodeGenCXX/ms-integer-static-data-members.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/ms-integer-static-data-members.cpp b/clang/test/CodeGenCXX/ms-integer-static-data-members.cpp
new file mode 100644
index 00000000000..00beaa62f19
--- /dev/null
+++ b/clang/test/CodeGenCXX/ms-integer-static-data-members.cpp
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -emit-llvm -cxx-abi microsoft -triple=i386-pc-win32 %s -o - | FileCheck %s
+// RUN: %clang_cc1 -DINLINE_INIT -emit-llvm -cxx-abi microsoft -triple=i386-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK-INLINE
+// RUN: %clang_cc1 -DREAL_DEFINITION -emit-llvm -cxx-abi microsoft -triple=i386-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK-OUTOFLINE
+// RUN: %clang_cc1 -DINLINE_INIT -DREAL_DEFINITION -emit-llvm -cxx-abi microsoft -triple=i386-pc-win32 %s -o - | FileCheck %s --check-prefix=CHECK-INLINE
+
+struct S {
+ // For MS ABI, we emit a linkonce_odr definition here, even though it's really just a declaration.
+#ifdef INLINE_INIT
+ static const int x = 5;
+#else
+ static const int x;
+#endif
+};
+
+const int *f() {
+ return &S::x;
+};
+
+#ifdef REAL_DEFINITION
+#ifdef INLINE_INIT
+const int S::x;
+#else
+const int S::x = 5;
+#endif
+#endif
+
+
+// Inline initialization.
+// CHECK-INLINE: @"\01?x@S@@2HB" = linkonce_odr constant i32 5, align 4
+
+// Out-of-line initialization.
+// CHECK-OUTOFLINE: @"\01?x@S@@2HB" = constant i32 5, align 4
+
+// No initialization.
+// CHECK: @"\01?x@S@@2HB" = external constant i32
OpenPOWER on IntegriCloud