From: Jakub Jelinek Date: Tue, 30 May 2017 07:51:58 +0000 (+0200) Subject: backport: re PR c/77767 (Side-effect from VLA array parameters lost) X-Git-Tag: releases/gcc-5.5.0~277 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ce18d8b570646cd8b6c63af45f789b08025d11c0;p=thirdparty%2Fgcc.git backport: re PR c/77767 (Side-effect from VLA array parameters lost) Backported from mainline 2016-12-21 Jakub Jelinek 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. From-SVN: r248635 --- diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index bdc6b43856f5..caf2a72a8d0c 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,6 +1,12 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2016-12-21 Jakub Jelinek + + PR c/77767 + * c-decl.c (grokdeclarator): If *expr is non-NULL, append expression + to *expr instead of overwriting it. + 2016-08-12 Jakub Jelinek Martin Liska diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 0737c400e2ea..519a97917426 100644 --- a/gcc/c/c-decl.c +++ b/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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4969e956b5f0..ffd3164df19a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2017-05-30 Jakub Jelinek Backported from mainline + 2016-12-21 Jakub Jelinek + + PR c/77767 + * gcc.c-torture/execute/pr77767.c: New test. + 2016-12-13 Jakub Jelinek PR ipa/77905 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr77767.c b/gcc/testsuite/gcc.c-torture/execute/pr77767.c new file mode 100644 index 000000000000..21725a56bfe7 --- /dev/null +++ b/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; +}