Commit 67f9922b by Mark Mitchell Committed by Kazu Hirata

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
parent e7303e85
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
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment