mirror of
https://github.com/gbdev/rgbds.git
synced 2026-06-16 13:42:12 +00:00
Add -Wlarge-constant to RGBLINK as it is for RGBASM
This commit is contained in:
@@ -142,6 +142,7 @@ _rgblink_completions() {
|
|||||||
mapfile -t COMPREPLY < <(compgen -W "
|
mapfile -t COMPREPLY < <(compgen -W "
|
||||||
assert
|
assert
|
||||||
div
|
div
|
||||||
|
large-constant
|
||||||
obsolete
|
obsolete
|
||||||
shift
|
shift
|
||||||
shift-amount
|
shift-amount
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ _rgblink_warnings() {
|
|||||||
|
|
||||||
'assert:Warn when WARN-type asserts fail'
|
'assert:Warn when WARN-type asserts fail'
|
||||||
'div:Warn when dividing the smallest int by -1'
|
'div:Warn when dividing the smallest int by -1'
|
||||||
|
'large-constant:Warn on constants too large for a signed 32-bit int'
|
||||||
'obsolete:Warn when using deprecated features'
|
'obsolete:Warn when using deprecated features'
|
||||||
'shift:Warn when shifting negative values'
|
'shift:Warn when shifting negative values'
|
||||||
'shift-amount:Warn when a shift'\''s operand is negative or \> 32'
|
'shift-amount:Warn when a shift'\''s operand is negative or \> 32'
|
||||||
|
|||||||
@@ -22,11 +22,12 @@ enum WarningLevel {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum WarningID {
|
enum WarningID {
|
||||||
WARNING_ASSERT, // Assertions
|
WARNING_ASSERT, // Assertions
|
||||||
WARNING_DIV, // Undefined division behavior
|
WARNING_DIV, // Undefined division behavior
|
||||||
WARNING_OBSOLETE, // Obsolete/deprecated things
|
WARNING_LARGE_CONSTANT, // Constants too large
|
||||||
WARNING_SHIFT, // Undefined `SHIFT` behavior
|
WARNING_OBSOLETE, // Obsolete/deprecated things
|
||||||
WARNING_SHIFT_AMOUNT, // Strange `SHIFT` amount
|
WARNING_SHIFT, // Undefined `SHIFT` behavior
|
||||||
|
WARNING_SHIFT_AMOUNT, // Strange `SHIFT` amount
|
||||||
|
|
||||||
NB_PLAIN_WARNINGS,
|
NB_PLAIN_WARNINGS,
|
||||||
|
|
||||||
@@ -47,6 +48,8 @@ void warning(FileStackNode const *src, uint32_t lineNo, WarningID id, char const
|
|||||||
void warning(FileStackNode const *src, uint32_t lineNo, char const *fmt, ...);
|
void warning(FileStackNode const *src, uint32_t lineNo, char const *fmt, ...);
|
||||||
[[gnu::format(printf, 1, 2)]]
|
[[gnu::format(printf, 1, 2)]]
|
||||||
void warning(char const *fmt, ...);
|
void warning(char const *fmt, ...);
|
||||||
|
[[gnu::format(printf, 2, 3)]]
|
||||||
|
void scriptWarning(WarningID id, char const *fmt, ...);
|
||||||
|
|
||||||
[[gnu::format(printf, 3, 4)]]
|
[[gnu::format(printf, 3, 4)]]
|
||||||
void error(FileStackNode const *src, uint32_t lineNo, char const *fmt, ...);
|
void error(FileStackNode const *src, uint32_t lineNo, char const *fmt, ...);
|
||||||
|
|||||||
@@ -369,6 +369,8 @@ for
|
|||||||
Warn when dividing the smallest negative integer (-2**31) by -1, which yields itself due to integer overflow.
|
Warn when dividing the smallest negative integer (-2**31) by -1, which yields itself due to integer overflow.
|
||||||
This warning is enabled by
|
This warning is enabled by
|
||||||
.Fl Wall .
|
.Fl Wall .
|
||||||
|
.It Fl Wno-large-constant
|
||||||
|
Warn when a constant too large to fit in a signed 32-bit integer is encountered.
|
||||||
.It Fl Wno-obsolete
|
.It Fl Wno-obsolete
|
||||||
Warn when obsolete features are encountered, which have been deprecated and may later be removed.
|
Warn when obsolete features are encountered, which have been deprecated and may later be removed.
|
||||||
.It Fl Wshift
|
.It Fl Wshift
|
||||||
|
|||||||
+11
-2
@@ -113,9 +113,18 @@ static yy::parser::symbol_type readNumber(int initial, char const *prefix, char
|
|||||||
context.file.sbumpc();
|
context.file.sbumpc();
|
||||||
}
|
}
|
||||||
for (int c = context.file.sgetc(); isDigit<Base>(c) || c == '_'; c = context.file.snextc()) {
|
for (int c = context.file.sgetc(); isDigit<Base>(c) || c == '_'; c = context.file.snextc()) {
|
||||||
if (c != '_') {
|
if (c == '_') {
|
||||||
number = number * Base + parseDigit<Base>(c);
|
continue;
|
||||||
}
|
}
|
||||||
|
uint32_t digit = parseDigit<Base>(c);
|
||||||
|
if (number > (UINT32_MAX - digit) / Base) {
|
||||||
|
scriptWarning(WARNING_LARGE_CONSTANT, "Integer constant is too large");
|
||||||
|
// Discard any additional digits
|
||||||
|
for (c = context.file.snextc(); isDigit<Base>(c) || c == '_';
|
||||||
|
c = context.file.snextc()) {}
|
||||||
|
return yy::parser::make_number(0);
|
||||||
|
}
|
||||||
|
number = number * Base + digit;
|
||||||
}
|
}
|
||||||
return yy::parser::make_number(number);
|
return yy::parser::make_number(number);
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-9
@@ -17,18 +17,19 @@
|
|||||||
// clang-format off: nested initializers
|
// clang-format off: nested initializers
|
||||||
Diagnostics<WarningLevel, WarningID> warnings = {
|
Diagnostics<WarningLevel, WarningID> warnings = {
|
||||||
.metaWarnings = {
|
.metaWarnings = {
|
||||||
{"all", LEVEL_ALL },
|
{"all", LEVEL_ALL },
|
||||||
{"everything", LEVEL_EVERYTHING},
|
{"everything", LEVEL_EVERYTHING},
|
||||||
},
|
},
|
||||||
.warningFlags = {
|
.warningFlags = {
|
||||||
{"assert", LEVEL_DEFAULT },
|
{"assert", LEVEL_DEFAULT },
|
||||||
{"div", LEVEL_ALL },
|
{"div", LEVEL_ALL },
|
||||||
{"obsolete", LEVEL_DEFAULT },
|
{"large-constant", LEVEL_DEFAULT },
|
||||||
{"shift", LEVEL_ALL },
|
{"obsolete", LEVEL_DEFAULT },
|
||||||
{"shift-amount", LEVEL_ALL },
|
{"shift", LEVEL_ALL },
|
||||||
|
{"shift-amount", LEVEL_ALL },
|
||||||
// Parametric warnings
|
// Parametric warnings
|
||||||
{"truncation", LEVEL_DEFAULT },
|
{"truncation", LEVEL_DEFAULT },
|
||||||
{"truncation", LEVEL_EVERYTHING},
|
{"truncation", LEVEL_EVERYTHING},
|
||||||
},
|
},
|
||||||
.paramWarnings = {
|
.paramWarnings = {
|
||||||
{WARNING_TRUNCATION_1, WARNING_TRUNCATION_2, 1},
|
{WARNING_TRUNCATION_1, WARNING_TRUNCATION_2, 1},
|
||||||
@@ -198,3 +199,29 @@ void warning(FileStackNode const *src, uint32_t lineNo, WarningID id, char const
|
|||||||
|
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void scriptWarning(WarningID id, char const *fmt, ...) {
|
||||||
|
char const *flag = warnings.warningFlags[id].name;
|
||||||
|
va_list args;
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
|
||||||
|
switch (warnings.getWarningBehavior(id)) {
|
||||||
|
case WarningBehavior::DISABLED:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WarningBehavior::ENABLED:
|
||||||
|
printDiag(nullptr, 0, fmt, args, "warning", STYLE_YELLOW, "[-W%s]", flag);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WarningBehavior::ERROR:
|
||||||
|
printDiag(nullptr, 0, fmt, args, "error", STYLE_RED, "[-Werror=%s]", flag);
|
||||||
|
|
||||||
|
warnings.incrementErrors();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
lexer_TraceCurrent();
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
section "test", rom0
|
||||||
|
label:: dw label
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
org $1_ffff_ffff
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
ROM0
|
||||||
|
INCLUDE "large-constant.inc"
|
||||||
|
"test"
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
warning: Integer constant is too large [-Wlarge-constant]
|
||||||
|
at large-constant.inc(1) <- large-constant.link(3)
|
||||||
Reference in New Issue
Block a user