From 67f9922bb02e5b16b335e88d3dd12dba559c167f Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 15 Aug 2007 00:02:44 +0000 Subject: 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 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/semantics.c | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b9fe07f..e632aac 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 2a4fa37..9d0f9df 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; } -- cgit v1.1