]> granicus.if.org Git - clang/commitdiff
Fixed cast to union with anonymous bitfields.
authorAbramo Bagnara <abramo.bagnara@gmail.com>
Thu, 7 Oct 2010 21:20:44 +0000 (21:20 +0000)
committerAbramo Bagnara <abramo.bagnara@gmail.com>
Thu, 7 Oct 2010 21:20:44 +0000 (21:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@115979 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/Sema/cast-to-union.c

index 9a3cb442a75bac668b764860510364aab6953369..fec8cb916635ef66f6ef2c30c7f00a014b38921e 100644 (file)
@@ -3986,7 +3986,8 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr,
       for (Field = RD->field_begin(), FieldEnd = RD->field_end();
            Field != FieldEnd; ++Field) {
         if (Context.hasSameUnqualifiedType(Field->getType(),
-                                           castExpr->getType())) {
+                                           castExpr->getType()) &&
+            !Field->isUnnamedBitfield()) {
           Diag(TyR.getBegin(), diag::ext_typecheck_cast_to_union)
             << castExpr->getSourceRange();
           break;
index 6f275e8b505fbe9172bdf527e62b03ca9c5639e4..c32964dfc0d58da61247893a99c6eeb4b0817dfa 100644 (file)
@@ -1,11 +1,12 @@
 // RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s
 
-union u { int i; };
+union u { int i; unsigned : 3; };
 void f(union u);
 
 void test(int x) {
   f((union u)x); // expected-warning {{C99 forbids casts to union type}}
   f((union u)&x); // expected-error {{cast to union type from type 'int *' not present in union}}
+  f((union u)2U); // expected-error {{cast to union type from type 'unsigned int' not present in union}}
 }
 
 union u w = (union u)2; // expected-warning {{C99 forbids casts to union type}}