mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 02:02:06 +00:00
Only print one warning for too-large integer constants, not one per digit (#1781)
This also makes all too-large integer constants evaluate to 0.
This commit is contained in:
@@ -978,6 +978,7 @@ static uint32_t readFractionalPart(uint32_t integer) {
|
||||
|
||||
if (integer >= (1ULL << (32 - precision))) {
|
||||
warning(WARNING_LARGE_CONSTANT, "Magnitude of fixed-point constant is too large");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Cast to unsigned avoids undefined overflow behavior
|
||||
@@ -1047,6 +1048,12 @@ static uint32_t readBinaryNumber() {
|
||||
}
|
||||
if (value > (UINT32_MAX - bit) / 2) {
|
||||
warning(WARNING_LARGE_CONSTANT, "Integer constant is too large");
|
||||
// Discard any additional digits
|
||||
skipChars([](int d) {
|
||||
return d == '0' || d == '1' || d == options.binDigits[0]
|
||||
|| d == options.binDigits[1] || d == '_';
|
||||
});
|
||||
return 0;
|
||||
}
|
||||
value = value * 2 + bit;
|
||||
|
||||
@@ -1075,6 +1082,9 @@ static uint32_t readOctalNumber() {
|
||||
|
||||
if (value > (UINT32_MAX - c) / 8) {
|
||||
warning(WARNING_LARGE_CONSTANT, "Integer constant is too large");
|
||||
// Discard any additional digits
|
||||
skipChars([](int d) { return (d >= '0' && d <= '7') || d == '_'; });
|
||||
return 0;
|
||||
}
|
||||
value = value * 8 + c;
|
||||
|
||||
@@ -1103,6 +1113,9 @@ static uint32_t readDecimalNumber(int initial) {
|
||||
|
||||
if (value > (UINT32_MAX - c) / 10) {
|
||||
warning(WARNING_LARGE_CONSTANT, "Integer constant is too large");
|
||||
// Discard any additional digits
|
||||
skipChars([](int d) { return (d >= '0' && d <= '9') || d == '_'; });
|
||||
return 0;
|
||||
}
|
||||
value = value * 10 + c;
|
||||
}
|
||||
@@ -1129,6 +1142,12 @@ static uint32_t readHexNumber() {
|
||||
|
||||
if (value > (UINT32_MAX - c) / 16) {
|
||||
warning(WARNING_LARGE_CONSTANT, "Integer constant is too large");
|
||||
// Discard any additional digits
|
||||
skipChars([](int d) {
|
||||
return (d >= '0' && d <= '9') || (d >= 'a' && d <= 'f') || (d >= 'A' && d <= 'f')
|
||||
|| d == '_';
|
||||
});
|
||||
return 0;
|
||||
}
|
||||
value = value * 16 + c;
|
||||
|
||||
@@ -1176,7 +1195,7 @@ static uint32_t readGfxConstant() {
|
||||
error("Invalid graphics constant, no digits after '`'");
|
||||
} else if (width == 9) {
|
||||
warning(
|
||||
WARNING_LARGE_CONSTANT, "Graphics constant is too long, only first 8 pixels considered"
|
||||
WARNING_LARGE_CONSTANT, "Graphics constant is too large; only first 8 pixels considered"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,91 +3,91 @@ Q. 1: min bad = 1 << 31 = -2147483648.0 = $00000000
|
||||
Q. 1: worse = 1 << 31 + 42 = -2147483606.0 = $00000054
|
||||
Q. 2: max ok = 1 << 30 - 1 = 1073741823.0 = $fffffffc
|
||||
Q. 2: min bad = 1 << 30 = 1073741824.0 = $00000000
|
||||
Q. 2: worse = 1 << 30 + 42 = 1073741866.0 = $000000a8
|
||||
Q. 2: worse = 1 << 30 + 42 = 1073741866.0 = $00000000
|
||||
Q. 3: max ok = 1 << 29 - 1 = 536870911.0 = $fffffff8
|
||||
Q. 3: min bad = 1 << 29 = 536870912.0 = $00000000
|
||||
Q. 3: worse = 1 << 29 + 42 = 536870954.0 = $00000150
|
||||
Q. 3: worse = 1 << 29 + 42 = 536870954.0 = $00000000
|
||||
Q. 4: max ok = 1 << 28 - 1 = 268435455.0 = $fffffff0
|
||||
Q. 4: min bad = 1 << 28 = 268435456.0 = $00000000
|
||||
Q. 4: worse = 1 << 28 + 42 = 268435498.0 = $000002a0
|
||||
Q. 4: worse = 1 << 28 + 42 = 268435498.0 = $00000000
|
||||
Q. 5: max ok = 1 << 27 - 1 = 134217727.0 = $ffffffe0
|
||||
Q. 5: min bad = 1 << 27 = 134217728.0 = $00000000
|
||||
Q. 5: worse = 1 << 27 + 42 = 134217770.0 = $00000540
|
||||
Q. 5: worse = 1 << 27 + 42 = 134217770.0 = $00000000
|
||||
Q. 6: max ok = 1 << 26 - 1 = 67108863.0 = $ffffffc0
|
||||
Q. 6: min bad = 1 << 26 = 67108864.0 = $00000000
|
||||
Q. 6: worse = 1 << 26 + 42 = 67108906.0 = $00000a80
|
||||
Q. 6: worse = 1 << 26 + 42 = 67108906.0 = $00000000
|
||||
Q. 7: max ok = 1 << 25 - 1 = 33554431.0 = $ffffff80
|
||||
Q. 7: min bad = 1 << 25 = 33554432.0 = $00000000
|
||||
Q. 7: worse = 1 << 25 + 42 = 33554474.0 = $00001500
|
||||
Q. 7: worse = 1 << 25 + 42 = 33554474.0 = $00000000
|
||||
Q. 8: max ok = 1 << 24 - 1 = 16777215.0 = $ffffff00
|
||||
Q. 8: min bad = 1 << 24 = 16777216.0 = $00000000
|
||||
Q. 8: worse = 1 << 24 + 42 = 16777258.0 = $00002a00
|
||||
Q. 8: worse = 1 << 24 + 42 = 16777258.0 = $00000000
|
||||
Q. 9: max ok = 1 << 23 - 1 = 8388607.0 = $fffffe00
|
||||
Q. 9: min bad = 1 << 23 = 8388608.0 = $00000000
|
||||
Q. 9: worse = 1 << 23 + 42 = 8388650.0 = $00005400
|
||||
Q. 9: worse = 1 << 23 + 42 = 8388650.0 = $00000000
|
||||
Q.10: max ok = 1 << 22 - 1 = 4194303.0 = $fffffc00
|
||||
Q.10: min bad = 1 << 22 = 4194304.0 = $00000000
|
||||
Q.10: worse = 1 << 22 + 42 = 4194346.0 = $0000a800
|
||||
Q.10: worse = 1 << 22 + 42 = 4194346.0 = $00000000
|
||||
Q.11: max ok = 1 << 21 - 1 = 2097151.0 = $fffff800
|
||||
Q.11: min bad = 1 << 21 = 2097152.0 = $00000000
|
||||
Q.11: worse = 1 << 21 + 42 = 2097194.0 = $00015000
|
||||
Q.11: worse = 1 << 21 + 42 = 2097194.0 = $00000000
|
||||
Q.12: max ok = 1 << 20 - 1 = 1048575.0 = $fffff000
|
||||
Q.12: min bad = 1 << 20 = 1048576.0 = $00000000
|
||||
Q.12: worse = 1 << 20 + 42 = 1048618.0 = $0002a000
|
||||
Q.12: worse = 1 << 20 + 42 = 1048618.0 = $00000000
|
||||
Q.13: max ok = 1 << 19 - 1 = 524287.0 = $ffffe000
|
||||
Q.13: min bad = 1 << 19 = 524288.0 = $00000000
|
||||
Q.13: worse = 1 << 19 + 42 = 524330.0 = $00054000
|
||||
Q.13: worse = 1 << 19 + 42 = 524330.0 = $00000000
|
||||
Q.14: max ok = 1 << 18 - 1 = 262143.0 = $ffffc000
|
||||
Q.14: min bad = 1 << 18 = 262144.0 = $00000000
|
||||
Q.14: worse = 1 << 18 + 42 = 262186.0 = $000a8000
|
||||
Q.14: worse = 1 << 18 + 42 = 262186.0 = $00000000
|
||||
Q.15: max ok = 1 << 17 - 1 = 131071.0 = $ffff8000
|
||||
Q.15: min bad = 1 << 17 = 131072.0 = $00000000
|
||||
Q.15: worse = 1 << 17 + 42 = 131114.0 = $00150000
|
||||
Q.15: worse = 1 << 17 + 42 = 131114.0 = $00000000
|
||||
Q.16: max ok = 1 << 16 - 1 = 65535.0 = $ffff0000
|
||||
Q.16: min bad = 1 << 16 = 65536.0 = $00000000
|
||||
Q.16: worse = 1 << 16 + 42 = 65578.0 = $002a0000
|
||||
Q.16: worse = 1 << 16 + 42 = 65578.0 = $00000000
|
||||
Q.17: max ok = 1 << 15 - 1 = 32767.0 = $fffe0000
|
||||
Q.17: min bad = 1 << 15 = 32768.0 = $00000000
|
||||
Q.17: worse = 1 << 15 + 42 = 32810.0 = $00540000
|
||||
Q.17: worse = 1 << 15 + 42 = 32810.0 = $00000000
|
||||
Q.18: max ok = 1 << 14 - 1 = 16383.0 = $fffc0000
|
||||
Q.18: min bad = 1 << 14 = 16384.0 = $00000000
|
||||
Q.18: worse = 1 << 14 + 42 = 16426.0 = $00a80000
|
||||
Q.18: worse = 1 << 14 + 42 = 16426.0 = $00000000
|
||||
Q.19: max ok = 1 << 13 - 1 = 8191.0 = $fff80000
|
||||
Q.19: min bad = 1 << 13 = 8192.0 = $00000000
|
||||
Q.19: worse = 1 << 13 + 42 = 8234.0 = $01500000
|
||||
Q.19: worse = 1 << 13 + 42 = 8234.0 = $00000000
|
||||
Q.20: max ok = 1 << 12 - 1 = 4095.0 = $fff00000
|
||||
Q.20: min bad = 1 << 12 = 4096.0 = $00000000
|
||||
Q.20: worse = 1 << 12 + 42 = 4138.0 = $02a00000
|
||||
Q.20: worse = 1 << 12 + 42 = 4138.0 = $00000000
|
||||
Q.21: max ok = 1 << 11 - 1 = 2047.0 = $ffe00000
|
||||
Q.21: min bad = 1 << 11 = 2048.0 = $00000000
|
||||
Q.21: worse = 1 << 11 + 42 = 2090.0 = $05400000
|
||||
Q.21: worse = 1 << 11 + 42 = 2090.0 = $00000000
|
||||
Q.22: max ok = 1 << 10 - 1 = 1023.0 = $ffc00000
|
||||
Q.22: min bad = 1 << 10 = 1024.0 = $00000000
|
||||
Q.22: worse = 1 << 10 + 42 = 1066.0 = $0a800000
|
||||
Q.22: worse = 1 << 10 + 42 = 1066.0 = $00000000
|
||||
Q.23: max ok = 1 << 9 - 1 = 511.0 = $ff800000
|
||||
Q.23: min bad = 1 << 9 = 512.0 = $00000000
|
||||
Q.23: worse = 1 << 9 + 42 = 554.0 = $15000000
|
||||
Q.23: worse = 1 << 9 + 42 = 554.0 = $00000000
|
||||
Q.24: max ok = 1 << 8 - 1 = 255.0 = $ff000000
|
||||
Q.24: min bad = 1 << 8 = 256.0 = $00000000
|
||||
Q.24: worse = 1 << 8 + 42 = 298.0 = $2a000000
|
||||
Q.24: worse = 1 << 8 + 42 = 298.0 = $00000000
|
||||
Q.25: max ok = 1 << 7 - 1 = 127.0 = $fe000000
|
||||
Q.25: min bad = 1 << 7 = 128.0 = $00000000
|
||||
Q.25: worse = 1 << 7 + 42 = 170.0 = $54000000
|
||||
Q.25: worse = 1 << 7 + 42 = 170.0 = $00000000
|
||||
Q.26: max ok = 1 << 6 - 1 = 63.0 = $fc000000
|
||||
Q.26: min bad = 1 << 6 = 64.0 = $00000000
|
||||
Q.26: worse = 1 << 6 + 42 = 106.0 = $a8000000
|
||||
Q.26: worse = 1 << 6 + 42 = 106.0 = $00000000
|
||||
Q.27: max ok = 1 << 5 - 1 = 31.0 = $f8000000
|
||||
Q.27: min bad = 1 << 5 = 32.0 = $00000000
|
||||
Q.27: worse = 1 << 5 + 42 = 74.0 = $50000000
|
||||
Q.27: worse = 1 << 5 + 42 = 74.0 = $00000000
|
||||
Q.28: max ok = 1 << 4 - 1 = 15.0 = $f0000000
|
||||
Q.28: min bad = 1 << 4 = 16.0 = $00000000
|
||||
Q.28: worse = 1 << 4 + 42 = 58.0 = $a0000000
|
||||
Q.28: worse = 1 << 4 + 42 = 58.0 = $00000000
|
||||
Q.29: max ok = 1 << 3 - 1 = 7.0 = $e0000000
|
||||
Q.29: min bad = 1 << 3 = 8.0 = $00000000
|
||||
Q.29: worse = 1 << 3 + 42 = 50.0 = $40000000
|
||||
Q.29: worse = 1 << 3 + 42 = 50.0 = $00000000
|
||||
Q.30: max ok = 1 << 2 - 1 = 3.0 = $c0000000
|
||||
Q.30: min bad = 1 << 2 = 4.0 = $00000000
|
||||
Q.30: worse = 1 << 2 + 42 = 46.0 = $80000000
|
||||
Q.30: worse = 1 << 2 + 42 = 46.0 = $00000000
|
||||
Q.31: max ok = 1 << 1 - 1 = 1.0 = $80000000
|
||||
Q.31: min bad = 1 << 1 = 2.0 = $00000000
|
||||
Q.31: worse = 1 << 1 + 42 = 44.0 = $00000000
|
||||
|
||||
@@ -1,20 +1,29 @@
|
||||
macro try
|
||||
def x = \1
|
||||
if _NARG > 1
|
||||
assert x == \2
|
||||
else
|
||||
assert x == 0
|
||||
endc
|
||||
endm
|
||||
|
||||
; no digits
|
||||
def x = $
|
||||
def x = `
|
||||
def x = 0b
|
||||
def x = 0o
|
||||
def x = 0x
|
||||
try $
|
||||
try `
|
||||
try 0b
|
||||
try 0o
|
||||
try 0x
|
||||
|
||||
; too large
|
||||
def x = 9_876_543_210
|
||||
def x = $f_0000_0000
|
||||
def x = &400_0000_0000
|
||||
def x = %1_00000000_00000000_00000000_00000000
|
||||
def x = 65537.0q16
|
||||
try 999_876_543_210
|
||||
try $ffff_0000_0000
|
||||
try &7777_0000_0000_0000
|
||||
try %1111_00000000_00000000_00000000_00000000
|
||||
try `0123_3210_0123, `0123_3210
|
||||
try 99999.0q16
|
||||
|
||||
; no precision suffix
|
||||
def x = 3.14q
|
||||
try 3.14q, 3.14
|
||||
|
||||
; invalid precision suffix
|
||||
def x = 3.14q40
|
||||
|
||||
try 3.14q40, 3.14
|
||||
|
||||
@@ -1,25 +1,27 @@
|
||||
error: invalid-numbers.asm(2):
|
||||
error: invalid-numbers.asm(11) -> invalid-numbers.asm::try(2):
|
||||
Invalid integer constant, no digits after '$'
|
||||
error: invalid-numbers.asm(3):
|
||||
error: invalid-numbers.asm(12) -> invalid-numbers.asm::try(2):
|
||||
Invalid graphics constant, no digits after '`'
|
||||
error: invalid-numbers.asm(4):
|
||||
error: invalid-numbers.asm(13) -> invalid-numbers.asm::try(2):
|
||||
Invalid integer constant, no digits after '%'
|
||||
error: invalid-numbers.asm(5):
|
||||
error: invalid-numbers.asm(14) -> invalid-numbers.asm::try(2):
|
||||
Invalid integer constant, no digits after '&'
|
||||
error: invalid-numbers.asm(6):
|
||||
error: invalid-numbers.asm(15) -> invalid-numbers.asm::try(2):
|
||||
Invalid integer constant, no digits after '$'
|
||||
warning: invalid-numbers.asm(9): [-Wlarge-constant]
|
||||
warning: invalid-numbers.asm(18) -> invalid-numbers.asm::try(2): [-Wlarge-constant]
|
||||
Integer constant is too large
|
||||
warning: invalid-numbers.asm(10): [-Wlarge-constant]
|
||||
warning: invalid-numbers.asm(19) -> invalid-numbers.asm::try(2): [-Wlarge-constant]
|
||||
Integer constant is too large
|
||||
warning: invalid-numbers.asm(11): [-Wlarge-constant]
|
||||
warning: invalid-numbers.asm(20) -> invalid-numbers.asm::try(2): [-Wlarge-constant]
|
||||
Integer constant is too large
|
||||
warning: invalid-numbers.asm(12): [-Wlarge-constant]
|
||||
warning: invalid-numbers.asm(21) -> invalid-numbers.asm::try(2): [-Wlarge-constant]
|
||||
Integer constant is too large
|
||||
warning: invalid-numbers.asm(13): [-Wlarge-constant]
|
||||
warning: invalid-numbers.asm(22) -> invalid-numbers.asm::try(2): [-Wlarge-constant]
|
||||
Graphics constant is too large; only first 8 pixels considered
|
||||
warning: invalid-numbers.asm(23) -> invalid-numbers.asm::try(2): [-Wlarge-constant]
|
||||
Magnitude of fixed-point constant is too large
|
||||
error: invalid-numbers.asm(16):
|
||||
error: invalid-numbers.asm(26) -> invalid-numbers.asm::try(2):
|
||||
Invalid fixed-point constant, no significant digits after 'q'
|
||||
error: invalid-numbers.asm(19):
|
||||
error: invalid-numbers.asm(29) -> invalid-numbers.asm::try(2):
|
||||
Fixed-point constant precision must be between 1 and 31
|
||||
Assembly aborted with 7 errors!
|
||||
|
||||
@@ -5,4 +5,4 @@ warning: overflow.asm(24): [-Wdiv]
|
||||
warning: overflow.asm(44): [-Wlarge-constant]
|
||||
Integer constant is too large
|
||||
warning: overflow.asm(47): [-Wlarge-constant]
|
||||
Graphics constant is too long, only first 8 pixels considered
|
||||
Graphics constant is too large; only first 8 pixels considered
|
||||
|
||||
@@ -111,7 +111,7 @@ if "$nonfree"; then
|
||||
action pret pokered 2025-07-21 fd86bcaa06fd81911e88eb6d0253715ad79866a8
|
||||
action zladx LADX-Disassembly 2025-07-26 3ab7b582f67b4302a4f6371f9309f0de167e78ee
|
||||
fi
|
||||
action AntonioND ucity 2025-05-30 83e5c697cbd9e10a0bc72b02bcb6146c35e2c328
|
||||
action AntonioND ucity 2025-08-07 d1880a2a112d7c26f16c0fc06a15b6c32fdc9137
|
||||
action pinobatch libbet 2025-05-20 bb6cfc026644aa1034eee6d9c49bb4705601c9f6
|
||||
action LIJI32 SameBoy 2025-07-26 410719854885b60df8566a444c81bc767965f477
|
||||
action ISSOtm gb-starter-kit 2025-06-13 3cce3215b0bcb559a5cf4ca5916e2d817d53ff29
|
||||
|
||||
@@ -129,7 +129,7 @@ if "$nonfree"; then
|
||||
test_downstream pret pokered compare pokered.gbc ea9bcae617fdf159b045185467ae58b2e4a48b9a
|
||||
test_downstream zladx LADX-Disassembly default azle.gbc d90ac17e9bf17b6c61624ad9f05447bdb5efc01a
|
||||
fi
|
||||
test_downstream AntonioND ucity all ucity.gbc d2f4a7db48ee208b1bd69a78bd492a1c9ac4a030
|
||||
test_downstream AntonioND ucity all ucity.gbc 5f026649611c9606ce0bf70dc1552e054e7df5bc
|
||||
test_downstream pinobatch libbet all libbet.gb f117089aa056600e2d404bbcbac96b016fc64611
|
||||
test_downstream LIJI32 SameBoy bootroms build/bin/BootROMs/cgb_boot.bin 113903775a9d34b798c2f8076672da6626815a91
|
||||
# gb-starter kit make fails on Windows: https://github.com/ISSOtm/gb-starter-kit/issues/1
|
||||
|
||||
Reference in New Issue
Block a user