summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorkyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-23 12:58:12 +0000
committerkyukhin <kyukhin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-11-23 12:58:12 +0000
commit8d63c601b260fc0ca8aaa5c469b40c8239f4c3a9 (patch)
tree30e258cf929d46b9df9c2b27f3695b35c4253e1c /gcc
parent39a9f2bea17b2d74c71ecac457c6771d7116390f (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/c-family/c-gimplify.c8
-rw-r--r--gcc/c-family/cilk.c17
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/cp-gimplify.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cilk-plus/CK/pr68001.cc18
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;
+}