diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b9fe07f18a5..e632aacedc1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2007-08-14 Mark Mitchell + + * semantics.c (finish_omp_clauses): Strip a NOP_EXPR if + constructors and destructors return this. + 2007-08-14 Paolo Carlini PR c++/27211 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 2a4fa375118..9d0f9df05d2 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3665,6 +3665,17 @@ finish_omp_clauses (tree clauses) t = build_special_member_call (NULL_TREE, complete_ctor_identifier, t, inner_type, LOOKUP_NORMAL); + + if (targetm.cxx.cdtor_returns_this ()) + /* Because constructors and destructors return this, + the call will have been cast to "void". Remove the + cast here. We would like to use STRIP_NOPS, but it + wouldn't work here because TYPE_MODE (t) and + TYPE_MODE (TREE_OPERAND (t, 0)) are different. + They are VOIDmode and Pmode, respectively. */ + if (TREE_CODE (t) == NOP_EXPR) + t = TREE_OPERAND (t, 0); + t = get_callee_fndecl (t); TREE_VEC_ELT (info, 0) = t; } @@ -3676,6 +3687,17 @@ finish_omp_clauses (tree clauses) t = build1 (INDIRECT_REF, inner_type, t); t = build_special_member_call (t, complete_dtor_identifier, NULL, inner_type, LOOKUP_NORMAL); + + if (targetm.cxx.cdtor_returns_this ()) + /* Because constructors and destructors return this, + the call will have been cast to "void". Remove the + cast here. We would like to use STRIP_NOPS, but it + wouldn't work here because TYPE_MODE (t) and + TYPE_MODE (TREE_OPERAND (t, 0)) are different. + They are VOIDmode and Pmode, respectively. */ + if (TREE_CODE (t) == NOP_EXPR) + t = TREE_OPERAND (t, 0); + t = get_callee_fndecl (t); TREE_VEC_ELT (info, 1) = t; }