diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 34 |
2 files changed, 34 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 419445c..9de4188 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-05-23 Jakub Jelinek <jakub@redhat.com> + + PR c++/36308 + * semantics.c (omp_clause_info_fndecl): New function. + (finish_omp_clauses): Use it. + 2008-05-21 Jakub Jelinek <jakub@redhat.com> PR c++/36023 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) |