<div dir="ltr">Hello David,<br><br>This commit broke the test on the builder:<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/17793">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/17793</a><br>Please have a look?<br>. . .<br>Failing Tests (1):<br>    Clang :: Modules/enum-codegen.cpp<br><br>The builder was already red and did not send any notifications.<br><br>Thanks<br><br>Galina</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, May 22, 2019 at 1:33 PM David Blaikie via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: dblaikie<br>
Date: Wed May 22 13:36:06 2019<br>
New Revision: 361428<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=361428&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=361428&view=rev</a><br>
Log:<br>
Modules: Code generation of enum constants for merged enum definitions<br>
<br>
Found in a bootstrap of LLVM with implicit modules, resulting in a<br>
deadlock of some Orc unit tests with libstdc++ 8.1. An enum was used as<br>
part of the implementation of std::recursive_mutex and this bug resulted<br>
in the constant initialization of zero instead of the desired non-zero<br>
value. => Badness.<br>
<br>
Richard Smith tells me neither of these fields are necessarily canonical<br>
& so using declaresSamEntity is the right solution here (rather than<br>
changing both of these Fields to be canonical by construction/from their<br>
source)<br>
<br>
Added:<br>
    cfe/trunk/test/Modules/enum-codegen.cpp<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGExprConstant.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=361428&r1=361427&r2=361428&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=361428&r1=361427&r2=361428&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Wed May 22 13:36:06 2019<br>
@@ -476,7 +476,7 @@ bool ConstStructBuilder::Build(const APV<br>
   for (RecordDecl::field_iterator Field = RD->field_begin(),<br>
        FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {<br>
     // If this is a union, skip all the fields that aren't being initialized.<br>
-    if (RD->isUnion() && Val.getUnionField() != *Field)<br>
+    if (RD->isUnion() && !declaresSameEntity(Val.getUnionField(), *Field))<br>
       continue;<br>
<br>
     // Don't emit anonymous bitfields, they just affect layout.<br>
<br>
Added: cfe/trunk/test/Modules/enum-codegen.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/enum-codegen.cpp?rev=361428&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/enum-codegen.cpp?rev=361428&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Modules/enum-codegen.cpp (added)<br>
+++ cfe/trunk/test/Modules/enum-codegen.cpp Wed May 22 13:36:06 2019<br>
@@ -0,0 +1,36 @@<br>
+// RUN: rm -rf %t<br>
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t %s -emit-llvm -o - | FileCheck %s<br>
+<br>
+// CHECK: @_Z3varIiE = {{.*}} %union.union_type { i8 1 },<br>
+<br>
+#pragma clang module build bar<br>
+module bar {<br>
+  header "bar.h" { size 40 mtime 0 }<br>
+  export *<br>
+}<br>
+#pragma clang module contents<br>
+#pragma clang module begin bar<br>
+union union_type {<br>
+  char h{1};<br>
+};<br>
+#pragma clang module end<br>
+#pragma clang module endbuild<br>
+#pragma clang module build foo<br>
+module foo {<br>
+  header "foo.h" { size 97 mtime 0 }<br>
+  export *<br>
+}<br>
+#pragma clang module contents<br>
+#pragma clang module begin foo<br>
+union union_type {<br>
+  char h{1};<br>
+};<br>
+#pragma clang module import bar<br>
+template<typename T><br>
+union_type var;<br>
+#pragma clang module end<br>
+#pragma clang module endbuild<br>
+#pragma clang module import foo<br>
+int main() {<br>
+  (void)&var<int>;<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>