aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2012-09-14 22:16:56 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2012-09-14 22:16:56 +0100
commit9f33203d01759563ee11c708ef918aa65c1b5fe5 (patch)
treee2e2bde40ff1e0181abebbb3485df74d9578ddcf
parent9996a6d1b699ae3a438babd595df622c596b2c64 (diff)
downloadgcc-9f33203d01759563ee11c708ef918aa65c1b5fe5.zip
gcc-9f33203d01759563ee11c708ef918aa65c1b5fe5.tar.gz
gcc-9f33203d01759563ee11c708ef918aa65c1b5fe5.tar.bz2
re PR c/54552 (Cast to pointer to VLA crash the compiler)
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. From-SVN: r191313
-rw-r--r--gcc/c/ChangeLog7
-rw-r--r--gcc/c/c-typeck.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr54552-1.c8
4 files changed, 24 insertions, 1 deletions
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 <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
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 <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
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 });
+}