<div dir="ltr">Should be fixed in r336013. Thanks for pointing this out.<br></div><br><div class="gmail_quote"><div dir="ltr">On Fri, 29 Jun 2018 at 11:24, Galina Kistanova 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello Richard,<br><br>This commit broke tests at one of our builders:<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/10599" target="_blank">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/10599</a><br><br>Failing Tests (1):<br>    Clang :: CXX/conv/conv.prom/p5.cpp<br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jun 28, 2018 at 2:17 PM, Richard Smith via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Thu Jun 28 14:17:55 2018<br>
New Revision: 335925<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=335925&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=335925&view=rev</a><br>
Log:<br>
PR37979: integral promotions in C++ treat enum bit-fields like enums,<br>
not like bit-fields.<br>
<br>
We used to get this right "by accident", because conversions for the<br>
selected built-in overloaded operator would convert the enum bit-field<br>
to its corresponding underlying type early. But after DR1687 that no<br>
longer happens.<br>
<br>
Technically this change should also apply to C, where bit-fields only<br>
have special promotion rules if the bit-field's declared type is<br>
_Bool, int, signed int, or unsigned int, but for GCC compatibility we<br>
only look at the bit-width and not the underlying type when performing<br>
bit-field integral promotions in C.<br>
<br>
Added:<br>
    cfe/trunk/test/CXX/conv/conv.prom/p5.cpp<br>
Modified:<br>
    cfe/trunk/lib/AST/ASTContext.cpp<br>
    cfe/trunk/lib/Sema/SemaOverload.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/ASTContext.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=335925&r1=335924&r2=335925&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=335925&r1=335924&r2=335925&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/AST/ASTContext.cpp (original)<br>
+++ cfe/trunk/lib/AST/ASTContext.cpp Thu Jun 28 14:17:55 2018<br>
@@ -5456,6 +5456,12 @@ QualType ASTContext::isPromotableBitFiel<br>
   if (E->isTypeDependent() || E->isValueDependent())<br>
     return {};<br>
<br>
+  // C++ [conv.prom]p5:<br>
+  //    If the bit-field has an enumerated type, it is treated as any other<br>
+  //    value of that type for promotion purposes.<br>
+  if (getLangOpts().CPlusPlus && E->getType()->isEnumeralType())<br>
+    return {};<br>
+<br>
   // FIXME: We should not do this unless E->refersToBitField() is true. This<br>
   // matters in C where getSourceBitField() will find bit-fields for various<br>
   // cases where the source expression is not a bit-field designator.<br>
@@ -5482,13 +5488,15 @@ QualType ASTContext::isPromotableBitFiel<br>
   //<br>
   // FIXME: C does not permit promotion of a 'long : 3' bitfield to int.<br>
   //        We perform that promotion here to match GCC and C++.<br>
+  // FIXME: C does not permit promotion of an enum bit-field whose rank is<br>
+  //        greater than that of 'int'. We perform that promotion to match GCC.<br>
   if (BitWidth < IntSize)<br>
     return IntTy;<br>
<br>
   if (BitWidth == IntSize)<br>
     return FT->isSignedIntegerType() ? IntTy : UnsignedIntTy;<br>
<br>
-  // Types bigger than int are not subject to promotions, and therefore act<br>
+  // Bit-fields wider than int are not subject to promotions, and therefore act<br>
   // like the base type. GCC has some weird bugs in this area that we<br>
   // deliberately do not follow (GCC follows a pre-standard resolution to<br>
   // C's DR315 which treats bit-width as being part of the type, and this leaks<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaOverload.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=335925&r1=335924&r2=335925&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOverload.cpp?rev=335925&r1=335924&r2=335925&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaOverload.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaOverload.cpp Thu Jun 28 14:17:55 2018<br>
@@ -2007,6 +2007,14 @@ bool Sema::IsIntegralPromotion(Expr *Fro<br>
         isCompleteType(From->getLocStart(), FromType))<br>
       return Context.hasSameUnqualifiedType(<br>
           ToType, FromEnumType->getDecl()->getPromotionType());<br>
+<br>
+    // C++ [conv.prom]p5:<br>
+    //   If the bit-field has an enumerated type, it is treated as any other<br>
+    //   value of that type for promotion purposes.<br>
+    //<br>
+    // ... so do not fall through into the bit-field checks below in C++.<br>
+    if (getLangOpts().CPlusPlus)<br>
+      return false;<br>
   }<br>
<br>
   // C++0x [conv.prom]p2:<br>
@@ -2054,6 +2062,11 @@ bool Sema::IsIntegralPromotion(Expr *Fro<br>
   // other value of that type for promotion purposes (C++ 4.5p3).<br>
   // FIXME: We should delay checking of bit-fields until we actually perform the<br>
   // conversion.<br>
+  //<br>
+  // FIXME: In C, only bit-fields of types _Bool, int, or unsigned int may be<br>
+  // promoted, per C11 <a href="http://6.3.1.1/2" rel="noreferrer" target="_blank">6.3.1.1/2</a>. We promote all bit-fields (including enum<br>
+  // bit-fields and those whose underlying type is larger than int) for GCC<br>
+  // compatibility.<br>
   if (From) {<br>
     if (FieldDecl *MemberDecl = From->getSourceBitField()) {<br>
       llvm::APSInt BitWidth;<br>
<br>
Added: cfe/trunk/test/CXX/conv/conv.prom/p5.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/conv/conv.prom/p5.cpp?rev=335925&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/conv/conv.prom/p5.cpp?rev=335925&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CXX/conv/conv.prom/p5.cpp (added)<br>
+++ cfe/trunk/test/CXX/conv/conv.prom/p5.cpp Thu Jun 28 14:17:55 2018<br>
@@ -0,0 +1,19 @@<br>
+// RUN: %clang_cc1 -verify %s<br>
+// expected-no-diagnostics<br>
+<br>
+// A prvalue for an integral bit-field can be converted to a prvalue of type<br>
+// int if int can represent all the values of the bit-field<br>
+struct X { long long e : 1; };<br>
+static_assert(sizeof(+X().e) == sizeof(int), "");<br>
+static_assert(sizeof(X().e + 1) == sizeof(int), "");<br>
+static_assert(sizeof(true ? X().e : 0) == sizeof(int), "");<br>
+<br>
+enum E { a = __LONG_LONG_MAX__ };<br>
+static_assert(sizeof(E{}) == sizeof(long long), "");<br>
+<br>
+// If the bit-field has an enumerated type, it is treated as any other value of<br>
+// that [enumerated] type for promotion purposes.<br>
+struct Y { E e : 1; };<br>
+static_assert(sizeof(+Y().e) == sizeof(long long), "");<br>
+static_assert(sizeof(Y().e + 1) == sizeof(long long), "");<br>
+static_assert(sizeof(true ? Y().e : 0) == sizeof(long long), "");<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="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
_______________________________________________<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="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>