diff options
| author | David Blaikie <dblaikie@gmail.com> | 2019-05-22 20:36:06 +0000 |
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2019-05-22 20:36:06 +0000 |
| commit | 275a55cb5a622491269bf89ba717d73766acaac6 (patch) | |
| tree | 98a4bed02f4463352e2b5f09d3e89b69e8348e3c /clang/test/Modules/enum-codegen.cpp | |
| parent | 9e0edce56427db0b019c56059af6dcc045f2af4f (diff) | |
| download | bcm5719-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.cpp | 36 |
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>; +} |

