diff options
author | kyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-11-23 12:58:12 +0000 |
---|---|---|
committer | kyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-11-23 12:58:12 +0000 |
commit | 8d63c601b260fc0ca8aaa5c469b40c8239f4c3a9 (patch) | |
tree | 30e258cf929d46b9df9c2b27f3695b35c4253e1c /gcc | |
parent | 39a9f2bea17b2d74c71ecac457c6771d7116390f (diff) | |
download | gcc-8d63c601b260fc0ca8aaa5c469b40c8239f4c3a9.tar.gz |
PR c++/68001
gcc/c-family
PR c++/68001
* c-gimplify.c (c_gimplify_expr): Stop the process if see an error.
* cilk.c (recognize_spawn): Determine location in a more precise
way.
gcc/cp
* cp-gimplify.c (cp_gimplify_expr): Stop the process if see an error.
gcc/testsuite
* g++.dg/cilk-plus/CK/pr68001.cc: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230755 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/c-family/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c-family/c-gimplify.c | 8 | ||||
-rw-r--r-- | gcc/c-family/cilk.c | 17 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cilk-plus/CK/pr68001.cc | 18 |
7 files changed, 62 insertions, 12 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index c19cafa05f8..6e7b0f761f2 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,10 @@ +2015-11-23 Igor Zamyatin <igor.zamyatin@intel.com> + + PR c++/68001 + * c-gimplify.c (c_gimplify_expr): Stop the process if see an error. + * cilk.c (recognize_spawn): Determine location in a more precise + way. + 2015-11-19 Jason Merrill <jason@redhat.com> * c-common.c (shorten_compare): But look through macros from diff --git a/gcc/c-family/c-gimplify.c b/gcc/c-family/c-gimplify.c index a3d0025c63b..fc4a44a9ebf 100644 --- a/gcc/c-family/c-gimplify.c +++ b/gcc/c-family/c-gimplify.c @@ -272,16 +272,16 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED, } case CILK_SPAWN_STMT: - gcc_assert - (fn_contains_cilk_spawn_p (cfun) - && cilk_detect_spawn_and_unwrap (expr_p)); + gcc_assert(fn_contains_cilk_spawn_p (cfun) + && cilk_detect_spawn_and_unwrap (expr_p)); - /* If errors are seen, then just process it as a CALL_EXPR. */ if (!seen_error ()) { cilk_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p); return (enum gimplify_status) gimplify_cilk_spawn (expr_p); } + return GS_ERROR; + case MODIFY_EXPR: case INIT_EXPR: case CALL_EXPR: diff --git a/gcc/c-family/cilk.c b/gcc/c-family/cilk.c index e75e20c2383..15cce34b33d 100644 --- a/gcc/c-family/cilk.c +++ b/gcc/c-family/cilk.c @@ -33,7 +33,7 @@ along with GCC; see the file COPYING3. If not see #include "gimplify.h" #include "tree-iterator.h" #include "tree-inline.h" -#include "toplev.h" +#include "toplev.h" #include "calls.h" #include "cilk.h" @@ -76,6 +76,7 @@ struct wrapper_data tree block; }; +static tree contains_cilk_spawn_stmt_walker (tree *tp, int *, void *); static void extract_free_variables (tree, struct wrapper_data *, enum add_variable_type); static HOST_WIDE_INT cilk_wrapper_count; @@ -235,7 +236,19 @@ recognize_spawn (tree exp, tree *exp0) } /* _Cilk_spawn can't be wrapped in expression such as PLUS_EXPR. */ else if (contains_cilk_spawn_stmt (exp)) - error_at (EXPR_LOCATION (exp), "invalid use of %<_Cilk_spawn%>"); + { + location_t loc = EXPR_LOCATION (exp); + if (loc == UNKNOWN_LOCATION) + { + tree stmt = walk_tree (&exp, + contains_cilk_spawn_stmt_walker, + NULL, + NULL); + gcc_assert (stmt != NULL_TREE); + loc = EXPR_LOCATION (stmt); + } + error_at (loc, "invalid use of %<_Cilk_spawn%>"); + } return spawn_found; } diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4f508bde9a6..f401b822bbb 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2015-11-23 Igor Zamyatin <igor.zamyatin@intel.com> + + PR c++/68001 + * cp-gimplify.c (cp_gimplify_expr): Stop the process if see an error. + 2015-11-20 Jakub Jelinek <jakub@redhat.com> PR c++/67354 diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index 99d0cfb8b9e..8fdcb6d81e0 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -611,12 +611,14 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) 25979. */ case INIT_EXPR: if (fn_contains_cilk_spawn_p (cfun) - && cilk_detect_spawn_and_unwrap (expr_p) - && !seen_error ()) + && cilk_detect_spawn_and_unwrap (expr_p)) { cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p); return (enum gimplify_status) gimplify_cilk_spawn (expr_p); } + if (seen_error ()) + return GS_ERROR; + cp_gimplify_init_expr (expr_p); if (TREE_CODE (*expr_p) != INIT_EXPR) return GS_OK; @@ -725,16 +727,16 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) break; case CILK_SPAWN_STMT: - gcc_assert - (fn_contains_cilk_spawn_p (cfun) - && cilk_detect_spawn_and_unwrap (expr_p)); + gcc_assert(fn_contains_cilk_spawn_p (cfun) + && cilk_detect_spawn_and_unwrap (expr_p)); - /* If errors are seen, then just process it as a CALL_EXPR. */ if (!seen_error ()) { cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p); return (enum gimplify_status) gimplify_cilk_spawn (expr_p); } + return GS_ERROR; + case CALL_EXPR: if (fn_contains_cilk_spawn_p (cfun) && cilk_detect_spawn_and_unwrap (expr_p) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1c60e503b99..ac6f5ef6f8e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-11-23 Igor Zamyatin <igor.zamyatin@intel.com> + + PR c++/68001 + * g++.dg/cilk-plus/CK/pr68001.cc: New test. + 2015-11-23 Richard Biener <rguenther@suse.de> Jiong Wang <jiong.wang@arm.com> diff --git a/gcc/testsuite/g++.dg/cilk-plus/CK/pr68001.cc b/gcc/testsuite/g++.dg/cilk-plus/CK/pr68001.cc new file mode 100644 index 00000000000..07f7c5f2d55 --- /dev/null +++ b/gcc/testsuite/g++.dg/cilk-plus/CK/pr68001.cc @@ -0,0 +1,18 @@ +/* PR middle-end/68001 */ +/* { dg-do compile } */ +/* { dg-options "-fcilkplus" } */ + +#include <vector> + +std::vector<double> f() { + std::vector<double> v; + return v; +} + +int main() +{ + std::vector<double> x = _Cilk_spawn f(); /* { dg-error "invalid use of" } */ + std::vector<double> y = f(); + _Cilk_sync; + return 0; +} |