semantics.c (finish_omp_clauses): Strip a NOP_EXPR if constructors and destructors return this.

* semantics.c (finish_omp_clauses): Strip a NOP_EXPR if
	constructors and destructors return this.

From-SVN: r127499
This commit is contained in:
Mark Mitchell 2007-08-15 00:02:44 +00:00 committed by Kazu Hirata
parent e7303e85ae
commit 67f9922bb0
2 changed files with 27 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2007-08-14 Mark Mitchell <mark@codesourcery.com>
* semantics.c (finish_omp_clauses): Strip a NOP_EXPR if
constructors and destructors return this.
2007-08-14 Paolo Carlini <pcarlini@suse.de>
PR c++/27211

View File

@ -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;
}