]> granicus.if.org Git - clang/commitdiff
ObjC: Handle boolean fixed type for enum.
authorManman Ren <manman.ren@gmail.com>
Wed, 23 Mar 2016 16:28:28 +0000 (16:28 +0000)
committerManman Ren <manman.ren@gmail.com>
Wed, 23 Mar 2016 16:28:28 +0000 (16:28 +0000)
Before this commit, we assert failure in ImplicitCastExpr
"unheralded conversion to bool". This commit fixes the assertion by using
the correct cast type when the fixed type is boolean.

This commit also fixes the behavior for Microsoft mode as well, since
Obj-C and Microsoft mode share the same code path.

rdar://24999533

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@264167 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaObjC/enum-fixed-type.m

index 1abd7d0ae6ba0b1a70c9446df46f243542741970..c8a9b9ac80722c70c7895870c675dee52d71109b 100644 (file)
@@ -14146,7 +14146,10 @@ EnumConstantDecl *Sema::CheckEnumConstant(EnumDecl *Enum,
             } else
               Diag(IdLoc, diag::err_enumerator_too_large) << EltTy;
           } else
-            Val = ImpCastExprToType(Val, EltTy, CK_IntegralCast).get();
+            Val = ImpCastExprToType(Val, EltTy,
+                                    EltTy->isBooleanType() ?
+                                    CK_IntegralToBoolean : CK_IntegralCast)
+                    .get();
         } else if (getLangOpts().CPlusPlus) {
           // C++11 [dcl.enum]p5:
           //   If the underlying type is not fixed, the type of each enumerator
index c00e45a03ed0b7b22ed6c4d8b3fa5db38a69e304..37d2810a504b02371402c526256382704ca9a59b 100644 (file)
@@ -38,3 +38,8 @@ int arr3[(long long)Bar == (long long)-1 ? 1 : -1];
 
 typedef enum : Integer { BaseElem } BaseEnum;
 typedef enum : BaseEnum { DerivedElem } DerivedEnum; // expected-error {{non-integral type 'BaseEnum' is an invalid underlying type}}
+
+// <rdar://problem/24999533>
+enum MyEnum : _Bool {
+  MyThing = 0
+};