From e4f418f07c7349f5ff844fbdc9a3b37b488113a5 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Fri, 27 Sep 2024 10:00:35 -0300 Subject: [PATCH] Local declaration in the REPL generates a warning --- lua.c | 18 ++++++++++++++++-- testes/main.lua | 9 +++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lua.c b/lua.c index 9693ad680..ea6141bb3 100644 --- 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 index 7b0f4ee08..1aa7b2177 100644 --- 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")