This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 2/2] Add illegal cilk checks to C++ front.
- From: Andi Kleen <andi at firstfloor dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Andi Kleen <ak at linux dot intel dot com>
- Date: Fri, 3 Oct 2014 07:08:58 -0700
- Subject: [PATCH 2/2] Add illegal cilk checks to C++ front.
- Authentication-results: sourceware.org; auth=none
- References: <1412345338-18397-1-git-send-email-andi at firstfloor dot org> <1412345338-18397-2-git-send-email-andi at firstfloor dot org>
From: Andi Kleen <ak@linux.intel.com>
Add calls for several illegal Cilk cases to the C++ frontend.
C++ usually doesn't ICE unlike C on illegal cilk, but it's
better to match C in what is allowed and what is not.
if (_Cilk_spawn ...) is still not errored, but at least it doesn't ICE.
gcc/cp/:
2014-09-30 Andi Kleen <ak@linux.intel.com>
* semantics.c (finish_goto_stmt): Call check_no_cilk.
(finish_while_stmt_cond): Dito.
(finish_do_stmt): Dito.
(finish_for_cond): Dito.
(finish_switch_cond): Dito.
---
gcc/cp/semantics.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 7569826..e7ff223 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -621,6 +621,10 @@ finish_goto_stmt (tree destination)
TREE_USED (destination) = 1;
else
{
+ if (check_no_cilk (destination,
+ "Cilk array notation cannot be used as a computed goto expression",
+ "%<_Cilk_spawn%> statement cannot be used as a computed goto expression"))
+ destination = error_mark_node;
destination = mark_rvalue_use (destination);
if (!processing_template_decl)
{
@@ -792,6 +796,10 @@ begin_while_stmt (void)
void
finish_while_stmt_cond (tree cond, tree while_stmt, bool ivdep)
{
+ if (check_no_cilk (cond,
+ "Cilk array notation cannot be used as a condition for while statement",
+ "%<_Cilk_spawn%> statement cannot be used as a condition for while statement"))
+ cond = error_mark_node;
cond = maybe_convert_cond (cond);
finish_cond (&WHILE_COND (while_stmt), cond);
begin_maybe_infinite_loop (cond);
@@ -847,6 +855,10 @@ finish_do_body (tree do_stmt)
void
finish_do_stmt (tree cond, tree do_stmt, bool ivdep)
{
+ if (check_no_cilk (cond,
+ "Cilk array notation cannot be used as a condition for a do-while statement",
+ "%<_Cilk_spawn%> statement cannot be used as a condition for a do-while statement"))
+ cond = error_mark_node;
cond = maybe_convert_cond (cond);
end_maybe_infinite_loop (cond);
if (ivdep && cond != error_mark_node)
@@ -956,6 +968,10 @@ finish_for_init_stmt (tree for_stmt)
void
finish_for_cond (tree cond, tree for_stmt, bool ivdep)
{
+ if (check_no_cilk (cond,
+ "Cilk array notation cannot be used in a condition for a for-loop",
+ "%<_Cilk_spawn%> statement cannot be used in a condition for a for-loop"))
+ cond = error_mark_node;
cond = maybe_convert_cond (cond);
finish_cond (&FOR_COND (for_stmt), cond);
begin_maybe_infinite_loop (cond);
@@ -1118,6 +1134,12 @@ void
finish_switch_cond (tree cond, tree switch_stmt)
{
tree orig_type = NULL;
+
+ if (check_no_cilk (cond,
+ "Cilk array notation cannot be used as a condition for switch statement",
+ "%<_Cilk_spawn%> statement cannot be used as a condition for switch statement"))
+ cond = error_mark_node;
+
if (!processing_template_decl)
{
/* Convert the condition to an integer or enumeration type. */
--
2.1.1