On 12/25/2015 09:08 AM, Ryan Burn wrote:
This patch fixes issues with cilk_spawn where bad diagnostics are
emitted for expressions invoking conversion operators or constructor
calls (PR69024, PR68997).

It also fixes an issue with a missing CLEANUP_POINT_EXPR that causes
an ICE when gimplifying code containing a temporary with a destructor
(PR69048)

Bootstrapped and regression tested on x86_64-linux

2015-12-25  Ryan Burn<cont...@rnburn.com>

        PR cilkplus/69024, PR cilkplus/68997, PR cilkplus/PR69048
        * cilk.c (cilk_detect_spawn_and_unwrap): Use recursive function
find_spawn to search for the CILK_SPAWN_STMT.
          (cilk_ignorable_spawn_rhs_op): Also ignore COMPOUND_EXPR.
          (find_spawn): New.
          (is_conversion_operator_function_decl_p): New.
          (is_conversion_operator_call_p): New.
          (is_unary_constructor_aggr_init_p): New.
          (is_conversion_operator_aggr_init_p): New.
          (extract_free_variables): Don't extract the slot variable of
an AGGR_INIT_EXPR.
          (create_cilk_wrapper_body): Add CLEANUP_POINT_EXPR to the
spawn expression.

        * gcc/testsuite/g++.dg/cilk-plus/CK/pr68997.cc : New test.

        * gcc/testsuite/g++.dg/cilk-plus/CK/pr69024.cc : New test.

        * gcc/testsuite/g++.dg/cilk-plus/CK/pr69048.cc : New test.

        * gcc/testsuite/g++.dg/cilk-plus/CK/pr68001.cc : Removed check
depending on bad diagnostics.
Do you have a copyright assignment on file with the FSF? This seems large enough to require one.


+static bool
+is_conversion_operator_function_decl_p (tree t) {
+  if (TREE_CODE (t) != FUNCTION_DECL)
+    return false;
+
+  return DECL_NAME (t) && TREE_LANG_FLAG_4 (DECL_NAME (t));
At the least the use of TREE_LANG_FLAG here ought to document what you're checking for. However, more likely the use is an indicator that you're doing something wrong.

Similarly for the use of TREE_LANG_FLAG_0.

Essentially those flags are allowed to have different meanings for each language. AFAICT that their meaning varies for C/C++, so using them in a shared file like this is definitely suspect.


Each new function should have a block comment before it which briefly describes the function and return values. See other existing functions for examples.

+  return VL_EXP_OPERAND_LENGTH (t) == 4
+        && TREE_CODE (fn) == ADDR_EXPR
+        && is_conversion_operator_function_decl_p (TREE_OPERAND (fn, 0));
For multi-line expressions, please wrap them in a outer set of parenthesis. I think there was another instance earlier.



Jeff

Reply via email to