diff options
Diffstat (limited to 'asm/error.c')
-rw-r--r-- | asm/error.c | 68 |
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; } |