summaryrefslogtreecommitdiff
path: root/asm/error.c
diff options
context:
space:
mode:
Diffstat (limited to 'asm/error.c')
-rw-r--r--asm/error.c68
1 files changed, 23 insertions, 45 deletions
diff --git a/asm/error.c b/asm/error.c
index 2a0b34ad..ea2620fa 100644
--- a/asm/error.c
+++ b/asm/error.c
@@ -42,49 +42,6 @@
#include "nasmlib.h"
#include "error.h"
-/*
- * Description of the suppressible warnings for the command line and
- * the [warning] directive.
- */
-#define on (WARN_ST_ENABLED)
-#define off 0
-#define err (WARN_ST_ENABLED|WARN_ST_ERROR)
-
-const struct warning warnings[WARN_ALL+1] = {
- {NULL, NULL, on}, /* must be on - used for unconditional enable */
- {"macro-params", "macro calls with wrong parameter count", on},
- {"macro-selfref", "cyclic macro references", off},
- {"macro-defaults", "macros with more default than optional parameters", on},
- {"orphan-labels", "labels alone on lines without trailing `:'", on},
- {"number-overflow", "numeric constant does not fit", on},
- {"gnu-elf-extensions", "using 8- or 16-bit relocation in ELF32, a GNU extension", off},
- {"float-overflow", "floating point overflow", on},
- {"float-denorm", "floating point denormal", off},
- {"float-underflow", "floating point underflow", off},
- {"float-toolong", "too many digits in floating-point number", on},
- {"user", "%warning directives", on},
- {"lock", "lock prefix on unlockable instructions", on},
- {"hle", "invalid hle prefixes", on},
- {"bnd", "invalid bnd prefixes", on},
- {"zext-reloc", "relocation zero-extended to match output format", on},
- {"ptr", "non-NASM keyword used in other assemblers", on},
- {"bad-pragma", "empty or malformed %pragma", off},
- {"unknown-pragma", "unknown %pragma facility or directive", off},
- {"not-my-pragma", "%pragma not applicable to this compilation", off},
- {"unknown-warning", "unknown warning in -W/-w or warning directive", off},
- {"negative-rep", "regative %rep count", on},
- {"phase", "phase error during stabilization", off},
- {"label-redef", "label redefined to an identical value", off},
- {"label-redef-late", "label (re)defined during code generation", err},
-
- /* THESE ENTRIES SHOULD COME LAST */
- {"other", "any warning not specifially mentioned above", on},
- {"all", "all possible warnings", off}
-};
-
-uint8_t warning_state[WARN_ALL];/* Current state */
-uint8_t warning_state_init[WARN_ALL]; /* Command-line state, for reset */
-
/* Global error handling function */
vefunc nasm_verror;
@@ -134,11 +91,22 @@ fatal_func nasm_assert_failed(const char *file, int line, const char *msg)
/*
* This is called when processing a -w or -W option, or a warning directive.
* Returns on if if the action was successful.
+ *
+ * Special pseudo-warnings:
+ *
+ *!other [on] any warning not specifially mentioned above
+ *! specifies any warning not included in any specific warning class.
+ *
+ *!all [all] all possible warnings
+ *! is an alias for \e{all} suppressible warning classes.
+ *! Thus, \c{-w+all} enables all available warnings, and \c{-w-all}
+ *! disables warnings entirely (since NASM 2.13).
*/
bool set_warning_status(const char *value)
{
enum warn_action { WID_OFF, WID_ON, WID_RESET };
enum warn_action action;
+ const char *name;
bool ok = false;
uint8_t mask;
int i;
@@ -192,12 +160,13 @@ bool set_warning_status(const char *value)
}
}
+ name = value ? value : "<none>";
if (value && !nasm_stricmp(value, "all"))
value = NULL;
/* This is inefficient, but it shouldn't matter... */
- for (i = 0; i < WARN_ALL; i++) {
- if (!value || !nasm_stricmp(value, warnings[i].name)) {
+ for (i = 1; i < WARN_IDX_ALL; i++) {
+ if (!value || !nasm_stricmp(value, warning_name[i])) {
ok = true; /* At least one action taken */
switch (action) {
case WID_OFF:
@@ -214,5 +183,14 @@ bool set_warning_status(const char *value)
}
}
+ if (!ok) {
+ /*!
+ *!unknown-warning [off] unknown warning in -W/-w or warning directive
+ *! warns about a \c{-w} or \c{-W} option or a \c{[WARNING]} directive
+ *! that contains an unknown warning name or is otherwise not possible to process.
+ */
+ nasm_warnf(WARN_UNKNOWN_WARNING, "unknown warning name: %s", name);
+ }
+
return ok;
}