diff options
Diffstat (limited to 'gcc/cp/semantics.c')
-rw-r--r-- | gcc/cp/semantics.c | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index d35319e..96999bf 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3334,6 +3334,31 @@ finalize_nrv (tree *tp, tree var, tree result) htab_delete (data.visited); } +/* Return the declaration for the function called by CALL_EXPR T, + TYPE is the class type of the clause decl. */ + +static tree +omp_clause_info_fndecl (tree t, tree type) +{ + tree ret = get_callee_fndecl (t); + + if (ret) + return ret; + + gcc_assert (TREE_CODE (t) == CALL_EXPR); + t = CALL_EXPR_FN (t); + STRIP_NOPS (t); + if (TREE_CODE (t) == OBJ_TYPE_REF) + { + t = cp_fold_obj_type_ref (t, type); + if (TREE_CODE (t) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL) + return TREE_OPERAND (t, 0); + } + + return NULL_TREE; +} + /* For all elements of CLAUSES, validate them vs OpenMP constraints. Remove any elements from the list that are invalid. */ @@ -3677,8 +3702,7 @@ finish_omp_clauses (tree clauses) if (TREE_CODE (t) == NOP_EXPR) t = TREE_OPERAND (t, 0); - t = get_callee_fndecl (t); - TREE_VEC_ELT (info, 0) = t; + TREE_VEC_ELT (info, 0) = get_callee_fndecl (t); } if ((need_default_ctor || need_copy_ctor) @@ -3700,8 +3724,7 @@ finish_omp_clauses (tree clauses) if (TREE_CODE (t) == NOP_EXPR) t = TREE_OPERAND (t, 0); - t = get_callee_fndecl (t); - TREE_VEC_ELT (info, 1) = t; + TREE_VEC_ELT (info, 1) = omp_clause_info_fndecl (t, inner_type); } if (need_copy_assignment @@ -3720,8 +3743,7 @@ finish_omp_clauses (tree clauses) if (TREE_CODE (t) == INDIRECT_REF) t = TREE_OPERAND (t, 0); - t = get_callee_fndecl (t); - TREE_VEC_ELT (info, 2) = t; + TREE_VEC_ELT (info, 2) = omp_clause_info_fndecl (t, inner_type); } if (errorcount != save_errorcount) |