From 5e88a8f4fb8655049c84d0ba133511cd568e93d2 Mon Sep 17 00:00:00 2001 From: Igor Zamyatin Date: Mon, 30 Jun 2014 08:14:39 +0000 Subject: [PATCH] re PR middle-end/57541 ([Cilkplus]: internal compiler error: in gimplify_expr, at gimplify.c:7809) PR middle-end/57541 gcc/c/ * c-array-notation.c (fix_builtin_array_notation_fn): Check for 0 arguments in builtin call. Check that bultin argument is correct. * c-parser.c (c_parser_array_notation): Check for incorrect initial index. gcc/cpp/ * cp-array-notation.c (expand_sec_reduce_builtin): Check that bultin argument is correct. * call.c (build_cxx_call): Check for 0 arguments in builtin call. gcc/testsuite/ * c-c++-common/cilk-plus/AN/pr57541.c: New case added. * c-c++-common/cilk-plus/AN/pr57541-2.c: New test. From-SVN: r212138 --- gcc/c/ChangeLog | 9 +++++++++ gcc/c/c-array-notation.c | 12 +++++++++++- gcc/c/c-parser.c | 2 +- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/call.c | 5 +++++ gcc/cp/cp-array-notation.c | 5 ++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c | 15 +++++++++++++++ gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c | 13 +++++++++++-- 9 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index fa7caac..02a0f2f 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,12 @@ +2014-06-30 Igor Zamyatin + + PR middle-end/57541 + * c-array-notation.c (fix_builtin_array_notation_fn): + Check for 0 arguments in builtin call. Check that bultin argument is + correct. + * c-parser.c (c_parser_array_notation): Check for incorrect initial + index. + 2014-06-27 Sebastian Huber * c-parser.c (c_parser_declaration_or_fndef): Discard all type diff --git a/gcc/c/c-array-notation.c b/gcc/c/c-array-notation.c index b4015b8..67a8931 100644 --- a/gcc/c/c-array-notation.c +++ b/gcc/c/c-array-notation.c @@ -214,6 +214,13 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree *new_var) if (an_type == BUILT_IN_NONE) return NULL_TREE; + /* Builtin call should contain at least one argument. */ + if (call_expr_nargs (an_builtin_fn) == 0) + { + error_at (EXPR_LOCATION (an_builtin_fn), "Invalid builtin arguments"); + return error_mark_node; + } + if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING) { @@ -238,7 +245,10 @@ fix_builtin_array_notation_fn (tree an_builtin_fn, tree *new_var) return error_mark_node; if (rank == 0) - return an_builtin_fn; + { + error_at (location, "Invalid builtin arguments"); + return error_mark_node; + } else if (rank > 1 && (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND)) diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 797d1bc..99e7fc8 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -14098,7 +14098,7 @@ c_parser_array_notation (location_t loc, c_parser *parser, tree initial_index, tree value_tree = NULL_TREE, type = NULL_TREE, array_type = NULL_TREE; tree array_type_domain = NULL_TREE; - if (array_value == error_mark_node) + if (array_value == error_mark_node || initial_index == error_mark_node) { /* No need to continue. If either of these 2 were true, then an error must be emitted already. Thus, no need to emit them twice. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c7a0ccb..edf79e7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2014-06-30 Igor Zamyatin + + PR middle-end/57541 + * cp-array-notation.c (expand_sec_reduce_builtin): + Check that bultin argument is correct. + * call.c (build_cxx_call): Check for 0 arguments in builtin call. + 2014-06-28 Jonathan Wakely DR 1579 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 4847c3a..e002d01 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -7414,6 +7414,11 @@ build_cxx_call (tree fn, int nargs, tree *argarray, || bif == BUILT_IN_CILKPLUS_SEC_REDUCE || bif == BUILT_IN_CILKPLUS_SEC_REDUCE_MUTATING) { + if (call_expr_nargs (fn) == 0) + { + error_at (EXPR_LOCATION (fn), "Invalid builtin arguments"); + return error_mark_node; + } /* for bif == BUILT_IN_CILKPLUS_SEC_REDUCE_ALL_ZERO or BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_ZERO or BUILT_IN_CILKPLUS_SEC_REDUCE_ANY_NONZERO or diff --git a/gcc/cp/cp-array-notation.c b/gcc/cp/cp-array-notation.c index 0538e55..b45449b 100644 --- a/gcc/cp/cp-array-notation.c +++ b/gcc/cp/cp-array-notation.c @@ -250,7 +250,10 @@ expand_sec_reduce_builtin (tree an_builtin_fn, tree *new_var) if (!find_rank (location, an_builtin_fn, an_builtin_fn, true, &rank)) return error_mark_node; if (rank == 0) - return an_builtin_fn; + { + error_at (location, "Invalid builtin arguments"); + return error_mark_node; + } else if (rank > 1 && (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX_IND || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN_IND)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5a9d73a..c2ed273 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2014-06-30 Igor Zamyatin + + PR middle-end/57541 + * c-c++-common/cilk-plus/AN/pr57541.c: New case added. + * c-c++-common/cilk-plus/AN/pr57541-2.c: New test. + 2014-06-30 Zhenqiang Chen * ira-loop-pressure.c: New test. diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c new file mode 100644 index 0000000..83325a7 --- /dev/null +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541-2.c @@ -0,0 +1,15 @@ +/* PR middle-end/57541 */ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +int foo1 () +{ + int a; + a = __sec_reduce_add (1); /* { dg-error "Invalid builtin arguments" } */ +} + +int foo2 () +{ + int a; + a = __sec_reduce_add (); /* { dg-error "Invalid builtin arguments" } */ +} diff --git a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c index 9bff079..f379e46 100755 --- a/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c +++ b/gcc/testsuite/c-c++-common/cilk-plus/AN/pr57541.c @@ -1,9 +1,10 @@ +/* PR middle-end/57541 */ /* { dg-do compile } */ /* { dg-options "-fcilkplus" } */ int A[10]; -int main () { +int foo () { /* C compiler uses the term "undeclared" whereas C++ compiler uses "not declared". Thus, grepping for declared seem to be the easiest. */ @@ -13,5 +14,13 @@ int main () { A[l:s:c]; } -/* { dg-message "note: each" "defined" { target c } 10 } */ +int foo1 (int N) { + + char c = (char)N; + short s = (short)N; + A[l:s:c]; /* { dg-error "declared" } */ +} + + +/* { dg-message "note: each" "defined" { target c } 11 } */ -- 2.7.4