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