* semantics.c (finish_omp_clauses): Strip a NOP_EXPR if
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Aug 2007 00:02:44 +0000 (00:02 +0000)
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 15 Aug 2007 00:02:44 +0000 (00:02 +0000)
constructors and destructors return this.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127499 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/semantics.c

index b9fe07f..e632aac 100644 (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
index 2a4fa37..9d0f9df 100644 (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;
            }