summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
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/lib/CodeGen
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/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGExprConstant.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp
index caa327c19a4..c8dd236e957 100644
--- a/clang/lib/CodeGen/CGExprConstant.cpp
+++ b/clang/lib/CodeGen/CGExprConstant.cpp
@@ -476,7 +476,7 @@ bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
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.
OpenPOWER on IntegriCloud