]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
builtins.c (build_function_call_expr): Don't set TREE_SIDE_EFFECTS here.
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 26 Aug 2003 08:51:35 +0000 (08:51 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 26 Aug 2003 08:51:35 +0000 (08:51 +0000)
* builtins.c (build_function_call_expr): Don't set
TREE_SIDE_EFFECTS here.
* expr.c (emit_block_move_via_libcall): Likewise.
(clear_storage_via_libcall): Likewise.
* tree.c (build): Set TREE_SIDE_EFFECTS for non-const, non-pure
CALL_EXPRs.
cp:
* call.c (build_call): Don't set TREE_SIDE_EFFECTS here.
(build_new_method_call): Add goto finish.
* semantics.c (simplify_aggr_init_exprs_r): Don't set
TREE_SIDE_EFFECTS on a call.
testsuite:
* c++.dg/warn/noeffect3.C: New test.

From-SVN: r70802

gcc/ChangeLog
gcc/builtins.c
gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/semantics.c
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/tree.c

index a39a54da3dda608f471ef7bc083a7787a97d7d2b..147b68eb3c44f034fc6156c3331a15322cdf977d 100644 (file)
@@ -1,5 +1,12 @@
 2003-08-26  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * builtins.c (build_function_call_expr): Don't set
+       TREE_SIDE_EFFECTS here.
+       * expr.c (emit_block_move_via_libcall): Likewise.
+       (clear_storage_via_libcall): Likewise.
+       * tree.c (build): Set TREE_SIDE_EFFECTS for non-const, non-pure
+       CALL_EXPRs.
+       
        * gcse.c (is_too_expensive): New function.
        (gcse_main, delete_null_pointer_checks, bypass_jumps): Use it.
 
index dc999f722c8f0703f232609a14683ea856cb97d4..fea2a15d62ba0ec1c575907985d2166fa1970376 100644 (file)
@@ -6242,7 +6242,6 @@ build_function_call_expr (tree fn, tree arglist)
   call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
   call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
                     call_expr, arglist);
-  TREE_SIDE_EFFECTS (call_expr) = 1;
   return fold (call_expr);
 }
 
index c5823623a433c969492d2d7655a1fa1f1698d5dd..692937ea36aeecc84743805fee0318053b60ffc7 100644 (file)
@@ -1,3 +1,10 @@
+2003-08-26  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * call.c (build_call): Don't set TREE_SIDE_EFFECTS here.
+       (build_new_method_call): Add goto finish.
+       * semantics.c (simplify_aggr_init_exprs_r): Don't set
+       TREE_SIDE_EFFECTS on a call.
+
 2003-08-25  Richard Henderson  <rth@redhat.com>
 
        * cxx-pretty-print.c (pp_cxx_class_name): Remove unused function.
index 8440344689ab86d4330146d1f673c9884c49434e..a74fd63d556d993d2f1996041051a98fb682a85f 100644 (file)
@@ -303,10 +303,8 @@ build_call (tree function, tree parms)
                                    TREE_VALUE (tmp), t);
        }
 
-  function = build_nt (CALL_EXPR, function, parms, NULL_TREE);
+  function = build (CALL_EXPR, result_type, function, parms);
   TREE_HAS_CONSTRUCTOR (function) = is_constructor;
-  TREE_TYPE (function) = result_type;
-  TREE_SIDE_EFFECTS (function) = 1;
   TREE_NOTHROW (function) = nothrow;
   
   return function;
@@ -4918,7 +4916,7 @@ build_new_method_call (tree instance, tree fns, tree args,
     {
       call = build_field_call (instance_ptr, fns, args);
       if (call)
-       return call;
+       goto finish;
       error ("call to non-function `%D'", fns);
       return error_mark_node;
     }
@@ -5079,13 +5077,11 @@ build_new_method_call (tree instance, tree fns, tree args,
       if (!is_dummy_object (instance_ptr) && TREE_SIDE_EFFECTS (instance))
        call = build (COMPOUND_EXPR, TREE_TYPE (call), instance, call);
     }
-
+ finish:;
+  
   if (processing_template_decl && call != error_mark_node)
-    return build_min (CALL_EXPR,
-                     TREE_TYPE (call),
-                     build_min_nt (COMPONENT_REF,
-                                   orig_instance, 
-                                   orig_fns),
+    return build_min (CALL_EXPR, TREE_TYPE (call),
+                     build_min_nt (COMPONENT_REF, orig_instance, orig_fns),
                      orig_args);
   return call;
 }
index d5de76aad440a0efc98c3a048734bdc8583d5094..ee80beefad6a9189a00f0ca6c68c51349d8ccf03 100644 (file)
@@ -2796,7 +2796,6 @@ simplify_aggr_init_expr (tree *tp)
   call_expr = build (CALL_EXPR, 
                     TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
                     fn, args, NULL_TREE);
-  TREE_SIDE_EFFECTS (call_expr) = 1;
 
   if (style == arg)
     /* Tell the backend that we've added our return slot to the argument
index b7f71c627ba0f4dfa892a2f5d3f886424ce3bff9..52cdfee3938932f858e7667504988c3a4b76b128 100644 (file)
@@ -2006,7 +2006,6 @@ emit_block_move_via_libcall (rtx dst, rtx src, rtx size)
   call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
   call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
                     call_expr, arg_list, NULL_TREE);
-  TREE_SIDE_EFFECTS (call_expr) = 1;
 
   retval = expand_expr (call_expr, NULL_RTX, VOIDmode, 0);
 
@@ -3120,7 +3119,6 @@ clear_storage_via_libcall (rtx object, rtx size)
   call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
   call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
                     call_expr, arg_list, NULL_TREE);
-  TREE_SIDE_EFFECTS (call_expr) = 1;
 
   retval = expand_expr (call_expr, NULL_RTX, VOIDmode, 0);
 
index 4da71fc482ab4b4a63c0b02e205df4f98b6ccff0..608a27c7d1f9e8d66247b2c5f7be2dab63a67097 100644 (file)
@@ -1,3 +1,7 @@
+2003-08-26  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * c++.dg/warn/noeffect3.C: New test.
+
 2003-08-25  Janis Johnson  <janis187@us.ibm.com>
 
        * gcc.dg/compat/vector-1_x.c: Compile with -w.
index a12df1cb9f0dfe578f68559301ed0e0bcb0de67c..df074e85510f3b8269db35fe742d612b65c84c3a 100644 (file)
@@ -2378,6 +2378,17 @@ build (enum tree_code code, tree tt, ...)
   va_end (p);
 
   TREE_CONSTANT (t) = constant;
+  
+  if (code == CALL_EXPR && !TREE_SIDE_EFFECTS (t))
+    {
+      /* Calls have side-effects, except those to const or
+        pure functions.  */
+      tree fn = get_callee_fndecl (t);
+
+      if (!fn || (!DECL_IS_PURE (fn) && !TREE_READONLY (fn)))
+       TREE_SIDE_EFFECTS (t) = 1;
+    }
+
   return t;
 }