-Wexport-undefined warning for exporting undefined symbols

This commit is contained in:
Rangi42
2025-08-24 16:52:20 -04:00
parent 62d3b44768
commit 8564df51e5
8 changed files with 23 additions and 1 deletions

View File

@@ -184,6 +184,7 @@ _rgbasm_completions() {
empty-data-directive empty-data-directive
empty-macro-arg empty-macro-arg
empty-strrpl empty-strrpl
export-undefined
large-constant large-constant
macro-shift macro-shift
nested-comment nested-comment

View File

@@ -16,6 +16,7 @@ _rgbasm_warnings() {
'empty-data-directive:Warn on arg-less d[bwl] in ROM' 'empty-data-directive:Warn on arg-less d[bwl] in ROM'
'empty-macro-arg:Warn on empty macro arg' 'empty-macro-arg:Warn on empty macro arg'
'empty-strrpl:Warn on calling STRRPL with empty pattern' 'empty-strrpl:Warn on calling STRRPL with empty pattern'
'export-undefined:Warn on EXPORT of an undefined symbol'
'large-constant:Warn on constants too large for a signed 32-bit int' 'large-constant:Warn on constants too large for a signed 32-bit int'
'macro-shift:Warn when shifting macro args part their limits' 'macro-shift:Warn when shifting macro args part their limits'
'nested-comment:Warn on "/*" inside block comments' 'nested-comment:Warn on "/*" inside block comments'

View File

@@ -23,6 +23,7 @@ enum WarningID {
WARNING_EMPTY_DATA_DIRECTIVE, // `db`, `dw` or `dl` directive without data in ROM WARNING_EMPTY_DATA_DIRECTIVE, // `db`, `dw` or `dl` directive without data in ROM
WARNING_EMPTY_MACRO_ARG, // Empty macro argument WARNING_EMPTY_MACRO_ARG, // Empty macro argument
WARNING_EMPTY_STRRPL, // Empty second argument in `STRRPL` WARNING_EMPTY_STRRPL, // Empty second argument in `STRRPL`
WARNING_EXPORT_UNDEFINED, // `EXPORT` of an undefined symbol
WARNING_LARGE_CONSTANT, // Constants too large WARNING_LARGE_CONSTANT, // Constants too large
WARNING_MACRO_SHIFT, // `SHIFT` past available arguments in macro WARNING_MACRO_SHIFT, // `SHIFT` past available arguments in macro
WARNING_NESTED_COMMENT, // Comment-start delimiter in a block comment WARNING_NESTED_COMMENT, // Comment-start delimiter in a block comment

View File

@@ -394,6 +394,10 @@ Warn when
is called with an empty string as its second argument (the substring to replace). is called with an empty string as its second argument (the substring to replace).
This warning is enabled by This warning is enabled by
.Fl Wall . .Fl Wall .
.It Fl Wexport-undefined
Warn when exporting an undefined symbol.
This warning is enabled by
.Fl Wall .
.It Fl Wno-large-constant .It Fl Wno-large-constant
Warn when a constant too large to fit in a signed 32-bit integer is encountered. Warn when a constant too large to fit in a signed 32-bit integer is encountered.
.It Fl Wmacro-shift .It Fl Wmacro-shift

View File

@@ -611,7 +611,7 @@ void sym_Export(std::string const &symName) {
if (symName.starts_with('!')) { if (symName.starts_with('!')) {
// LCOV_EXCL_START // LCOV_EXCL_START
// The parser does not accept anonymous labels for an `EXPORT` directive // The parser does not accept anonymous labels for an `EXPORT` directive
error("Anonymous labels cannot be exported"); error("Cannot export anonymous label");
return; return;
// LCOV_EXCL_STOP // LCOV_EXCL_STOP
} }
@@ -620,8 +620,10 @@ void sym_Export(std::string const &symName) {
// If the symbol doesn't exist, create a ref that can be purged // If the symbol doesn't exist, create a ref that can be purged
if (!sym) { if (!sym) {
warning(WARNING_EXPORT_UNDEFINED, "Exporting an undefined symbol `%s`", symName.c_str());
sym = sym_Ref(symName); sym = sym_Ref(symName);
} }
sym->isExported = true; sym->isExported = true;
} }

View File

@@ -30,6 +30,7 @@ Diagnostics<WarningLevel, WarningID> warnings = {
{"empty-data-directive", LEVEL_ALL }, {"empty-data-directive", LEVEL_ALL },
{"empty-macro-arg", LEVEL_EXTRA }, {"empty-macro-arg", LEVEL_EXTRA },
{"empty-strrpl", LEVEL_ALL }, {"empty-strrpl", LEVEL_ALL },
{"export-undefined", LEVEL_ALL },
{"large-constant", LEVEL_DEFAULT }, {"large-constant", LEVEL_DEFAULT },
{"macro-shift", LEVEL_EXTRA }, {"macro-shift", LEVEL_EXTRA },
{"nested-comment", LEVEL_DEFAULT }, {"nested-comment", LEVEL_DEFAULT },

View File

@@ -16,3 +16,6 @@ EXPORT REDEF variable = 1234
DEF equs_sym EQUS "hello" DEF equs_sym EQUS "hello"
EXPORT equs_sym ; exports undefined symbol `hello` due to EQUS expansion EXPORT equs_sym ; exports undefined symbol `hello` due to EQUS expansion
EXPORT DEF string EQUS "goodbye" ; invalid syntax EXPORT DEF string EQUS "goodbye" ; invalid syntax
PURGE equ_sym
EXPORT equ_sym

View File

@@ -1,3 +1,12 @@
warning: Exporting an undefined symbol `undefined` [-Wexport-undefined]
at export.asm(1)
warning: Exporting an undefined symbol `hello` [-Wexport-undefined]
at export.asm(17)
while expanding symbol `equs_sym`
error: syntax error, unexpected EQUS error: syntax error, unexpected EQUS
at export.asm(18) at export.asm(18)
warning: Purging an exported symbol `equ_sym` [-Wpurge]
at export.asm(20)
warning: Exporting an undefined symbol `equ_sym` [-Wexport-undefined]
at export.asm(21)
Assembly aborted with 1 error! Assembly aborted with 1 error!