mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 10:12:06 +00:00
Make error messages for "undefined" built-ins more accurate (#1501)
This commit is contained in:
@@ -103,6 +103,29 @@ static void updateSymbolFilename(Symbol &sym) {
|
|||||||
out_RegisterNode(sym.src);
|
out_RegisterNode(sym.src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void alreadyDefinedError(Symbol const &sym, char const *asType) {
|
||||||
|
if (sym.isBuiltin && !sym_FindScopedValidSymbol(sym.name)) {
|
||||||
|
// `DEF()` would return false, so we should not claim the symbol is already defined
|
||||||
|
error("'%s' is reserved for a built-in symbol\n", sym.name.c_str());
|
||||||
|
} else {
|
||||||
|
error("'%s' already defined", sym.name.c_str());
|
||||||
|
if (asType)
|
||||||
|
fprintf(stderr, " as %s", asType);
|
||||||
|
fputs(" at ", stderr);
|
||||||
|
dumpFilename(sym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void redefinedError(Symbol const &sym) {
|
||||||
|
assume(sym.isBuiltin);
|
||||||
|
if (!sym_FindScopedValidSymbol(sym.name)) {
|
||||||
|
// `DEF()` would return false, so we should not imply the symbol is already defined
|
||||||
|
error("'%s' is reserved for a built-in symbol\n", sym.name.c_str());
|
||||||
|
} else {
|
||||||
|
error("Built-in symbol '%s' cannot be redefined\n", sym.name.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static Symbol &createSymbol(std::string const &symName) {
|
static Symbol &createSymbol(std::string const &symName) {
|
||||||
// The symbol name should have been expanded already
|
// The symbol name should have been expanded already
|
||||||
assume(!symName.starts_with('.'));
|
assume(!symName.starts_with('.'));
|
||||||
@@ -268,8 +291,7 @@ static Symbol *createNonrelocSymbol(std::string const &symName, bool numeric) {
|
|||||||
sym = &createSymbol(symName);
|
sym = &createSymbol(symName);
|
||||||
purgedSymbols.erase(sym->name);
|
purgedSymbols.erase(sym->name);
|
||||||
} else if (sym->isDefined()) {
|
} else if (sym->isDefined()) {
|
||||||
error("'%s' already defined at ", symName.c_str());
|
alreadyDefinedError(*sym, nullptr);
|
||||||
dumpFilename(*sym);
|
|
||||||
return nullptr; // Don't allow overriding the symbol, that'd be bad!
|
return nullptr; // Don't allow overriding the symbol, that'd be bad!
|
||||||
} else if (!numeric) {
|
} else if (!numeric) {
|
||||||
// The symbol has already been referenced, but it's not allowed
|
// The symbol has already been referenced, but it's not allowed
|
||||||
@@ -300,11 +322,10 @@ Symbol *sym_RedefEqu(std::string const &symName, int32_t value) {
|
|||||||
return sym_AddEqu(symName, value);
|
return sym_AddEqu(symName, value);
|
||||||
|
|
||||||
if (sym->isDefined() && sym->type != SYM_EQU) {
|
if (sym->isDefined() && sym->type != SYM_EQU) {
|
||||||
error("'%s' already defined as non-EQU at ", symName.c_str());
|
alreadyDefinedError(*sym, "non-EQU");
|
||||||
dumpFilename(*sym);
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
} else if (sym->isBuiltin) {
|
} else if (sym->isBuiltin) {
|
||||||
error("Built-in symbol '%s' cannot be redefined\n", symName.c_str());
|
redefinedError(*sym);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,14 +354,15 @@ Symbol *sym_RedefString(std::string const &symName, std::shared_ptr<std::string>
|
|||||||
return sym_AddString(symName, str);
|
return sym_AddString(symName, str);
|
||||||
|
|
||||||
if (sym->type != SYM_EQUS) {
|
if (sym->type != SYM_EQUS) {
|
||||||
if (sym->isDefined())
|
if (sym->isDefined()) {
|
||||||
error("'%s' already defined as non-EQUS at ", symName.c_str());
|
alreadyDefinedError(*sym, "non-EQUS");
|
||||||
else
|
} else {
|
||||||
error("'%s' already referenced at ", symName.c_str());
|
error("'%s' already referenced at ", symName.c_str());
|
||||||
dumpFilename(*sym);
|
dumpFilename(*sym);
|
||||||
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
} else if (sym->isBuiltin) {
|
} else if (sym->isBuiltin) {
|
||||||
error("Built-in symbol '%s' cannot be redefined\n", symName.c_str());
|
redefinedError(*sym);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -356,12 +378,7 @@ Symbol *sym_AddVar(std::string const &symName, int32_t value) {
|
|||||||
if (!sym) {
|
if (!sym) {
|
||||||
sym = &createSymbol(symName);
|
sym = &createSymbol(symName);
|
||||||
} else if (sym->isDefined() && sym->type != SYM_VAR) {
|
} else if (sym->isDefined() && sym->type != SYM_VAR) {
|
||||||
error(
|
alreadyDefinedError(*sym, sym->type == SYM_LABEL ? "label" : "constant");
|
||||||
"'%s' already defined as %s at ",
|
|
||||||
symName.c_str(),
|
|
||||||
sym->type == SYM_LABEL ? "label" : "constant"
|
|
||||||
);
|
|
||||||
dumpFilename(*sym);
|
|
||||||
return sym;
|
return sym;
|
||||||
} else {
|
} else {
|
||||||
updateSymbolFilename(*sym);
|
updateSymbolFilename(*sym);
|
||||||
@@ -382,8 +399,7 @@ static Symbol *addLabel(std::string const &symName) {
|
|||||||
if (!sym) {
|
if (!sym) {
|
||||||
sym = &createSymbol(symName);
|
sym = &createSymbol(symName);
|
||||||
} else if (sym->isDefined()) {
|
} else if (sym->isDefined()) {
|
||||||
error("'%s' already defined at ", symName.c_str());
|
alreadyDefinedError(*sym, nullptr);
|
||||||
dumpFilename(*sym);
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
} else {
|
} else {
|
||||||
updateSymbolFilename(*sym);
|
updateSymbolFilename(*sym);
|
||||||
|
|||||||
15
test/asm/builtin-reserved.asm
Normal file
15
test/asm/builtin-reserved.asm
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
ASSERT !DEF(_NARG)
|
||||||
|
|
||||||
|
PURGE _NARG
|
||||||
|
|
||||||
|
DEF _NARG EQU 12
|
||||||
|
REDEF _NARG EQU 34
|
||||||
|
|
||||||
|
DEF _NARG = 56
|
||||||
|
REDEF _NARG = 78
|
||||||
|
|
||||||
|
DEF _NARG EQUS "hello"
|
||||||
|
REDEF _NARG EQUS "world"
|
||||||
|
|
||||||
|
SECTION "test", ROM0
|
||||||
|
_NARG:
|
||||||
17
test/asm/builtin-reserved.err
Normal file
17
test/asm/builtin-reserved.err
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
error: builtin-reserved.asm(3):
|
||||||
|
'_NARG' not defined
|
||||||
|
error: builtin-reserved.asm(5):
|
||||||
|
'_NARG' is reserved for a built-in symbol
|
||||||
|
error: builtin-reserved.asm(6):
|
||||||
|
'_NARG' is reserved for a built-in symbol
|
||||||
|
error: builtin-reserved.asm(8):
|
||||||
|
'_NARG' is reserved for a built-in symbol
|
||||||
|
error: builtin-reserved.asm(9):
|
||||||
|
'_NARG' is reserved for a built-in symbol
|
||||||
|
error: builtin-reserved.asm(11):
|
||||||
|
'_NARG' is reserved for a built-in symbol
|
||||||
|
error: builtin-reserved.asm(12):
|
||||||
|
'_NARG' is reserved for a built-in symbol
|
||||||
|
error: builtin-reserved.asm(15):
|
||||||
|
'_NARG' is reserved for a built-in symbol
|
||||||
|
error: Assembly aborted (8 errors)!
|
||||||
Reference in New Issue
Block a user