]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcc/fold-const: remove fold_*_overflow_warnings
authorDaniel Barboza <daniel.barboza@oss.qualcomm.com>
Fri, 16 Jan 2026 16:11:05 +0000 (08:11 -0800)
committerDaniel Barboza <daniel.barboza@oss.qualcomm.com>
Sun, 31 May 2026 18:51:44 +0000 (15:51 -0300)
fold_undefer_overflow_warnings () is one of the last few places where
Wstrict_overflow warnings are issued.  It uses a
fold_deferring_overflow_warnings int to determine whether the warning should
be shown, a fold_defer_overflow_warnings helper that increments it,
a fold_deferred_overflow_warning string that stores the
deferred warning, an enum for the warning level of the deferred warning.

Remove all of them along with any related logic.

gcc/c-family/ChangeLog:

* c-common.cc (pointer_int_sum): Removed
fold_*_overflow_warnings uses.

gcc/c/ChangeLog:

* c-fold.cc (c_disable_warnings): Likewise.
(c_enable_warnings): Likewise.

gcc/ChangeLog:

* flags.h (issue_strict_overflow_warning): Removed.
* fold-const.cc (fold_defer_overflow_warnings): Removed.
(fold_undefer_overflow_warnings): Removed.
(fold_undefer_and_ignore_overflow_warnings): Removed.
(fold_deferring_overflow_warnings_p): Removed.
* fold-const.h (fold_defer_overflow_warnings): Removed.
(fold_undefer_overflow_warnings): Removed.
(fold_undefer_and_ignore_overflow_warnings): Removed.
(fold_deferring_overflow_warnings_p): Removed.
* gimple-fold.cc (fold_stmt_1): Removed
fold_*_overflow_warnings uses and all related logic.
* passes.cc (verify_interpass_invariants): Likewise.
(execute_one_ipa_transform_pass): Likewise.
(execute_one_pass): Likewise.
* tree-cfgcleanup.cc (cleanup_control_expr_graph): Likewise.
* tree-data-ref.cc (create_runtime_alias_checks): Likewise.
* tree-ssa-ccp.cc (evaluate_stmt): Likewise.
* tree-ssa-forwprop.cc (combine_cond_expr_cond): Likewise.
* tree-ssa-loop-niter.cc (expand_simple_operations): Likewise.
(number_of_iterations_exit_assumptions): Likewise.
(loop_niter_by_eval): Likewise.
(estimate_numbers_of_iterations): Likewise.
(loop_exits_before_overflow): Likewise.
* tree-ssa-threadedge.cc: Likewise.
* tree-vrp.cc (compare_values): Likewise.

14 files changed:
gcc/c-family/c-common.cc
gcc/c/c-fold.cc
gcc/flags.h
gcc/fold-const.cc
gcc/fold-const.h
gcc/gimple-fold.cc
gcc/passes.cc
gcc/tree-cfgcleanup.cc
gcc/tree-data-ref.cc
gcc/tree-ssa-ccp.cc
gcc/tree-ssa-forwprop.cc
gcc/tree-ssa-loop-niter.cc
gcc/tree-ssa-threadedge.cc
gcc/tree-vrp.cc

index 602b7bfa0346dcdf5b592bcde8c960f66a915aee..c410db9fde47ee5e2038b01d0c740ebf2c353c43 100644 (file)
@@ -3425,12 +3425,6 @@ pointer_int_sum (location_t loc, enum tree_code resultcode,
        }
     }
 
-  /* We are manipulating pointer values, so we don't need to warn
-     about relying on undefined signed overflow.  We disable the
-     warning here because we use integer types so fold won't know that
-     they are really pointers.  */
-  fold_defer_overflow_warnings ();
-
   /* If what we are about to multiply by the size of the elements
      contains a constant term, apply distributive law
      and multiply that constant term separately.
@@ -3479,8 +3473,6 @@ pointer_int_sum (location_t loc, enum tree_code resultcode,
 
       ret = fold_build_pointer_plus_loc (loc, ptrop, intop);
 
-      fold_undefer_and_ignore_overflow_warnings ();
-
       return ret;
     }
 
@@ -3509,8 +3501,6 @@ pointer_int_sum (location_t loc, enum tree_code resultcode,
 
   ret = fold_build_pointer_plus_loc (loc, ptrop, intop);
 
-  fold_undefer_and_ignore_overflow_warnings ();
-
   return ret;
 }
 \f
index 2dd04a223c316b9b8ee4a6c5ea4b3a9d07f5388e..40e8ae7972778045365620cedea54287c8058b0e 100644 (file)
@@ -40,7 +40,6 @@ c_disable_warnings (bool disable)
   if (disable)
     {
       ++c_inhibit_evaluation_warnings;
-      fold_defer_overflow_warnings ();
     }
 }
 
@@ -52,7 +51,6 @@ c_enable_warnings (bool enable)
   if (enable)
     {
       --c_inhibit_evaluation_warnings;
-      fold_undefer_and_ignore_overflow_warnings ();
     }
 }
 
index c92a7bdfa6f91f3376b0e13b12b4250a722abf4f..2b744be72a319ae27586df37253a929615a0245c 100644 (file)
@@ -113,9 +113,6 @@ extern class target_flag_state *this_target_flag_state;
 #define abi_version_at_least(N) \
   (flag_abi_version == 0 || flag_abi_version >= (N))
 
-/* Whether to emit an overflow warning whose code is C.  */
-#define issue_strict_overflow_warning(c) (warn_strict_overflow >= (int) (c))
-
 #endif /* ! in target library */
 
 #endif /* ! GCC_FLAGS_H */
index 7b04c74c8a32ed10f5922b901e905f4422624ff2..179c7e167a3f33cdf617d3d4df994840f1c3ff0f 100644 (file)
@@ -264,105 +264,6 @@ protected_set_expr_location_unshare (tree x, location_t loc)
     }
   return x;
 }
-\f
-/* This is nonzero if we should defer warnings about undefined
-   overflow.  This facility exists because these warnings are a
-   special case.  The code to estimate loop iterations does not want
-   to issue any warnings, since it works with expressions which do not
-   occur in user code.  Various bits of cleanup code call fold(), but
-   only use the result if it has certain characteristics (e.g., is a
-   constant); that code only wants to issue a warning if the result is
-   used.  */
-
-static int fold_deferring_overflow_warnings;
-
-/* If a warning about undefined overflow is deferred, this is the
-   warning.  Note that this may cause us to turn two warnings into
-   one, but that is fine since it is sufficient to only give one
-   warning per expression.  */
-
-static const char* fold_deferred_overflow_warning;
-
-/* If a warning about undefined overflow is deferred, this is the
-   level at which the warning should be emitted.  */
-
-static enum warn_strict_overflow_code fold_deferred_overflow_code;
-
-/* Start deferring overflow warnings.  We could use a stack here to
-   permit nested calls, but at present it is not necessary.  */
-
-void
-fold_defer_overflow_warnings (void)
-{
-  ++fold_deferring_overflow_warnings;
-}
-
-/* Stop deferring overflow warnings.  If there is a pending warning,
-   and ISSUE is true, then issue the warning if appropriate.  STMT is
-   the statement with which the warning should be associated (used for
-   location information); STMT may be NULL.  CODE is the level of the
-   warning--a warn_strict_overflow_code value.  This function will use
-   the smaller of CODE and the deferred code when deciding whether to
-   issue the warning.  CODE may be zero to mean to always use the
-   deferred code.  */
-
-void
-fold_undefer_overflow_warnings (bool issue, const gimple *stmt, int code)
-{
-  const char *warnmsg;
-  location_t locus;
-
-  gcc_assert (fold_deferring_overflow_warnings > 0);
-  --fold_deferring_overflow_warnings;
-  if (fold_deferring_overflow_warnings > 0)
-    {
-      if (fold_deferred_overflow_warning != NULL
-         && code != 0
-         && code < (int) fold_deferred_overflow_code)
-       fold_deferred_overflow_code = (enum warn_strict_overflow_code) code;
-      return;
-    }
-
-  warnmsg = fold_deferred_overflow_warning;
-  fold_deferred_overflow_warning = NULL;
-
-  if (!issue || warnmsg == NULL)
-    return;
-
-  if (warning_suppressed_p (stmt, OPT_Wstrict_overflow))
-    return;
-
-  /* Use the smallest code level when deciding to issue the
-     warning.  */
-  if (code == 0 || code > (int) fold_deferred_overflow_code)
-    code = fold_deferred_overflow_code;
-
-  if (!issue_strict_overflow_warning (code))
-    return;
-
-  if (stmt == NULL)
-    locus = input_location;
-  else
-    locus = gimple_location (stmt);
-  warning_at (locus, OPT_Wstrict_overflow, "%s", warnmsg);
-}
-
-/* Stop deferring overflow warnings, ignoring any deferred
-   warnings.  */
-
-void
-fold_undefer_and_ignore_overflow_warnings (void)
-{
-  fold_undefer_overflow_warnings (false, NULL, 0);
-}
-
-/* Whether we are deferring overflow warnings.  */
-
-bool
-fold_deferring_overflow_warnings_p (void)
-{
-  return fold_deferring_overflow_warnings > 0;
-}
 
 /* Return true if the built-in mathematical function specified by CODE
    is odd, i.e. -f(x) == f(-x).  */
index 77c3d7c6c5fb0e82ca344f8fd0d839df62d808e2..57d32b1b6ca2b6d0bd8cdacc91f4e0c2c73871d4 100644 (file)
@@ -99,10 +99,6 @@ extern tree fold_convert_loc (location_t, tree, tree);
 extern tree fold_ignored_result (tree);
 extern tree fold_abs_const (tree, tree);
 extern tree fold_indirect_ref_1 (location_t, tree, tree);
-extern void fold_defer_overflow_warnings (void);
-extern void fold_undefer_overflow_warnings (bool, const gimple *, int);
-extern void fold_undefer_and_ignore_overflow_warnings (void);
-extern bool fold_deferring_overflow_warnings_p (void);
 extern enum tree_code fold_div_compare (enum tree_code, tree, tree,
                                        tree *, tree *, bool *);
 extern bool operand_equal_p (const_tree, const_tree, unsigned int flags = 0);
index aa405f0842978da783d30d8dea213610ae4dffbd..dbe16bcb8117705be82b506f0db43b2bf7d86e42 100644 (file)
@@ -6736,9 +6736,7 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree),
 {
   bool changed = false;
   gimple *stmt = gsi_stmt (*gsi);
-  bool nowarning = warning_suppressed_p (stmt, OPT_Wstrict_overflow);
   unsigned i;
-  fold_defer_overflow_warnings ();
 
   /* First do required canonicalization of [TARGET_]MEM_REF addresses
      after propagation.
@@ -7013,9 +7011,6 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace, tree (*valueize) (tree),
     default:;
     }
 
-  stmt = gsi_stmt (*gsi);
-
-  fold_undefer_overflow_warnings (changed && !nowarning, stmt, 0);
   return changed;
 }
 
index 8b69ea5e69d45f0f208706f5653b03df7840f658..96c2456fe32d873b5fb9751b899205086fafdd6d 100644 (file)
@@ -2181,15 +2181,6 @@ execute_todo (unsigned int flags)
     df_finish_pass ((flags & TODO_df_verify) != 0);
 }
 
-/* Verify invariants that should hold between passes.  This is a place
-   to put simple sanity checks.  */
-
-static void
-verify_interpass_invariants (void)
-{
-  gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
-}
-
 /* Helper function. Verify that the properties has been turn into the
    properties expected by the pass.  */
 
@@ -2338,7 +2329,6 @@ execute_one_ipa_transform_pass (struct cgraph_node *node,
   /* Run post-pass cleanup.  */
   gcc_checking_assert (!(todo_after & TODO_verify_il));
   execute_todo (todo_after);
-  verify_interpass_invariants ();
 
   /* Stop timevar.  */
   if (pass->tv_id != TV_NONE)
@@ -2714,8 +2704,6 @@ execute_one_pass (opt_pass *pass)
        }
     }
 
-  verify_interpass_invariants ();
-
   /* Stop timevar.  */
   if (pass->tv_id != TV_NONE)
     timevar_pop (pass->tv_id);
index b05dd3b15a8bec4323acf03082c2b637efd06908..36a3d02f32f482bcebb2a8eee5b694d4c6750540 100644 (file)
@@ -173,7 +173,6 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
     {
       edge e;
       edge_iterator ei;
-      bool warned;
       tree val = NULL_TREE;
 
       /* Try to convert a switch with just a single non-default case to
@@ -185,7 +184,6 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
       if (gimple_code (stmt) == GIMPLE_COND)
        canonicalize_bool_cond (as_a<gcond*> (stmt), bb);
 
-      fold_defer_overflow_warnings ();
       switch (gimple_code (stmt))
        {
        case GIMPLE_COND:
@@ -207,24 +205,13 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
        }
       taken_edge = find_taken_edge (bb, val);
       if (!taken_edge)
-       {
-         fold_undefer_and_ignore_overflow_warnings ();
-         return false;
-       }
+       return false;
 
       /* Remove all the edges except the one that is always executed.  */
-      warned = false;
       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
        {
          if (e != taken_edge)
            {
-             if (!warned)
-               {
-                 fold_undefer_overflow_warnings
-                   (true, stmt, WARN_STRICT_OVERFLOW_CONDITIONAL);
-                 warned = true;
-               }
-
              taken_edge->probability += e->probability;
              remove_edge_and_dominated_blocks (e);
              retval = true;
@@ -232,8 +219,6 @@ cleanup_control_expr_graph (basic_block bb, gimple_stmt_iterator gsi)
          else
            ei_next (&ei);
        }
-      if (!warned)
-       fold_undefer_and_ignore_overflow_warnings ();
     }
   else
     taken_edge = single_succ_edge (bb);
index 11b3b82631510d076a57464a2f05a2b784a701ff..1114903784e5770a016a99180fa9ba42f5ed7eac 100644 (file)
@@ -2676,7 +2676,6 @@ create_runtime_alias_checks (class loop *loop,
 {
   tree part_cond_expr;
 
-  fold_defer_overflow_warnings ();
   for (const dr_with_seg_len_pair_t &alias_pair : alias_pairs)
     {
       gcc_assert (alias_pair.flags);
@@ -2694,7 +2693,6 @@ create_runtime_alias_checks (class loop *loop,
       else
        *cond_expr = part_cond_expr;
     }
-  fold_undefer_and_ignore_overflow_warnings ();
 }
 
 /* Check if OFFSET1 and OFFSET2 (DR_OFFSETs of some data-refs) are identical
index 425784be5badd3c5c913eef88176aadf2a9c3f93..cc1da6540e34cb2b096f10168d4dd5d13a7d60ad 100644 (file)
@@ -2263,7 +2263,6 @@ evaluate_stmt (gimple *stmt)
      not attempt to fold them, including builtins that may profit.  */
   if (likelyvalue == CONSTANT)
     {
-      fold_defer_overflow_warnings ();
       simplified = ccp_fold (stmt);
       if (simplified
          && TREE_CODE (simplified) == SSA_NAME)
@@ -2275,10 +2274,7 @@ evaluate_stmt (gimple *stmt)
            {
              ccp_prop_value_t *val = get_value (simplified);
              if (val && val->lattice_val != VARYING)
-               {
-                 fold_undefer_overflow_warnings (true, stmt, 0);
-                 return *val;
-               }
+               return *val;
            }
          else
            /* We may also not place a non-valueized copy in the lattice
@@ -2286,7 +2282,6 @@ evaluate_stmt (gimple *stmt)
            simplified = NULL_TREE;
        }
       is_constant = simplified && is_gimple_min_invariant (simplified);
-      fold_undefer_overflow_warnings (is_constant, stmt, 0);
       if (is_constant)
        {
          /* The statement produced a constant value.  */
index 412c10c1cb5f8836ae384ac64e936f7fdbf16607..6c94675e0aced7380b56e72f882fc672674724d3 100644 (file)
@@ -407,13 +407,9 @@ combine_cond_expr_cond (gimple *stmt, enum tree_code code, tree type,
 
   gcc_assert (TREE_CODE_CLASS (code) == tcc_comparison);
 
-  fold_defer_overflow_warnings ();
   t = fold_binary_loc (gimple_location (stmt), code, type, op0, op1);
   if (!t)
-    {
-      fold_undefer_overflow_warnings (false, NULL, 0);
-      return NULL_TREE;
-    }
+    return NULL_TREE;
 
   /* Require that we got a boolean type out if we put one in.  */
   gcc_assert (TREE_CODE (TREE_TYPE (t)) == TREE_CODE (type));
@@ -423,13 +419,7 @@ combine_cond_expr_cond (gimple *stmt, enum tree_code code, tree type,
 
   /* Bail out if we required an invariant but didn't get one.  */
   if (!t || (invariant_only && !is_gimple_min_invariant (t)))
-    {
-      fold_undefer_overflow_warnings (false, NULL, 0);
-      return NULL_TREE;
-    }
-
-  bool nowarn = warning_suppressed_p (stmt, OPT_Wstrict_overflow);
-  fold_undefer_overflow_warnings (!nowarn, stmt, 0);
+    return NULL_TREE;
 
   return t;
 }
index 3c7b36ca736497aeaaff44f124edac3bab37aadf..391fcbfb2e16c5489d972050e3214bc6072cfc9b 100644 (file)
@@ -2842,9 +2842,7 @@ expand_simple_operations (tree expr, tree stop, hash_map<tree, tree> &cache)
       if (!ret)
        return expr;
 
-      fold_defer_overflow_warnings ();
       ret = fold (ret);
-      fold_undefer_and_ignore_overflow_warnings ();
       return ret;
     }
 
@@ -3288,10 +3286,6 @@ number_of_iterations_exit_assumptions (class loop *loop, edge exit,
   if (iv0_niters && iv1_niters)
     return false;
 
-  /* We don't want to see undefined signed overflow warnings while
-     computing the number of iterations.  */
-  fold_defer_overflow_warnings ();
-
   iv0.base = expand_simple_operations (iv0.base);
   iv1.base = expand_simple_operations (iv1.base);
   bool body_from_caller = true;
@@ -3306,7 +3300,6 @@ number_of_iterations_exit_assumptions (class loop *loop, edge exit,
   if (!number_of_iterations_cond (loop, type, &iv0, code, &iv1, niter,
                                  only_exit_p, safe))
     {
-      fold_undefer_and_ignore_overflow_warnings ();
       return false;
     }
 
@@ -3349,8 +3342,6 @@ number_of_iterations_exit_assumptions (class loop *loop, edge exit,
          = simplify_using_initial_conditions (loop,
                                               niter->may_be_zero);
 
-  fold_undefer_and_ignore_overflow_warnings ();
-
   /* If NITER has simplified into a constant, update MAX.  */
   if (TREE_CODE (niter->niter) == INTEGER_CST)
     niter->max = wi::to_widest (niter->niter);
@@ -3747,9 +3738,6 @@ loop_niter_by_eval (class loop *loop, edge exit)
        }
     }
 
-  /* Don't issue signed overflow warnings.  */
-  fold_defer_overflow_warnings ();
-
   for (i = 0; i < MAX_ITERATIONS_TO_TRACK; i++)
     {
       for (j = 0; j < 2; j++)
@@ -3758,7 +3746,6 @@ loop_niter_by_eval (class loop *loop, edge exit)
       acnd = fold_binary (cmp, boolean_type_node, aval[0], aval[1]);
       if (acnd && integer_zerop (acnd))
        {
-         fold_undefer_and_ignore_overflow_warnings ();
          if (dump_file && (dump_flags & TDF_DETAILS))
            fprintf (dump_file,
                     "Proved that loop %d iterates %d times using brute force.\n",
@@ -3771,10 +3758,7 @@ loop_niter_by_eval (class loop *loop, edge exit)
          aval[j] = val[j];
          val[j] = get_val_for (next[j], val[j]);
          if (!is_gimple_min_invariant (val[j]))
-           {
-             fold_undefer_and_ignore_overflow_warnings ();
-             return chrec_dont_know;
-           }
+           return chrec_dont_know;
        }
 
       /* If the next iteration would use the same base values
@@ -3784,8 +3768,6 @@ loop_niter_by_eval (class loop *loop, edge exit)
        break;
     }
 
-  fold_undefer_and_ignore_overflow_warnings ();
-
   return chrec_dont_know;
 }
 
@@ -5242,14 +5224,8 @@ estimated_stmt_executions (class loop *loop, widest_int *nit)
 void
 estimate_numbers_of_iterations (function *fn)
 {
-  /* We don't want to issue signed overflow warnings while getting
-     loop iteration estimates.  */
-  fold_defer_overflow_warnings ();
-
   for (auto loop : loops_list (fn, 0))
     estimate_numbers_of_iterations (loop);
-
-  fold_undefer_and_ignore_overflow_warnings ();
 }
 
 /* Returns true if statement S1 dominates statement S2.  */
@@ -5394,9 +5370,6 @@ loop_exits_before_overflow (tree base, tree step,
   tree type = TREE_TYPE (step);
   tree unsigned_type, valid_niter;
 
-  /* Don't issue signed overflow warnings.  */
-  fold_defer_overflow_warnings ();
-
   /* Compute the number of iterations before we reach the bound of the
      type, and verify that the loop is exited before this occurs.  */
   unsigned_type = unsigned_type_for (type);
@@ -5428,20 +5401,13 @@ loop_exits_before_overflow (tree base, tree step,
                           wide_int_to_tree (TREE_TYPE (valid_niter),
                                             niter))) != NULL
       && integer_nonzerop (e))
-    {
-      fold_undefer_and_ignore_overflow_warnings ();
-      return true;
-    }
+    return true;
   if (at_stmt)
     for (bound = loop->bounds; bound; bound = bound->next)
       {
        if (n_of_executions_at_most (at_stmt, bound, valid_niter))
-         {
-           fold_undefer_and_ignore_overflow_warnings ();
-           return true;
-         }
+         return true;
       }
-  fold_undefer_and_ignore_overflow_warnings ();
 
   /* Try to prove loop is exited before {base, step} overflows with the
      help of analyzed loop control IV.  This is done only for IVs with
index 69e01c83e6749636c218a628717b7dc45ac1275a..ce757b40c9cf2679c41f0e55c1cb99a9e9310c6a 100644 (file)
@@ -500,18 +500,11 @@ jump_threader::simplify_control_stmt_condition_1
   gimple_cond_set_lhs (dummy_cond, op0);
   gimple_cond_set_rhs (dummy_cond, op1);
 
-  /* We absolutely do not care about any type conversions
-     we only care about a zero/nonzero value.  */
-  fold_defer_overflow_warnings ();
-
   tree res = fold_binary (cond_code, boolean_type_node, op0, op1);
   if (res)
     while (CONVERT_EXPR_P (res))
       res = TREE_OPERAND (res, 0);
 
-  fold_undefer_overflow_warnings ((res && is_gimple_min_invariant (res)),
-                                 stmt, WARN_STRICT_OVERFLOW_CONDITIONAL);
-
   /* If we have not simplified the condition down to an invariant,
      then use the pass specific callback to simplify the condition.  */
   if (!res
index 473e3da7bbc26c14c340bcfe3e0260cbe741b2e3..8f80fc6b69c59a616ade1e7502a7b4d5a4d382ed 100644 (file)
@@ -670,27 +670,18 @@ compare_values (tree val1, tree val2)
       if (operand_equal_p (val1, val2, 0))
        return 0;
 
-      fold_defer_overflow_warnings ();
-
       /* If VAL1 is a lower address than VAL2, return -1.  */
       tree t = fold_binary_to_constant (LT_EXPR, boolean_type_node, val1, val2);
       if (t && integer_onep (t))
-       {
-         fold_undefer_and_ignore_overflow_warnings ();
-         return -1;
-       }
+       return -1;
 
       /* If VAL1 is a higher address than VAL2, return +1.  */
       t = fold_binary_to_constant (LT_EXPR, boolean_type_node, val2, val1);
       if (t && integer_onep (t))
-       {
-         fold_undefer_and_ignore_overflow_warnings ();
-         return 1;
-       }
+       return 1;
 
       /* If VAL1 is different than VAL2, return +2.  */
       t = fold_binary_to_constant (NE_EXPR, boolean_type_node, val1, val2);
-      fold_undefer_and_ignore_overflow_warnings ();
       if (t && integer_onep (t))
        return 2;