From: jsm28 Date: Fri, 14 Sep 2012 21:16:56 +0000 (+0000) Subject: c: X-Git-Tag: upstream/4.9.2~10640 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c4b1a13a1269a7648fd073413fa3571007f9c07e;p=platform%2Fupstream%2Flinaro-gcc.git c: 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 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index bd6ef8f..6aed2c3 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,5 +1,12 @@ 2012-09-14 Joseph Myers + 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 + PR c/54103 * c-typeck.c (build_unary_op): Pass original argument of TRUTH_NOT_EXPR to c_objc_common_truthvalue_conversion, then remove diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c index 628857c..5b4ad28 100644 --- a/gcc/c/c-typeck.c +++ b/gcc/c/c-typeck.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4a9715e..cd1c5fa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-09-14 Joseph Myers + + PR c/54552 + * gcc.c-torture/compile/pr54552-1.c: New test. + 2012-09-14 Marc Glisse 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 index 0000000..bc20053 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr54552-1.c @@ -0,0 +1,8 @@ +void +f (void) +{ + unsigned n = 10; + + typedef double T[n]; + (double (*)[n])((unsigned char (*)[sizeof (T)]){ 0 }); +}