Commit cc5c5226 by Igor Zamyatin Committed by Kirill Yukhin

re PR c++/68001 ([cilkplus] ICE in cp_gimplify_expr, at cp/cp-gimplify.c:760)

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.

From-SVN: r230755
parent f7b492ea
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> 2015-11-19 Jason Merrill <jason@redhat.com>
* c-common.c (shorten_compare): But look through macros from * c-common.c (shorten_compare): But look through macros from
......
...@@ -272,16 +272,16 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED, ...@@ -272,16 +272,16 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED,
} }
case CILK_SPAWN_STMT: case CILK_SPAWN_STMT:
gcc_assert gcc_assert(fn_contains_cilk_spawn_p (cfun)
(fn_contains_cilk_spawn_p (cfun) && cilk_detect_spawn_and_unwrap (expr_p));
&& cilk_detect_spawn_and_unwrap (expr_p));
/* If errors are seen, then just process it as a CALL_EXPR. */
if (!seen_error ()) if (!seen_error ())
{ {
cilk_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p); cilk_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
return (enum gimplify_status) gimplify_cilk_spawn (expr_p); return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
} }
return GS_ERROR;
case MODIFY_EXPR: case MODIFY_EXPR:
case INIT_EXPR: case INIT_EXPR:
case CALL_EXPR: case CALL_EXPR:
......
...@@ -33,7 +33,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -33,7 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "gimplify.h" #include "gimplify.h"
#include "tree-iterator.h" #include "tree-iterator.h"
#include "tree-inline.h" #include "tree-inline.h"
#include "toplev.h" #include "toplev.h"
#include "calls.h" #include "calls.h"
#include "cilk.h" #include "cilk.h"
...@@ -76,6 +76,7 @@ struct wrapper_data ...@@ -76,6 +76,7 @@ struct wrapper_data
tree block; tree block;
}; };
static tree contains_cilk_spawn_stmt_walker (tree *tp, int *, void *);
static void extract_free_variables (tree, struct wrapper_data *, static void extract_free_variables (tree, struct wrapper_data *,
enum add_variable_type); enum add_variable_type);
static HOST_WIDE_INT cilk_wrapper_count; static HOST_WIDE_INT cilk_wrapper_count;
...@@ -235,7 +236,19 @@ recognize_spawn (tree exp, tree *exp0) ...@@ -235,7 +236,19 @@ recognize_spawn (tree exp, tree *exp0)
} }
/* _Cilk_spawn can't be wrapped in expression such as PLUS_EXPR. */ /* _Cilk_spawn can't be wrapped in expression such as PLUS_EXPR. */
else if (contains_cilk_spawn_stmt (exp)) 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; return spawn_found;
} }
......
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> 2015-11-20 Jakub Jelinek <jakub@redhat.com>
PR c++/67354 PR c++/67354
......
...@@ -611,12 +611,14 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) ...@@ -611,12 +611,14 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
25979. */ 25979. */
case INIT_EXPR: case INIT_EXPR:
if (fn_contains_cilk_spawn_p (cfun) if (fn_contains_cilk_spawn_p (cfun)
&& cilk_detect_spawn_and_unwrap (expr_p) && cilk_detect_spawn_and_unwrap (expr_p))
&& !seen_error ())
{ {
cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p); cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
return (enum gimplify_status) gimplify_cilk_spawn (expr_p); return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
} }
if (seen_error ())
return GS_ERROR;
cp_gimplify_init_expr (expr_p); cp_gimplify_init_expr (expr_p);
if (TREE_CODE (*expr_p) != INIT_EXPR) if (TREE_CODE (*expr_p) != INIT_EXPR)
return GS_OK; return GS_OK;
...@@ -725,16 +727,16 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) ...@@ -725,16 +727,16 @@ cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
break; break;
case CILK_SPAWN_STMT: case CILK_SPAWN_STMT:
gcc_assert gcc_assert(fn_contains_cilk_spawn_p (cfun)
(fn_contains_cilk_spawn_p (cfun) && cilk_detect_spawn_and_unwrap (expr_p));
&& cilk_detect_spawn_and_unwrap (expr_p));
/* If errors are seen, then just process it as a CALL_EXPR. */
if (!seen_error ()) if (!seen_error ())
{ {
cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p); cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
return (enum gimplify_status) gimplify_cilk_spawn (expr_p); return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
} }
return GS_ERROR;
case CALL_EXPR: case CALL_EXPR:
if (fn_contains_cilk_spawn_p (cfun) if (fn_contains_cilk_spawn_p (cfun)
&& cilk_detect_spawn_and_unwrap (expr_p) && cilk_detect_spawn_and_unwrap (expr_p)
......
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> 2015-11-23 Richard Biener <rguenther@suse.de>
Jiong Wang <jiong.wang@arm.com> Jiong Wang <jiong.wang@arm.com>
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment