c:
authorjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Sep 2012 21:16:56 +0000 (21:16 +0000)
committerjsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Sep 2012 21:16:56 +0000 (21:16 +0000)
PR c/54552
* c-typeck.c (c_cast_expr): When casting to a type requiring
C_MAYBE_CONST_EXPR to be created, pass the inner expression to
c_fully_fold first.

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

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

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

index bd6ef8f..6aed2c3 100644 (file)
@@ -1,5 +1,12 @@
 2012-09-14  Joseph Myers  <joseph@codesourcery.com>
 
+       PR c/54552
+       * c-typeck.c (c_cast_expr): When casting to a type requiring
+       C_MAYBE_CONST_EXPR to be created, pass the inner expression to
+       c_fully_fold first.
+
+2012-09-14  Joseph Myers  <joseph@codesourcery.com>
+
        PR c/54103
        * c-typeck.c (build_unary_op): Pass original argument of
        TRUTH_NOT_EXPR to c_objc_common_truthvalue_conversion, then remove
index 628857c..5b4ad28 100644 (file)
@@ -4779,8 +4779,11 @@ c_cast_expr (location_t loc, struct c_type_name *type_name, tree expr)
   ret = build_c_cast (loc, type, expr);
   if (type_expr)
     {
+      bool inner_expr_const = true;
+      ret = c_fully_fold (ret, require_constant_value, &inner_expr_const);
       ret = build2 (C_MAYBE_CONST_EXPR, TREE_TYPE (ret), type_expr, ret);
-      C_MAYBE_CONST_EXPR_NON_CONST (ret) = !type_expr_const;
+      C_MAYBE_CONST_EXPR_NON_CONST (ret) = !(type_expr_const
+                                            && inner_expr_const);
       SET_EXPR_LOCATION (ret, loc);
     }
 
index 4a9715e..cd1c5fa 100644 (file)
@@ -1,3 +1,8 @@
+2012-09-14  Joseph Myers  <joseph@codesourcery.com>
+
+       PR c/54552
+       * gcc.c-torture/compile/pr54552-1.c: New test.
+
 2012-09-14  Marc Glisse  <marc.glisse@inria.fr>
 
        PR c++/54427
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr54552-1.c b/gcc/testsuite/gcc.c-torture/compile/pr54552-1.c
new file mode 100644 (file)
index 0000000..bc20053
--- /dev/null
@@ -0,0 +1,8 @@
+void
+f (void)
+{
+  unsigned n = 10;
+
+  typedef double T[n];
+  (double (*)[n])((unsigned char (*)[sizeof (T)]){ 0 });
+}