summaryrefslogtreecommitdiff
path: root/gcc48-pr77767.patch
diff options
context:
space:
mode:
Diffstat (limited to 'gcc48-pr77767.patch')
-rw-r--r--gcc48-pr77767.patch56
1 files changed, 56 insertions, 0 deletions
diff --git a/gcc48-pr77767.patch b/gcc48-pr77767.patch
new file mode 100644
index 0000000..ba80ac1
--- /dev/null
+++ b/gcc48-pr77767.patch
@@ -0,0 +1,56 @@
+2017-05-30 Jakub Jelinek <jakub@redhat.com>
+
+ Backported from mainline
+ 2016-12-21 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/77767
+ * c-decl.c (grokdeclarator): If *expr is non-NULL, append expression
+ to *expr instead of overwriting it.
+
+ * gcc.c-torture/execute/pr77767.c: New test.
+
+--- gcc/c/c-decl.c
++++ gcc/c/c-decl.c
+@@ -5409,11 +5409,21 @@ grokdeclarator (const struct c_declarator *declarator,
+ if (TREE_CODE (type) == ERROR_MARK)
+ return error_mark_node;
+ if (expr == NULL)
+- expr = &expr_dummy;
++ {
++ expr = &expr_dummy;
++ expr_dummy = NULL_TREE;
++ }
+ if (expr_const_operands == NULL)
+ expr_const_operands = &expr_const_operands_dummy;
+
+- *expr = declspecs->expr;
++ if (declspecs->expr)
++ {
++ if (*expr)
++ *expr = build2 (COMPOUND_EXPR, TREE_TYPE (declspecs->expr), *expr,
++ declspecs->expr);
++ else
++ *expr = declspecs->expr;
++ }
+ *expr_const_operands = declspecs->expr_const_operands;
+
+ if (decl_context == FUNCDEF)
+--- /dev/null
++++ gcc/testsuite/gcc.c-torture/execute/pr77767.c
+@@ -0,0 +1,16 @@
++/* PR c/77767 */
++
++void
++foo (int a, int b[a++], int c, int d[c++])
++{
++ if (a != 2 || c != 2)
++ __builtin_abort ();
++}
++
++int
++main ()
++{
++ int e[10];
++ foo (1, e, 1, e);
++ return 0;
++}