(c_expand_return): Set TREE_SIDE_EFFECTS for the MODIFY_EXPR that we make.
authorRichard Stallman <rms@gnu.org>
Sun, 18 Jul 1993 20:27:18 +0000 (20:27 +0000)
committerRichard Stallman <rms@gnu.org>
Sun, 18 Jul 1993 20:27:18 +0000 (20:27 +0000)
(build_unary_op): Support CONJ_EXPR.
Change BIT_NOT_EXPR to CONJ_EXPR if arg is complex.

From-SVN: r4939

gcc/c-typeck.c

index af934e373e2b40ea5548cdf0cdbe274667d257b8..ab2b9216533c58f2e18f90b22679ce738891ac17 100644 (file)
@@ -3029,7 +3029,13 @@ build_unary_op (code, xarg, noconvert)
       break;
 
     case BIT_NOT_EXPR:
-      if (typecode != INTEGER_TYPE)
+      if (typecode == COMPLEX_TYPE)
+       {
+         code = CONJ_EXPR;
+         if (!noconvert)
+           arg = default_conversion (arg);
+       }
+      else if (typecode != INTEGER_TYPE)
         errstring = "wrong type argument to bit-complement";
       else if (!noconvert)
        arg = default_conversion (arg);
@@ -3043,6 +3049,15 @@ build_unary_op (code, xarg, noconvert)
        arg = default_conversion (arg);
       break;
 
+    case CONJ_EXPR:
+      /* Conjugating a real value is a no-op, but allow it anyway.  */
+      if (!(typecode == INTEGER_TYPE || typecode == REAL_TYPE
+           || typecode == COMPLEX_TYPE))
+       errstring = "wrong type argument to conjugation";
+      else if (!noconvert)
+       arg = default_conversion (arg);
+      break;
+
     case TRUTH_NOT_EXPR:
       if (typecode != INTEGER_TYPE
          && typecode != REAL_TYPE && typecode != POINTER_TYPE
@@ -5800,6 +5815,7 @@ c_expand_return (retval)
       tree res = DECL_RESULT (current_function_decl);
       t = build (MODIFY_EXPR, TREE_TYPE (res),
                 res, convert (TREE_TYPE (res), t));
+      TREE_SIDE_EFFECTS (t) = 1;
       expand_return (t);
       current_function_returns_value = 1;
     }