OSDN Git Service

PR c/42708
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Jan 2010 23:09:00 +0000 (23:09 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Jan 2010 23:09:00 +0000 (23:09 +0000)
* c-typeck.c (build_c_cast): Fold value cast to union type before
wrapping it in a CONSTRUCTOR.

testsuite:
* gcc.c-torture/compile/pr42708-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155846 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr42708-1.c [new file with mode: 0644]

index 256e1d0..315ebee 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-12  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/42708
+       * c-typeck.c (build_c_cast): Fold value cast to union type before
+       wrapping it in a CONSTRUCTOR.
+
 2010-01-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/42699
index dbaddd6..17bdbf9 100644 (file)
@@ -4429,10 +4429,14 @@ build_c_cast (location_t loc, tree type, tree expr)
       if (field)
        {
          tree t;
+         bool maybe_const = true;
 
          pedwarn (loc, OPT_pedantic, "ISO C forbids casts to union type");
-         t = digest_init (loc, type,
-                          build_constructor_single (type, field, value),
+         t = c_fully_fold (value, false, &maybe_const);
+         t = build_constructor_single (type, field, t);
+         if (!maybe_const)
+           t = c_wrap_maybe_const (t, true);
+         t = digest_init (loc, type, t,
                           NULL_TREE, false, true, 0);
          TREE_CONSTANT (t) = TREE_CONSTANT (value);
          return t;
index 4bdc481..ae31eae 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-12  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/42708
+       * gcc.c-torture/compile/pr42708-1.c: New test.
+
 2010-01-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/42662
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr42708-1.c b/gcc/testsuite/gcc.c-torture/compile/pr42708-1.c
new file mode 100644 (file)
index 0000000..9124a85
--- /dev/null
@@ -0,0 +1,10 @@
+typedef __SIZE_TYPE__ size_t;
+void *malloc(size_t);
+typedef union YYSTYPE {
+    char *id;
+}  YYSTYPE;
+extern YYSTYPE yylval;
+void yylex (int b)
+{
+  yylval = (YYSTYPE) (b ? 0 : (char *) malloc (4));
+}