diff --git a/ltests.c b/ltests.c
index b460d01..95c41fd 100644
--- a/ltests.c
+++ b/ltests.c
@@ -62,8 +62,10 @@
 }
 
 
-static void badexit (const char *fmt, const char *s) {
-  fprintf(stderr, fmt, s);
+static void badexit (const char *fmt, const char *s1, const char *s2) {
+  fprintf(stderr, fmt, s1);
+  if (s2)
+    fprintf(stderr, "extra info: %s\n", s2);
   /* avoid assertion failures when exiting */
   l_memcontrol.numblocks = l_memcontrol.total = 0;
   exit(EXIT_FAILURE);
@@ -72,7 +74,7 @@
 
 static int tpanic (lua_State *L) {
   return (badexit("PANIC: unprotected error in call to Lua API (%s)\n",
-                   lua_tostring(L, -1)),
+                   lua_tostring(L, -1), NULL),
           0);  /* do not return to Lua */
 }
 
@@ -88,13 +90,14 @@
 ** - 2.store: all warnings go to the global '_WARN';
 */
 static void warnf (void *ud, const char *msg, int tocont) {
+  lua_State *L = cast(lua_State *, ud);
   static char buff[200] = "";  /* should be enough for tests... */
   static int onoff = 1;
   static int mode = 0;  /* start in normal mode */
   static int lasttocont = 0;
   if (!lasttocont && !tocont && *msg == '@') {  /* control message? */
     if (buff[0] != '\0')
-      badexit("Control warning during warning: %s\naborting...\n", msg);
+      badexit("Control warning during warning: %s\naborting...\n", msg, buff);
     if (strcmp(msg, "@off") == 0)
       onoff = 0;
     else if (strcmp(msg, "@on") == 0)
@@ -106,18 +109,28 @@
     else if (strcmp(msg, "@store") == 0)
       mode = 2;
     else
-      badexit("Invalid control warning in test mode: %s\naborting...\n", msg);
+      badexit("Invalid control warning in test mode: %s\naborting...\n",
+              msg, NULL);
     return;
   }
   lasttocont = tocont;
   if (strlen(msg) >= sizeof(buff) - strlen(buff))
-    badexit("%s", "warnf-buffer overflow");
+    badexit("warnf-buffer overflow (%s)\n", msg, buff);
   strcat(buff, msg);  /* add new message to current warning */
   if (!tocont) {  /* message finished? */
+    lua_unlock(L);
+    if (lua_getglobal(L, "_WARN") == LUA_TNIL)
+      lua_pop(L, 1);  /* ok, no previous unexpected warning */
+    else {
+      badexit("Unhandled warning in store mode: %s\naborting...\n",
+              lua_tostring(L, -1), buff);
+    }
+    lua_lock(L);
     switch (mode) {
       case 0: {  /* normal */
         if (buff[0] != '#' && onoff)  /* unexpected warning? */
-          badexit("Unexpected warning in test mode: %s\naborting...\n", buff);
+          badexit("Unexpected warning in test mode: %s\naborting...\n",
+                  buff, NULL);
         /* else */ /* FALLTHROUGH */
       }
       case 1: {  /* allow */
@@ -126,7 +139,6 @@
         break;
       }
       case 2: {  /* store */
-        lua_State *L = cast(lua_State *, ud);
         lua_unlock(L);
         lua_pushstring(L, buff);
         lua_setglobal(L, "_WARN");  /* assign message to global '_WARN' */
diff --git a/testes/coroutine.lua b/testes/coroutine.lua
index 79c72a9..4fc2326 100644
--- a/testes/coroutine.lua
+++ b/testes/coroutine.lua
@@ -177,10 +177,15 @@
   end)
   coroutine.resume(co)
   assert(x == 0)
-  _WARN = nil; warn("@off"); warn("@store")
+  -- with test library, use 'store' mode to check warnings
+  warn(not T and "@off" or "@store")
   local st, msg = coroutine.close(co)
-  warn("@on"); warn("@normal")
-  assert(_WARN == nil or string.find(_WARN, "200"))
+  if not T then
+    warn("@on")
+  else   -- test library
+    assert(string.find(_WARN, "200")); _WARN = nil
+    warn("@normal")
+  end
   assert(st == false and coroutine.status(co) == "dead" and msg == 111)
   assert(x == 200)
 
diff --git a/testes/gc.lua b/testes/gc.lua
index 6bdc98c..34854d6 100644
--- a/testes/gc.lua
+++ b/testes/gc.lua
@@ -372,7 +372,7 @@
   warn("@store")
   collectgarbage()
   assert(string.find(_WARN, "error in __gc metamethod"))
-  assert(string.match(_WARN, "@(.-)@") == "expected")
+  assert(string.match(_WARN, "@(.-)@") == "expected"); _WARN = nil
   for i = 8, 10 do assert(s[i]) end
 
   for i = 1, 5 do
@@ -481,6 +481,7 @@
   u = setmetatable({}, {__gc = function () error "@expected error" end})
   u = nil
   collectgarbage()
+  assert(string.find(_WARN, "@expected error")); _WARN = nil
   warn("@normal")
 end
 
@@ -663,9 +664,8 @@
     else
       assert(lastmsg == _WARN)  -- subsequent error messages are equal
     end
-    warn("@store")
+    warn("@store"); _WARN = nil
     error"@expected warning"
-    warn("@normal")
   end}
   for i = 10, 1, -1 do
     -- create object and preserve it until the end
diff --git a/testes/locals.lua b/testes/locals.lua
index 595e107..b4de523 100644
--- a/testes/locals.lua
+++ b/testes/locals.lua
@@ -288,9 +288,8 @@
 
 -- auxiliary functions for testing warnings in '__close'
 local function prepwarn ()
-  warn("@off")      -- do not show (lots of) warnings
-  if not T then
-    _WARN = "OFF"    -- signal that warnings are not being captured
+  if not T then   -- no test library?
+    warn("@off")      -- do not show (lots of) warnings
   else
     warn("@store")    -- to test the warnings
   end
@@ -298,15 +297,20 @@
 
 
 local function endwarn ()
-  assert(T or _WARN == "OFF")
-  warn("@on")          -- back to normal
-  warn("@normal")
-  _WARN = nil
+  if not T then
+    warn("@on")          -- back to normal
+  else
+    assert(_WARN == nil)
+    warn("@normal")
+  end
 end
 
 
 local function checkwarn (msg)
-  assert(_WARN == "OFF" or string.find(_WARN, msg))
+  if T then
+    assert(string.find(_WARN, msg))
+    _WARN = nil    -- reset variable to check next warning
+  end
 end
 
 
@@ -333,7 +337,8 @@
 
     local y <close> =
       func2close(function (self, msg)
-        assert(string.find(msg, "@z"))  -- error in 'z'
+        assert(string.find(msg, "@z"))  -- first error in 'z'
+        checkwarn("@z")   -- second error in 'z' generated a warning
         error("@y")
       end)
 
@@ -377,14 +382,14 @@
 
     local y <close> =
       func2close(function (self, msg)
-         assert(msg == 4)   -- error in body
+        assert(msg == 4)   -- error in body
+        checkwarn("@z")
         error("@y")
       end)
 
     local first = true
     local z <close> =
       func2close(function (self, msg)
-        checkwarn("@z")
         -- 'z' close is called once
         assert(first and msg == 4)
         first = false
@@ -418,16 +423,18 @@
   local st, msg = xpcall(foo, debug.traceback)
   assert(string.match(msg, "^[^ ]* @X"))
   assert(string.find(msg, "in metamethod 'close'"))
+  checkwarn("@Y")
 
   -- error in toclose in vararg function
   local function foo (...)
-    local x123 <close> = func2close(function () error("@X") end)
+    local x123 <close> = func2close(function () error("@x123") end)
   end
 
   local st, msg = xpcall(foo, debug.traceback)
-  assert(string.match(msg, "^[^ ]* @X"))
-
+  assert(string.match(msg, "^[^ ]* @x123"))
   assert(string.find(msg, "in metamethod 'close'"))
+  checkwarn("@x123")   -- from second call to close 'x123'
+
   endwarn()
 end
 
diff --git a/testes/main.lua b/testes/main.lua
index 0ef4822..3622036 100644
--- a/testes/main.lua
+++ b/testes/main.lua
@@ -379,12 +379,12 @@
   -- testing 'warn'
   warn("@store")
   warn("@123", "456", "789")
-  assert(_WARN == "@123456789")
+  assert(_WARN == "@123456789"); _WARN = nil
 
   warn("zip", "", " ", "zap")
-  assert(_WARN == "zip zap")
+  assert(_WARN == "zip zap"); _WARN = nil
   warn("ZIP", "", " ", "ZAP")
-  assert(_WARN == "ZIP ZAP")
+  assert(_WARN == "ZIP ZAP"); _WARN = nil
   warn("@normal")
 end
 
