diff --git a/src/blua/lauxlib.h b/src/blua/lauxlib.h
index c5ea45a1cbc4c4612909107b4e3fdd5d8f88de0d..87844f4057720b36442a22ee3b419717ce756025 100644
--- a/src/blua/lauxlib.h
+++ b/src/blua/lauxlib.h
@@ -31,6 +31,26 @@ LUALIB_API void (luaL_setn) (lua_State *L, int t, int n);
 /* extra error code for `luaL_load' */
 #define LUA_ERRFILE     (LUA_ERRERR+1)
 
+/* Compiler-specific attributes and other macros */
+
+#ifdef __GNUC__ // __attribute__ ((X))
+
+	#if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)) && defined (__MINGW32__) // MinGW, >= GCC 4.1
+		#if 0 //defined  (__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO > 0
+			#define FUNCREPORT  __attribute__ ((format(gnu_printf, 2, 3)))
+		#elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4) // >= GCC 4.4
+			#define FUNCREPORT  __attribute__ ((format(ms_printf, 2, 3)))
+		#else
+			#define FUNCREPORT  __attribute__ ((format(printf, 2, 3)))
+		#endif
+	#else
+		#define FUNCREPORT  __attribute__ ((format(printf, 2, 3)))
+	#endif
+#endif
+
+#ifndef FUNCREPORT
+#define FUNCREPORT
+#endif
 
 typedef struct luaL_Reg {
   const char *name;
@@ -65,7 +85,7 @@ LUALIB_API int   (luaL_newmetatable) (lua_State *L, const char *tname);
 LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname);
 
 LUALIB_API void (luaL_where) (lua_State *L, int lvl);
-LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...);
+LUALIB_API FUNCREPORT int (luaL_error) (lua_State *L, const char *fmt, ...);
 
 LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def,
                                    const char *const lst[]);
diff --git a/src/lua_infolib.c b/src/lua_infolib.c
index b2730c5931f0c00db2eca2848827526661631084..767477d0bac75e7b9bada5367cb223a37a33f8cd 100644
--- a/src/lua_infolib.c
+++ b/src/lua_infolib.c
@@ -483,7 +483,7 @@ static int spriteinfo_set(lua_State *L)
 		}
 	}
 	else
-		return luaL_error(L, va("Field %s does not exist in spriteinfo_t", field));
+		return luaL_error(L, "Field %s does not exist in spriteinfo_t", field);
 
 	return 0;
 }
@@ -577,7 +577,7 @@ static int framepivot_get(lua_State *L)
 		lua_pushinteger(L, 0);
 	}
 	else
-		return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field));
+		return luaL_error(L, "Field %s does not exist in spriteframepivot_t", field);
 
 	return 1;
 }
@@ -604,7 +604,7 @@ static int framepivot_set(lua_State *L)
 	else if (fastcmp("rotaxis", field))
 		LUA_UsageWarning(L, "\"rotaxis\" is deprecated and will be removed.")
 	else
-		return luaL_error(L, va("Field %s does not exist in spriteframepivot_t", field));
+		return luaL_error(L, "Field %s does not exist in spriteframepivot_t", field);
 
 	return 0;
 }
@@ -1663,7 +1663,7 @@ static void setRamp(lua_State *L, skincolor_t* c) {
 	lua_pushnil(L);
 	for (i=0; i<COLORRAMPSIZE; i++) {
 		if (lua_objlen(L,-2)!=COLORRAMPSIZE) {
-			luaL_error(L, LUA_QL("skincolor_t") " field 'ramp' must be %d entries long; got %d.", COLORRAMPSIZE, lua_objlen(L,-2));
+			luaL_error(L, LUA_QL("skincolor_t") " field 'ramp' must be %d entries long; got %d.", COLORRAMPSIZE, luaL_getn(L,-2));
 			break;
 		}
 		if (lua_next(L, -2) != 0) {
diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c
index 5a3f8ad114b9f1269e3a49b76cb4aa9dd76417ad..7fd16b32b2c0806f06d2f557823aeabbc5bb4c76 100644
--- a/src/lua_mobjlib.c
+++ b/src/lua_mobjlib.c
@@ -1003,6 +1003,9 @@ static int mapthing_get(lua_State *L)
 		return 0;
 	}
 
+	if (field == (enum mapthing_e)-1)
+		return LUA_ErrInvalid(L, "fields");
+
 	switch (field)
 	{
 		case mapthing_valid:
@@ -1061,7 +1064,7 @@ static int mapthing_get(lua_State *L)
 			break;
 		default:
 			if (devparm)
-				return luaL_error(L, LUA_QL("mapthing_t") " has no field named " LUA_QS, field);
+				return luaL_error(L, "%s %s", LUA_QL("mapthing_t"), va("has no field named: %ui", field));
 			else
 				return 0;
 	}
@@ -1078,6 +1081,9 @@ static int mapthing_set(lua_State *L)
 	if (!mt)
 		return luaL_error(L, "accessed mapthing_t doesn't exist anymore.");
 
+	if (field == (enum mapthing_e)-1)
+		return LUA_ErrInvalid(L, "fields");
+
 	if (hud_running)
 		return luaL_error(L, "Do not alter mapthing_t in HUD rendering code!");
 	if (hook_cmd_running)
@@ -1135,7 +1141,7 @@ static int mapthing_set(lua_State *L)
 			mt->mobj = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ));
 			break;
 		default:
-			return luaL_error(L, LUA_QL("mapthing_t") " has no field named " LUA_QS, field);
+			return luaL_error(L, "%s %s", LUA_QL("mapthing_t"), va("has no field named: %ui", field));
 	}
 
 	return 0;
diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c
index 2aae7288349c0f1dae5b9dc15d316dead69775c8..b6ef2579c131d8de29a521615cb6a74acc94f5a0 100644
--- a/src/lua_playerlib.c
+++ b/src/lua_playerlib.c
@@ -1423,8 +1423,8 @@ static int power_len(lua_State *L)
 	return 1;
 }
 
-#define NOFIELD luaL_error(L, LUA_QL("ticcmd_t") " has no field named " LUA_QS, field)
-#define NOSET luaL_error(L, LUA_QL("ticcmd_t") " field " LUA_QS " should not be set directly.", ticcmd_opt[field])
+#define NOFIELD luaL_error(L, "%s %s", LUA_QL("ticcmd_t"), va("has no field named %ui", field))
+#define NOSET luaL_error(L, LUA_QL("ticcmd_t") " field %s should not be set directly.", ticcmd_opt[field])
 
 enum ticcmd_e
 {
@@ -1455,6 +1455,9 @@ static int ticcmd_get(lua_State *L)
 	if (!cmd)
 		return LUA_ErrInvalid(L, "player_t");
 
+	if (field == (enum ticcmd_e)-1)
+		return LUA_ErrInvalid(L, "fields");
+
 	switch (field)
 	{
 	case ticcmd_forwardmove:
@@ -1489,6 +1492,9 @@ static int ticcmd_set(lua_State *L)
 	if (!cmd)
 		return LUA_ErrInvalid(L, "ticcmd_t");
 
+	if (field == (enum ticcmd_e)-1)
+		return LUA_ErrInvalid(L, "fields");
+
 	if (hud_running)
 		return luaL_error(L, "Do not alter player_t in HUD rendering code!");