commit e4f418f07c7349f5ff844fbdc9a3b37b488113a5
parent 20d42ccaaed9a84783d548d76633a5a38f0091f1
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Fri, 27 Sep 2024 10:00:08 -0300
Local declaration in the REPL generates a warning
Diffstat:
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/lua.c b/lua.c
@@ -587,15 +587,28 @@ static int addreturn (lua_State *L) {
}
+static void checklocal (const char *line) {
+ static const size_t szloc = sizeof("local") - 1;
+ static const char space[] = " \t";
+ line += strspn(line, space); /* skip spaces */
+ if (strncmp(line, "local", szloc) == 0 && /* "local"? */
+ strchr(space, *(line + szloc)) != NULL) { /* followed by a space? */
+ lua_writestringerror("%s\n",
+ "warning: locals do not survive across lines in interactive mode");
+ }
+}
+
+
/*
** Read multiple lines until a complete Lua statement or an error not
** for an incomplete statement. Start with first line already read in
** the stack.
*/
static int multiline (lua_State *L) {
+ size_t len;
+ const char *line = lua_tolstring(L, 1, &len); /* get first line */
+ checklocal(line);
for (;;) { /* repeat until gets a complete statement */
- size_t len;
- const char *line = lua_tolstring(L, 1, &len); /* get what it has */
int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */
if (!incomplete(L, status) || !pushline(L, 0))
return status; /* should not or cannot try to add continuation line */
@@ -603,6 +616,7 @@ static int multiline (lua_State *L) {
lua_pushliteral(L, "\n"); /* add newline... */
lua_insert(L, -2); /* ...between the two lines */
lua_concat(L, 3); /* join them */
+ line = lua_tolstring(L, 1, &len); /* get what is has */
}
}
diff --git a/testes/main.lua b/testes/main.lua
@@ -263,6 +263,15 @@ assert(string.find(getoutput(), "error calling 'print'"))
RUN('echo "io.stderr:write(1000)\ncont" | lua -e "require\'debug\'.debug()" 2> %s', out)
checkout("lua_debug> 1000lua_debug> ")
+do -- test warning for locals
+ RUN('echo " local x" | lua -i > %s 2>&1', out)
+ assert(string.find(getoutput(), "warning: "))
+
+ RUN('echo "local1 = 10\nlocal1 + 3" | lua -i > %s 2>&1', out)
+ local t = getoutput()
+ assert(not string.find(t, "warning"))
+ assert(string.find(t, "13"))
+end
print("testing warnings")