From 275a55cb5a622491269bf89ba717d73766acaac6 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Wed, 22 May 2019 20:36:06 +0000 Subject: 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 --- clang/test/Modules/enum-codegen.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 clang/test/Modules/enum-codegen.cpp (limited to 'clang/test/Modules/enum-codegen.cpp') 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 +union_type var; +#pragma clang module end +#pragma clang module endbuild +#pragma clang module import foo +int main() { + (void)&var; +} -- cgit v1.2.3