summaryrefslogtreecommitdiffstats
path: root/clang/test/Modules/enum-codegen.cpp
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2019-05-22 20:36:06 +0000
committerDavid Blaikie <dblaikie@gmail.com>2019-05-22 20:36:06 +0000
commit275a55cb5a622491269bf89ba717d73766acaac6 (patch)
tree98a4bed02f4463352e2b5f09d3e89b69e8348e3c /clang/test/Modules/enum-codegen.cpp
parent9e0edce56427db0b019c56059af6dcc045f2af4f (diff)
downloadbcm5719-llvm-275a55cb5a622491269bf89ba717d73766acaac6.tar.gz
bcm5719-llvm-275a55cb5a622491269bf89ba717d73766acaac6.zip
Modules: Code generation of enum constants for merged enum definitions
Found in a bootstrap of LLVM with implicit modules, resulting in a deadlock of some Orc unit tests with libstdc++ 8.1. An enum was used as part of the implementation of std::recursive_mutex and this bug resulted in the constant initialization of zero instead of the desired non-zero value. => Badness. Richard Smith tells me neither of these fields are necessarily canonical & so using declaresSamEntity is the right solution here (rather than changing both of these Fields to be canonical by construction/from their source) llvm-svn: 361428
Diffstat (limited to 'clang/test/Modules/enum-codegen.cpp')
-rw-r--r--clang/test/Modules/enum-codegen.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/clang/test/Modules/enum-codegen.cpp b/clang/test/Modules/enum-codegen.cpp
new file mode 100644
index 00000000000..87c1c5a9d47
--- /dev/null
+++ b/clang/test/Modules/enum-codegen.cpp
@@ -0,0 +1,36 @@
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t %s -emit-llvm -o - | FileCheck %s
+
+// CHECK: @_Z3varIiE = {{.*}} %union.union_type { i8 1 },
+
+#pragma clang module build bar
+module bar {
+ header "bar.h" { size 40 mtime 0 }
+ export *
+}
+#pragma clang module contents
+#pragma clang module begin bar
+union union_type {
+ char h{1};
+};
+#pragma clang module end
+#pragma clang module endbuild
+#pragma clang module build foo
+module foo {
+ header "foo.h" { size 97 mtime 0 }
+ export *
+}
+#pragma clang module contents
+#pragma clang module begin foo
+union union_type {
+ char h{1};
+};
+#pragma clang module import bar
+template<typename T>
+union_type var;
+#pragma clang module end
+#pragma clang module endbuild
+#pragma clang module import foo
+int main() {
+ (void)&var<int>;
+}
OpenPOWER on IntegriCloud