Author: dblaikie Date: Wed May 22 13:36:06 2019 New Revision: 361428 URL: http://llvm.org/viewvc/llvm-project?rev=361428&view=rev Log: 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) Added: cfe/trunk/test/Modules/enum-codegen.cpp Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=361428&r1=361427&r2=361428&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Wed May 22 13:36:06 2019 @@ -476,7 +476,7 @@ bool ConstStructBuilder::Build(const APV for (RecordDecl::field_iterator Field = RD->field_begin(), FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) { // If this is a union, skip all the fields that aren't being initialized. - if (RD->isUnion() && Val.getUnionField() != *Field) + if (RD->isUnion() && !declaresSameEntity(Val.getUnionField(), *Field)) continue; // Don't emit anonymous bitfields, they just affect layout. Added: cfe/trunk/test/Modules/enum-codegen.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/enum-codegen.cpp?rev=361428&view=auto ============================================================================== --- cfe/trunk/test/Modules/enum-codegen.cpp (added) +++ cfe/trunk/test/Modules/enum-codegen.cpp Wed May 22 13:36:06 2019 @@ -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>; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits