Browse Source

'-Wconversion' extended to all options of Lua numbers

Roberto Ierusalimschy 1 năm trước cách đây
mục cha
commit
f2206b2abe
8 tập tin đã thay đổi với 50 bổ sung39 xóa
  1. 3 1
      llimits.h
  2. 3 3
      lmem.c
  3. 1 1
      lmem.h
  4. 5 4
      lstrlib.c
  5. 20 12
      ltablib.c
  6. 14 14
      ltests.c
  7. 3 3
      lutf8lib.c
  8. 1 1
      testes/strings.lua

+ 3 - 1
llimits.h

@@ -163,13 +163,15 @@ typedef LUAI_UACINT l_uacInt;
 */
 */
 #define ct_diff2sz(df)	((size_t)(df))
 #define ct_diff2sz(df)	((size_t)(df))
 
 
+/* ptrdiff_t to lua_Integer */
+#define ct_diff2S(df)	cast_st2S(ct_diff2sz(df))
+
 /*
 /*
 ** Special type equivalent to '(void*)' for functions (to suppress some
 ** Special type equivalent to '(void*)' for functions (to suppress some
 ** warnings when converting function pointers)
 ** warnings when converting function pointers)
 */
 */
 typedef void (*voidf)(void);
 typedef void (*voidf)(void);
 
 
-
 /*
 /*
 ** Macro to convert pointer-to-void* to pointer-to-function. This cast
 ** Macro to convert pointer-to-void* to pointer-to-function. This cast
 ** is undefined according to ISO C, but POSIX assumes that it works.
 ** is undefined according to ISO C, but POSIX assumes that it works.

+ 3 - 3
lmem.c

@@ -126,10 +126,10 @@ void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize,
 ** error.
 ** error.
 */
 */
 void *luaM_shrinkvector_ (lua_State *L, void *block, int *size,
 void *luaM_shrinkvector_ (lua_State *L, void *block, int *size,
-                          int final_n, int size_elem) {
+                          int final_n, unsigned size_elem) {
   void *newblock;
   void *newblock;
-  size_t oldsize = cast_sizet((*size) * size_elem);
-  size_t newsize = cast_sizet(final_n * size_elem);
+  size_t oldsize = cast_sizet(*size) * size_elem;
+  size_t newsize = cast_sizet(final_n) * size_elem;
   lua_assert(newsize <= oldsize);
   lua_assert(newsize <= oldsize);
   newblock = luaM_saferealloc_(L, block, oldsize, newsize);
   newblock = luaM_saferealloc_(L, block, oldsize, newsize);
   *size = final_n;
   *size = final_n;

+ 1 - 1
lmem.h

@@ -88,7 +88,7 @@ LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int nelems,
                                int *size, unsigned size_elem, int limit,
                                int *size, unsigned size_elem, int limit,
                                const char *what);
                                const char *what);
 LUAI_FUNC void *luaM_shrinkvector_ (lua_State *L, void *block, int *nelem,
 LUAI_FUNC void *luaM_shrinkvector_ (lua_State *L, void *block, int *nelem,
-                                    int final_n, int size_elem);
+                                    int final_n, unsigned size_elem);
 LUAI_FUNC void *luaM_malloc_ (lua_State *L, size_t size, int tag);
 LUAI_FUNC void *luaM_malloc_ (lua_State *L, size_t size, int tag);
 
 
 #endif
 #endif

+ 5 - 4
lstrlib.c

@@ -704,7 +704,8 @@ static ptrdiff_t get_onecapture (MatchState *ms, int i, const char *s,
     if (l_unlikely(capl == CAP_UNFINISHED))
     if (l_unlikely(capl == CAP_UNFINISHED))
       luaL_error(ms->L, "unfinished capture");
       luaL_error(ms->L, "unfinished capture");
     else if (capl == CAP_POSITION)
     else if (capl == CAP_POSITION)
-      lua_pushinteger(ms->L, (ms->capture[i].init - ms->src_init) + 1);
+      lua_pushinteger(ms->L,
+          ct_diff2S(ms->capture[i].init - ms->src_init) + 1);
     return capl;
     return capl;
   }
   }
 }
 }
@@ -775,7 +776,7 @@ static int str_find_aux (lua_State *L, int find) {
     /* do a plain search */
     /* do a plain search */
     const char *s2 = lmemfind(s + init, ls - init, p, lp);
     const char *s2 = lmemfind(s + init, ls - init, p, lp);
     if (s2) {
     if (s2) {
-      lua_pushinteger(L, (s2 - s) + 1);
+      lua_pushinteger(L, ct_diff2S(s2 - s) + 1);
       lua_pushinteger(L, cast_st2S(ct_diff2sz(s2 - s) + lp));
       lua_pushinteger(L, cast_st2S(ct_diff2sz(s2 - s) + lp));
       return 2;
       return 2;
     }
     }
@@ -793,8 +794,8 @@ static int str_find_aux (lua_State *L, int find) {
       reprepstate(&ms);
       reprepstate(&ms);
       if ((res=match(&ms, s1, p)) != NULL) {
       if ((res=match(&ms, s1, p)) != NULL) {
         if (find) {
         if (find) {
-          lua_pushinteger(L, (s1 - s) + 1);  /* start */
-          lua_pushinteger(L, res - s);   /* end */
+          lua_pushinteger(L, ct_diff2S(s1 - s) + 1);  /* start */
+          lua_pushinteger(L, ct_diff2S(res - s));   /* end */
           return push_captures(&ms, NULL, 0) + 2;
           return push_captures(&ms, NULL, 0) + 2;
         }
         }
         else
         else

+ 20 - 12
ltablib.c

@@ -231,10 +231,18 @@ static int tunpack (lua_State *L) {
 */
 */
 
 
 
 
-/* type for array indices */
+/*
+** Type for array indices. These indices are always limited by INT_MAX,
+** so it is safe to cast them to lua_Integer even for Lua 32 bits.
+*/
 typedef unsigned int IdxT;
 typedef unsigned int IdxT;
 
 
 
 
+/* Versions of lua_seti/lua_geti specialized for IdxT */
+#define geti(L,idt,idx)	lua_geti(L, idt, l_castU2S(idx))
+#define seti(L,idt,idx)	lua_seti(L, idt, l_castU2S(idx))
+
+
 /*
 /*
 ** Produce a "random" 'unsigned int' to randomize pivot choice. This
 ** Produce a "random" 'unsigned int' to randomize pivot choice. This
 ** macro is used only when 'sort' detects a big imbalance in the result
 ** macro is used only when 'sort' detects a big imbalance in the result
@@ -251,8 +259,8 @@ typedef unsigned int IdxT;
 
 
 
 
 static void set2 (lua_State *L, IdxT i, IdxT j) {
 static void set2 (lua_State *L, IdxT i, IdxT j) {
-  lua_seti(L, 1, i);
-  lua_seti(L, 1, j);
+  seti(L, 1, i);
+  seti(L, 1, j);
 }
 }
 
 
 
 
@@ -289,14 +297,14 @@ static IdxT partition (lua_State *L, IdxT lo, IdxT up) {
   /* loop invariant: a[lo .. i] <= P <= a[j .. up] */
   /* loop invariant: a[lo .. i] <= P <= a[j .. up] */
   for (;;) {
   for (;;) {
     /* next loop: repeat ++i while a[i] < P */
     /* next loop: repeat ++i while a[i] < P */
-    while ((void)lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) {
+    while ((void)geti(L, 1, ++i), sort_comp(L, -1, -2)) {
       if (l_unlikely(i == up - 1))  /* a[i] < P  but a[up - 1] == P  ?? */
       if (l_unlikely(i == up - 1))  /* a[i] < P  but a[up - 1] == P  ?? */
         luaL_error(L, "invalid order function for sorting");
         luaL_error(L, "invalid order function for sorting");
       lua_pop(L, 1);  /* remove a[i] */
       lua_pop(L, 1);  /* remove a[i] */
     }
     }
     /* after the loop, a[i] >= P and a[lo .. i - 1] < P */
     /* after the loop, a[i] >= P and a[lo .. i - 1] < P */
     /* next loop: repeat --j while P < a[j] */
     /* next loop: repeat --j while P < a[j] */
-    while ((void)lua_geti(L, 1, --j), sort_comp(L, -3, -1)) {
+    while ((void)geti(L, 1, --j), sort_comp(L, -3, -1)) {
       if (l_unlikely(j < i))  /* j < i  but  a[j] > P ?? */
       if (l_unlikely(j < i))  /* j < i  but  a[j] > P ?? */
         luaL_error(L, "invalid order function for sorting");
         luaL_error(L, "invalid order function for sorting");
       lua_pop(L, 1);  /* remove a[j] */
       lua_pop(L, 1);  /* remove a[j] */
@@ -335,8 +343,8 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, unsigned rnd) {
     IdxT p;  /* Pivot index */
     IdxT p;  /* Pivot index */
     IdxT n;  /* to be used later */
     IdxT n;  /* to be used later */
     /* sort elements 'lo', 'p', and 'up' */
     /* sort elements 'lo', 'p', and 'up' */
-    lua_geti(L, 1, lo);
-    lua_geti(L, 1, up);
+    geti(L, 1, lo);
+    geti(L, 1, up);
     if (sort_comp(L, -1, -2))  /* a[up] < a[lo]? */
     if (sort_comp(L, -1, -2))  /* a[up] < a[lo]? */
       set2(L, lo, up);  /* swap a[lo] - a[up] */
       set2(L, lo, up);  /* swap a[lo] - a[up] */
     else
     else
@@ -347,13 +355,13 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, unsigned rnd) {
       p = (lo + up)/2;  /* middle element is a good pivot */
       p = (lo + up)/2;  /* middle element is a good pivot */
     else  /* for larger intervals, it is worth a random pivot */
     else  /* for larger intervals, it is worth a random pivot */
       p = choosePivot(lo, up, rnd);
       p = choosePivot(lo, up, rnd);
-    lua_geti(L, 1, p);
-    lua_geti(L, 1, lo);
+    geti(L, 1, p);
+    geti(L, 1, lo);
     if (sort_comp(L, -2, -1))  /* a[p] < a[lo]? */
     if (sort_comp(L, -2, -1))  /* a[p] < a[lo]? */
       set2(L, p, lo);  /* swap a[p] - a[lo] */
       set2(L, p, lo);  /* swap a[p] - a[lo] */
     else {
     else {
       lua_pop(L, 1);  /* remove a[lo] */
       lua_pop(L, 1);  /* remove a[lo] */
-      lua_geti(L, 1, up);
+      geti(L, 1, up);
       if (sort_comp(L, -1, -2))  /* a[up] < a[p]? */
       if (sort_comp(L, -1, -2))  /* a[up] < a[p]? */
         set2(L, p, up);  /* swap a[up] - a[p] */
         set2(L, p, up);  /* swap a[up] - a[p] */
       else
       else
@@ -361,9 +369,9 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, unsigned rnd) {
     }
     }
     if (up - lo == 2)  /* only 3 elements? */
     if (up - lo == 2)  /* only 3 elements? */
       return;  /* already sorted */
       return;  /* already sorted */
-    lua_geti(L, 1, p);  /* get middle element (Pivot) */
+    geti(L, 1, p);  /* get middle element (Pivot) */
     lua_pushvalue(L, -1);  /* push Pivot */
     lua_pushvalue(L, -1);  /* push Pivot */
-    lua_geti(L, 1, up - 1);  /* push a[up - 1] */
+    geti(L, 1, up - 1);  /* push a[up - 1] */
     set2(L, p, up - 1);  /* swap Pivot (a[p]) with a[up - 1] */
     set2(L, p, up - 1);  /* swap Pivot (a[p]) with a[up - 1] */
     p = partition(L, lo, up);
     p = partition(L, lo, up);
     /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */
     /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */

+ 14 - 14
ltests.c

@@ -1040,14 +1040,14 @@ static int table_query (lua_State *L) {
 
 
 static int query_GCparams (lua_State *L) {
 static int query_GCparams (lua_State *L) {
   global_State *g = G(L);
   global_State *g = G(L);
-  lua_pushinteger(L, gettotalobjs(g));
-  lua_pushinteger(L, g->GCdebt);
-  lua_pushinteger(L, applygcparam(g, MINORMUL, 100));
-  lua_pushinteger(L, applygcparam(g, MAJORMINOR, 100));
-  lua_pushinteger(L, applygcparam(g, MINORMAJOR, 100));
-  lua_pushinteger(L, applygcparam(g, PAUSE, 100));
-  lua_pushinteger(L, applygcparam(g, STEPMUL, 100));
-  lua_pushinteger(L, applygcparam(g, STEPSIZE, 100));
+  lua_pushinteger(L, cast(lua_Integer, gettotalobjs(g)));
+  lua_pushinteger(L, cast(lua_Integer, g->GCdebt));
+  lua_pushinteger(L, cast(lua_Integer, applygcparam(g, MINORMUL, 100)));
+  lua_pushinteger(L, cast(lua_Integer, applygcparam(g, MAJORMINOR, 100)));
+  lua_pushinteger(L, cast(lua_Integer, applygcparam(g, MINORMAJOR, 100)));
+  lua_pushinteger(L, cast(lua_Integer, applygcparam(g, PAUSE, 100)));
+  lua_pushinteger(L, cast(lua_Integer, applygcparam(g, STEPMUL, 100)));
+  lua_pushinteger(L, cast(lua_Integer, applygcparam(g, STEPSIZE, 100)));
   return 8;
   return 8;
 }
 }
 
 
@@ -1062,7 +1062,7 @@ static int test_codeparam (lua_State *L) {
 static int test_applyparam (lua_State *L) {
 static int test_applyparam (lua_State *L) {
   lua_Integer p = luaL_checkinteger(L, 1);
   lua_Integer p = luaL_checkinteger(L, 1);
   lua_Integer x = luaL_checkinteger(L, 2);
   lua_Integer x = luaL_checkinteger(L, 2);
-  lua_pushinteger(L, luaO_applyparam(cast_byte(p), x));
+  lua_pushinteger(L, cast(lua_Integer, luaO_applyparam(cast_byte(p), x)));
   return 1;
   return 1;
 }
 }
 
 
@@ -1162,7 +1162,7 @@ static int pushuserdata (lua_State *L) {
 
 
 
 
 static int udataval (lua_State *L) {
 static int udataval (lua_State *L) {
-  lua_pushinteger(L, cast(long, lua_touserdata(L, 1)));
+  lua_pushinteger(L, cast(lua_Integer, cast(size_t, lua_touserdata(L, 1))));
   return 1;
   return 1;
 }
 }
 
 
@@ -1199,7 +1199,7 @@ static int num2int (lua_State *L) {
 
 
 
 
 static int makeseed (lua_State *L) {
 static int makeseed (lua_State *L) {
-  lua_pushinteger(L, luaL_makeseed(L));
+  lua_pushinteger(L, cast(lua_Integer, luaL_makeseed(L)));
   return 1;
   return 1;
 }
 }
 
 
@@ -1486,7 +1486,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
     const char *inst = getstring;
     const char *inst = getstring;
     if EQ("") return 0;
     if EQ("") return 0;
     else if EQ("absindex") {
     else if EQ("absindex") {
-      lua_pushnumber(L1, lua_absindex(L1, getindex));
+      lua_pushinteger(L1, lua_absindex(L1, getindex));
     }
     }
     else if EQ("append") {
     else if EQ("append") {
       int t = getindex;
       int t = getindex;
@@ -1538,7 +1538,7 @@ static int runC (lua_State *L, lua_State *L1, const char *pc) {
     }
     }
     else if EQ("func2num") {
     else if EQ("func2num") {
       lua_CFunction func = lua_tocfunction(L1, getindex);
       lua_CFunction func = lua_tocfunction(L1, getindex);
-      lua_pushinteger(L1, cast(lua_Integer, func));
+      lua_pushinteger(L1, cast(lua_Integer, cast(size_t, func)));
     }
     }
     else if EQ("getfield") {
     else if EQ("getfield") {
       int t = getindex;
       int t = getindex;
@@ -1901,7 +1901,7 @@ static int Cfunc (lua_State *L) {
 static int Cfunck (lua_State *L, int status, lua_KContext ctx) {
 static int Cfunck (lua_State *L, int status, lua_KContext ctx) {
   lua_pushstring(L, statcodes[status]);
   lua_pushstring(L, statcodes[status]);
   lua_setglobal(L, "status");
   lua_setglobal(L, "status");
-  lua_pushinteger(L, ctx);
+  lua_pushinteger(L, cast(lua_Integer, ctx));
   lua_setglobal(L, "ctx");
   lua_setglobal(L, "ctx");
   return runC(L, L, lua_tostring(L, cast_int(ctx)));
   return runC(L, L, lua_tostring(L, cast_int(ctx)));
 }
 }

+ 3 - 3
lutf8lib.c

@@ -103,7 +103,7 @@ static int utflen (lua_State *L) {
       lua_pushinteger(L, posi + 1);  /* ... and current position */
       lua_pushinteger(L, posi + 1);  /* ... and current position */
       return 2;
       return 2;
     }
     }
-    posi = s1 - s;
+    posi = ct_diff2S(s1 - s);
     n++;
     n++;
   }
   }
   lua_pushinteger(L, n);
   lua_pushinteger(L, n);
@@ -137,7 +137,7 @@ static int codepoint (lua_State *L) {
     s = utf8_decode(s, &code, !lax);
     s = utf8_decode(s, &code, !lax);
     if (s == NULL)
     if (s == NULL)
       return luaL_error(L, MSGInvalid);
       return luaL_error(L, MSGInvalid);
-    lua_pushinteger(L, code);
+    lua_pushinteger(L, l_castU2S(code));
     n++;
     n++;
   }
   }
   return n;
   return n;
@@ -240,7 +240,7 @@ static int iter_aux (lua_State *L, int strict) {
     if (next == NULL || iscontp(next))
     if (next == NULL || iscontp(next))
       return luaL_error(L, MSGInvalid);
       return luaL_error(L, MSGInvalid);
     lua_pushinteger(L, l_castU2S(n + 1));
     lua_pushinteger(L, l_castU2S(n + 1));
-    lua_pushinteger(L, code);
+    lua_pushinteger(L, l_castU2S(code));
     return 2;
     return 2;
   }
   }
 }
 }

+ 1 - 1
testes/strings.lua

@@ -111,7 +111,7 @@ assert(string.rep('', 10) == '')
 
 
 do
 do
   checkerror("too large", string.rep, 'aa', math.maxinteger);
   checkerror("too large", string.rep, 'aa', math.maxinteger);
-  checkerror("too large", string.rep, 'a', math.maxinteger/2, ',')
+  checkerror("too large", string.rep, 'a', math.maxinteger, ',')
 end
 end
 
 
 -- repetitions with separator
 -- repetitions with separator