Jelajahi Sumber

Correction in line info for semantic errors

Semantic errors should refer the last used token, not the next one.
Roberto I 2 bulan lalu
induk
melakukan
81f4def54f
2 mengubah file dengan 43 tambahan dan 22 penghapusan
  1. 1 0
      lcode.c
  2. 42 22
      testes/errors.lua

+ 1 - 0
lcode.c

@@ -45,6 +45,7 @@ l_noret luaK_semerror (LexState *ls, const char *fmt, ...) {
   va_list argp;
   va_list argp;
   pushvfstring(ls->L, argp, fmt, msg);
   pushvfstring(ls->L, argp, fmt, msg);
   ls->t.token = 0;  /* remove "near <token>" from final message */
   ls->t.token = 0;  /* remove "near <token>" from final message */
+  ls->linenumber = ls->lastline;  /* back to line of last used token */
   luaX_syntaxerror(ls, msg);
   luaX_syntaxerror(ls, msg);
 }
 }
 
 

+ 42 - 22
testes/errors.lua

@@ -418,28 +418,28 @@ end
 
 
 -- testing line error
 -- testing line error
 
 
-local function lineerror (s, l)
+local function lineerror (s, l, w)
   local err,msg = pcall(load(s))
   local err,msg = pcall(load(s))
   local line = tonumber(string.match(msg, ":(%d+):"))
   local line = tonumber(string.match(msg, ":(%d+):"))
-  assert(line == l or (not line and not l))
+  assert((line == l or (not line and not l)) and string.find(msg, w))
 end
 end
 
 
-lineerror("local a\n for i=1,'a' do \n print(i) \n end", 2)
-lineerror("\n local a \n for k,v in 3 \n do \n print(k) \n end", 3)
-lineerror("\n\n for k,v in \n 3 \n do \n print(k) \n end", 4)
-lineerror("function a.x.y ()\na=a+1\nend", 1)
+lineerror("local a\n for i=1,'a' do \n print(i) \n end", 2, "limit")
+lineerror("\n local a \n for k,v in 3 \n do \n print(k) \n end", 3, "to call")
+lineerror("\n\n for k,v in \n 3 \n do \n print(k) \n end", 4, "to call")
+lineerror("function a.x.y ()\na=a+1\nend", 1, "index")
 
 
-lineerror("a = \na\n+\n{}", 3)
-lineerror("a = \n3\n+\n(\n4\n/\nprint)", 6)
-lineerror("a = \nprint\n+\n(\n4\n/\n7)", 3)
+lineerror("a = \na\n+\n{}", 3, "arithmetic")
+lineerror("a = \n3\n+\n(\n4\n/\nprint)", 6, "arithmetic")
+lineerror("a = \nprint\n+\n(\n4\n/\n7)", 3, "arithmetic")
 
 
-lineerror("a\n=\n-\n\nprint\n;", 3)
+lineerror("a\n=\n-\n\nprint\n;", 3, "arithmetic")
 
 
 lineerror([[
 lineerror([[
 a
 a
 (     -- <<
 (     -- <<
 23)
 23)
-]], 2)
+]], 2, "call")
 
 
 lineerror([[
 lineerror([[
 local a = {x = 13}
 local a = {x = 13}
@@ -449,7 +449,7 @@ x
 (     -- <<
 (     -- <<
 23
 23
 )
 )
-]], 5)
+]], 5, "call")
 
 
 lineerror([[
 lineerror([[
 local a = {x = 13}
 local a = {x = 13}
@@ -459,17 +459,17 @@ x
 (
 (
 23 + a
 23 + a
 )
 )
-]], 6)
+]], 6, "arithmetic")
 
 
 local p = [[
 local p = [[
   function g() f() end
   function g() f() end
   function f(x) error('a', XX) end
   function f(x) error('a', XX) end
 g()
 g()
 ]]
 ]]
-XX=3;lineerror((p), 3)
-XX=0;lineerror((p), false)
-XX=1;lineerror((p), 2)
-XX=2;lineerror((p), 1)
+XX=3;lineerror((p), 3, "a")
+XX=0;lineerror((p), false, "a")
+XX=1;lineerror((p), 2, "a")
+XX=2;lineerror((p), 1, "a")
 _G.XX, _G.g, _G.f = nil
 _G.XX, _G.g, _G.f = nil
 
 
 
 
@@ -477,7 +477,7 @@ lineerror([[
 local b = false
 local b = false
 if not b then
 if not b then
   error 'test'
   error 'test'
-end]], 3)
+end]], 3, "test")
 
 
 lineerror([[
 lineerror([[
 local b = false
 local b = false
@@ -487,7 +487,7 @@ if not b then
       error 'test'
       error 'test'
     end
     end
   end
   end
-end]], 5)
+end]], 5, "test")
 
 
 lineerror([[
 lineerror([[
 _ENV = 1
 _ENV = 1
@@ -495,7 +495,7 @@ global function foo ()
   local a = 10
   local a = 10
   return a
   return a
 end
 end
-]], 2)
+]], 2, "index")
 
 
 
 
 -- bug in 5.4.0
 -- bug in 5.4.0
@@ -503,17 +503,37 @@ lineerror([[
   local a = 0
   local a = 0
   local b = 1
   local b = 1
   local c = b % a
   local c = b % a
-]], 3)
+]], 3, "perform")
 
 
 do
 do
   -- Force a negative estimate for base line. Error in instruction 2
   -- Force a negative estimate for base line. Error in instruction 2
   -- (after VARARGPREP, GETGLOBAL), with first absolute line information
   -- (after VARARGPREP, GETGLOBAL), with first absolute line information
   -- (forced by too many lines) in instruction 0.
   -- (forced by too many lines) in instruction 0.
   local s = string.format("%s return __A.x", string.rep("\n", 300))
   local s = string.format("%s return __A.x", string.rep("\n", 300))
-  lineerror(s, 301)
+  lineerror(s, 301, "index")
 end
 end
 
 
 
 
+local function stxlineerror (s, l, w)
+  local err,msg = load(s)
+  local line = tonumber(string.match(msg, ":(%d+):"))
+  assert((line == l or (not line and not l)) and string.find(msg, w, 1, true))
+end
+
+stxlineerror([[
+::L1::
+::L1::
+]], 2, "already defined")
+
+stxlineerror([[
+global none
+local x = b
+]], 2, "not declared")
+
+stxlineerror([[
+local <close> a, b
+]], 1, "multiple")
+
 if not _soft then
 if not _soft then
   -- several tests that exhaust the Lua stack
   -- several tests that exhaust the Lua stack
   collectgarbage()
   collectgarbage()