bug-guile
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] fix jump-misses-init warnings


From: Giuseppe Scrivano
Subject: [PATCH] fix jump-misses-init warnings
Date: Fri, 04 Sep 2009 16:36:50 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.50 (gnu/linux)

Hello!

I reported some problems compiling guile with new versions of GCC.  The
reason of these problems is that new GCC versions check for declaration
in the current scope that are missed by a goto.

This is the GCC inline code describing the jump-misses-init warning:

  /* If there are any decls in label_vars->decls_in_scope, then this
     goto has missed the declaration of the decl.  This happens for a
     case like
       int i = 1;
      lab:
       ...
       goto lab;
     Issue a warning or error.  */

It is exactly the pattern present in some files, causing the compiling
failure because warnings are treated as errors:

In file included from eval.c:4148:0:
eval.i.c: In function ‘deval’:
eval.i.c:1104:2: error: jump skips variable initialization
eval.i.c:1043:6: note: label ‘handle_a_macro’ defined here
eval.i.c:1011:8: note: ‘orig_sym’ declared here


My proposal is to move such variables causing this warning to the upper
scope as in the attached patch.

I have checked if my changes introduced regressions ("make check"), but
all tests were completed successfully.

Cheers,
Giuseppe



>From 234fc0860ba35a7e5da714586bdf4b9244e8dffc Mon Sep 17 00:00:00 2001
From: Giuseppe Scrivano <address@hidden>
Date: Fri, 4 Sep 2009 16:22:07 +0200
Subject: [PATCH] Avoid the jump-misses-init compiler warning

* libguile/conv-uinteger.i.c (SCM_TO_TYPE_PROTO): Move the declaration
of `n' to the upper scope and rename other variables with the same name.

* libguile/eval.i.c (dispatch): Do the same with `orig_sym'.
(SCM_GPROC1): Do the same with `xx'.
(scm_max): Likewise.
(scm_min): Likewise.
(scm_i_divide): Likewise.

* srfi/srfi-1.c (scm_srfi1_filter_map): Do the same with `proc_tramp'.
(scm_srfi1_list_index): Do the same with `pred_tramp'.
---
 libguile/conv-uinteger.i.c |   27 ++++++++++---------
 libguile/eval.i.c          |    3 +-
 libguile/numbers.c         |   60 +++++++++++++++++++++++--------------------
 srfi/srfi-1.c              |   20 ++++++++------
 4 files changed, 59 insertions(+), 51 deletions(-)

diff --git a/libguile/conv-uinteger.i.c b/libguile/conv-uinteger.i.c
index 52f49f7..b08fdab 100644
--- a/libguile/conv-uinteger.i.c
+++ b/libguile/conv-uinteger.i.c
@@ -26,9 +26,10 @@
 TYPE
 SCM_TO_TYPE_PROTO (SCM val)
 {
+  scm_t_signed_bits n;
   if (SCM_I_INUMP (val))
     {
-      scm_t_signed_bits n = SCM_I_INUM (val);
+      n = SCM_I_INUM (val);
       if (n >= 0
          && ((scm_t_uintmax)n) >= TYPE_MIN && ((scm_t_uintmax)n) <= TYPE_MAX)
        return n;
@@ -49,17 +50,17 @@ SCM_TO_TYPE_PROTO (SCM val)
        {
          if (mpz_fits_ulong_p (SCM_I_BIG_MPZ (val)))
            {
-             unsigned long n = mpz_get_ui (SCM_I_BIG_MPZ (val));
+             unsigned long nn = mpz_get_ui (SCM_I_BIG_MPZ (val));
 #if SIZEOF_TYPE != 0 && SIZEOF_TYPE > SCM_SIZEOF_LONG
-             return n;
+             return nn;
 #else
 
 #if TYPE_MIN == 0 
-              if (n <= TYPE_MAX)
-                return n;
+              if (nn <= TYPE_MAX)
+                return nn;
 #else /* TYPE_MIN != 0 */
-              if (n >= TYPE_MIN && n <= TYPE_MAX)
-                return n;
+              if (nn >= TYPE_MIN && nn <= TYPE_MAX)
+                return nn;
 #endif /* TYPE_MIN != 0 */
               else
                 goto out_of_range;
@@ -71,7 +72,7 @@ SCM_TO_TYPE_PROTO (SCM val)
        }
       else
        {
-         scm_t_uintmax n;
+         scm_t_uintmax nn;
          size_t count;
 
          if (mpz_sgn (SCM_I_BIG_MPZ (val)) < 0)
@@ -81,14 +82,14 @@ SCM_TO_TYPE_PROTO (SCM val)
              > CHAR_BIT*sizeof (TYPE))
            goto out_of_range;
          
-         mpz_export (&n, &count, 1, sizeof (TYPE), 0, 0, SCM_I_BIG_MPZ (val));
+         mpz_export (&nn, &count, 1, sizeof (TYPE), 0, 0, SCM_I_BIG_MPZ (val));
 
 #if TYPE_MIN == 0
-         if (n <= TYPE_MAX)
-           return n;
+         if (nn <= TYPE_MAX)
+           return nn;
 #else /* TYPE_MIN != 0 */
-         if (n >= TYPE_MIN && n <= TYPE_MAX)
-           return n;
+         if (nn >= TYPE_MIN && nn <= TYPE_MAX)
+           return nn;
 #endif /* TYPE_MIN != 0 */
           else
             goto out_of_range;
diff --git a/libguile/eval.i.c b/libguile/eval.i.c
index 25abf6c..d0f669d 100644
--- a/libguile/eval.i.c
+++ b/libguile/eval.i.c
@@ -1000,6 +1000,7 @@ dispatch:
     }
   else
     {
+      SCM orig_sym;
       if (SCM_VARIABLEP (SCM_CAR (x)))
         proc = SCM_VARIABLE_REF (SCM_CAR (x));
       else if (SCM_ILOCP (SCM_CAR (x)))
@@ -1008,7 +1009,7 @@ dispatch:
        proc = CEVAL (SCM_CAR (x), env);
       else if (scm_is_symbol (SCM_CAR (x)))
        {
-         SCM orig_sym = SCM_CAR (x);
+         orig_sym = SCM_CAR (x);
          {
            SCM *location = scm_lookupcar1 (x, env, 1);
            if (location == NULL)
diff --git a/libguile/numbers.c b/libguile/numbers.c
index 5812576..bd3d2c0 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -3460,10 +3460,11 @@ SCM_GPROC1 (s_less_p, "<", scm_tc7_rpsubr, scm_less_p, 
g_less_p);
 SCM
 scm_less_p (SCM x, SCM y)
 {
+  long xx;
  again:
   if (SCM_I_INUMP (x))
     {
-      long xx = SCM_I_INUM (x);
+      xx = SCM_I_INUM (x);
       if (SCM_I_INUMP (y))
        {
          long yy = SCM_I_INUM (y);
@@ -3723,6 +3724,7 @@ SCM_GPROC1 (s_max, "max", scm_tc7_asubr, scm_max, g_max);
 SCM
 scm_max (SCM x, SCM y)
 {
+  long xx;
   if (SCM_UNBNDP (y))
     {
       if (SCM_UNBNDP (x))
@@ -3735,7 +3737,7 @@ scm_max (SCM x, SCM y)
   
   if (SCM_I_INUMP (x))
     {
-      long xx = SCM_I_INUM (x);
+      xx = SCM_I_INUM (x);
       if (SCM_I_INUMP (y))
        {
          long yy = SCM_I_INUM (y);
@@ -3777,12 +3779,12 @@ scm_max (SCM x, SCM y)
        }
       else if (SCM_REALP (y))
        {
-          /* if y==NaN then xx>yy is false, so we return the NaN y */
-          double xx, yy;
+          /* if y==NaN then xxd>yyd is false, so we return the NaN y */
+          double xxd, yyd;
         big_real:
-          xx = scm_i_big2dbl (x);
-          yy = SCM_REAL_VALUE (y);
-         return (xx > yy ? scm_from_double (xx) : y);
+          xxd = scm_i_big2dbl (x);
+          yyd = SCM_REAL_VALUE (y);
+         return (xxd > yyd ? scm_from_double (xxd) : y);
        }
       else if (SCM_FRACTIONP (y))
        {
@@ -3810,14 +3812,14 @@ scm_max (SCM x, SCM y)
             if y==NaN then ">" is false and we return NaN
             calling isnan is unavoidable, since it's the only way to know
             which of x or y causes any compares to be false */
-         double xx = SCM_REAL_VALUE (x);
-         return (xisnan (xx) || xx > SCM_REAL_VALUE (y)) ? x : y;
+         double xxd = SCM_REAL_VALUE (x);
+         return (xisnan (xxd) || xxd > SCM_REAL_VALUE (y)) ? x : y;
        }
       else if (SCM_FRACTIONP (y))
        {
-         double yy = scm_i_fraction2double (y);
-         double xx = SCM_REAL_VALUE (x);
-         return (xx < yy) ? scm_from_double (yy) : x;
+         double yyd = scm_i_fraction2double (y);
+         double xxd = SCM_REAL_VALUE (x);
+         return (xxd < yyd) ? scm_from_double (yyd) : x;
        }
       else
        SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max);
@@ -3834,8 +3836,8 @@ scm_max (SCM x, SCM y)
        }
       else if (SCM_REALP (y))
        {
-         double xx = scm_i_fraction2double (x);
-         return (xx < SCM_REAL_VALUE (y)) ? y : scm_from_double (xx);
+         double xxd = scm_i_fraction2double (x);
+         return (xxd < SCM_REAL_VALUE (y)) ? y : scm_from_double (xxd);
        }
       else if (SCM_FRACTIONP (y))
        {
@@ -3855,6 +3857,7 @@ SCM_GPROC1 (s_min, "min", scm_tc7_asubr, scm_min, g_min);
 SCM
 scm_min (SCM x, SCM y)
 {
+  long xx;
   if (SCM_UNBNDP (y))
     {
       if (SCM_UNBNDP (x))
@@ -3867,7 +3870,7 @@ scm_min (SCM x, SCM y)
   
   if (SCM_I_INUMP (x))
     {
-      long xx = SCM_I_INUM (x);
+      xx = SCM_I_INUM (x);
       if (SCM_I_INUMP (y))
        {
          long yy = SCM_I_INUM (y);
@@ -3909,12 +3912,12 @@ scm_min (SCM x, SCM y)
        }
       else if (SCM_REALP (y))
        {
-          /* if y==NaN then xx<yy is false, so we return the NaN y */
-          double xx, yy;
+          /* if y==NaN then xxd<yyd is false, so we return the NaN y */
+          double xxd, yyd;
         big_real:
-          xx = scm_i_big2dbl (x);
-          yy = SCM_REAL_VALUE (y);
-         return (xx < yy ? scm_from_double (xx) : y);
+          xxd = scm_i_big2dbl (x);
+          yyd = SCM_REAL_VALUE (y);
+         return (xxd < yyd ? scm_from_double (xxd) : y);
        }
       else if (SCM_FRACTIONP (y))
        {
@@ -3942,14 +3945,14 @@ scm_min (SCM x, SCM y)
             if y==NaN then "<" is false and we return NaN
             calling isnan is unavoidable, since it's the only way to know
             which of x or y causes any compares to be false */
-         double xx = SCM_REAL_VALUE (x);
-         return (xisnan (xx) || xx < SCM_REAL_VALUE (y)) ? x : y;
+         double xxd = SCM_REAL_VALUE (x);
+         return (xisnan (xxd) || xxd < SCM_REAL_VALUE (y)) ? x : y;
        }
       else if (SCM_FRACTIONP (y))
        {
-         double yy = scm_i_fraction2double (y);
-         double xx = SCM_REAL_VALUE (x);
-         return (yy < xx) ? scm_from_double (yy) : x;
+         double yyd = scm_i_fraction2double (y);
+         double xxd = SCM_REAL_VALUE (x);
+         return (yyd < xxd) ? scm_from_double (yyd) : x;
        }
       else
        SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min);
@@ -3966,8 +3969,8 @@ scm_min (SCM x, SCM y)
        }
       else if (SCM_REALP (y))
        {
-         double xx = scm_i_fraction2double (x);
-         return (SCM_REAL_VALUE (y) < xx) ? y : scm_from_double (xx);
+         double xxd = scm_i_fraction2double (x);
+         return (SCM_REAL_VALUE (y) < xxd) ? y : scm_from_double (xxd);
        }
       else if (SCM_FRACTIONP (y))
        {
@@ -4648,6 +4651,7 @@ static SCM
 scm_i_divide (SCM x, SCM y, int inexact)
 {
   double a;
+  long xx;
 
   if (SCM_UNLIKELY (SCM_UNBNDP (y)))
     {
@@ -4711,7 +4715,7 @@ scm_i_divide (SCM x, SCM y, int inexact)
 
   if (SCM_LIKELY (SCM_I_INUMP (x)))
     {
-      long xx = SCM_I_INUM (x);
+      xx = SCM_I_INUM (x);
       if (SCM_LIKELY (SCM_I_INUMP (y)))
        {
          long yy = SCM_I_INUM (y);
diff --git a/srfi/srfi-1.c b/srfi/srfi-1.c
index 02f46fc..5ef35f0 100644
--- a/srfi/srfi-1.c
+++ b/srfi/srfi-1.c
@@ -809,6 +809,7 @@ SCM_DEFINE (scm_srfi1_filter_map, "filter-map", 2, 0, 1,
 {
   SCM  ret, *loc, elem, newcell, lst;
   int  argnum;
+  scm_t_trampoline_1 proc_tramp;
 
   SCM_VALIDATE_REST_ARGUMENT (rest);
 
@@ -818,7 +819,7 @@ SCM_DEFINE (scm_srfi1_filter_map, "filter-map", 2, 0, 1,
   if (scm_is_null (rest))
     {
       /* one list */
-      scm_t_trampoline_1 proc_tramp = scm_trampoline_1 (proc);
+      proc_tramp = scm_trampoline_1 (proc);
       SCM_ASSERT (proc_tramp, proc, SCM_ARG1, FUNC_NAME);
 
       for ( ; scm_is_pair (list1); list1 = SCM_CDR (list1))
@@ -840,9 +841,9 @@ SCM_DEFINE (scm_srfi1_filter_map, "filter-map", 2, 0, 1,
   else if (scm_is_null (SCM_CDR (rest)))
     {
       /* two lists */
-      scm_t_trampoline_2 proc_tramp = scm_trampoline_2 (proc);
+      scm_t_trampoline_2 proc_tramp2 = scm_trampoline_2 (proc);
       SCM list2 = SCM_CAR (rest);
-      SCM_ASSERT (proc_tramp, proc, SCM_ARG1, FUNC_NAME);
+      SCM_ASSERT (proc_tramp2, proc, SCM_ARG1, FUNC_NAME);
 
       for (;;)
         {
@@ -854,7 +855,7 @@ SCM_DEFINE (scm_srfi1_filter_map, "filter-map", 2, 0, 1,
               argnum = 3;
               goto check_lst_and_done;
             }
-          elem = proc_tramp (proc, SCM_CAR (list1), SCM_CAR (list2));
+          elem = proc_tramp2 (proc, SCM_CAR (list1), SCM_CAR (list2));
           if (scm_is_true (elem))
             {
               newcell = scm_cons (elem, SCM_EOL);
@@ -1112,12 +1113,13 @@ SCM_DEFINE (scm_srfi1_list_index, "list-index", 2, 0, 1,
   long  n = 0;
   SCM   lst;
   int   argnum;
+  scm_t_trampoline_1 pred_tramp;
   SCM_VALIDATE_REST_ARGUMENT (rest);
 
   if (scm_is_null (rest))
     {
       /* one list */
-      scm_t_trampoline_1 pred_tramp = scm_trampoline_1 (pred);
+      pred_tramp = scm_trampoline_1 (pred);
       SCM_ASSERT (pred_tramp, pred, SCM_ARG1, FUNC_NAME);
 
       for ( ; scm_is_pair (list1); n++, list1 = SCM_CDR (list1))
@@ -1133,8 +1135,8 @@ SCM_DEFINE (scm_srfi1_list_index, "list-index", 2, 0, 1,
     {
       /* two lists */
       SCM list2 = SCM_CAR (rest);
-      scm_t_trampoline_2 pred_tramp = scm_trampoline_2 (pred);
-      SCM_ASSERT (pred_tramp, pred, SCM_ARG1, FUNC_NAME);
+      scm_t_trampoline_2 pred_tramp2 = scm_trampoline_2 (pred);
+      SCM_ASSERT (pred_tramp2, pred, SCM_ARG1, FUNC_NAME);
 
       for ( ; ; n++)
         {
@@ -1146,8 +1148,8 @@ SCM_DEFINE (scm_srfi1_list_index, "list-index", 2, 0, 1,
               argnum = 3;
               break;
             }
-          if (scm_is_true (pred_tramp (pred,
-                                       SCM_CAR (list1), SCM_CAR (list2))))
+          if (scm_is_true (pred_tramp2 (pred,
+                                       SCM_CAR (list1), SCM_CAR (list2))))
             return SCM_I_MAKINUM (n);
 
           list1 = SCM_CDR (list1);
-- 
1.6.3.3





reply via email to

[Prev in Thread] Current Thread [Next in Thread]