Deprecate __FILE__ and __LINE__ (#1072)

Unlike C, these constants are not convenient for logging in macros,
since they always report the same data (their location in the macro).

Fixes #1068
This commit is contained in:
Rangi
2022-09-30 13:48:30 -04:00
committed by GitHub
parent 68ad926279
commit a47da5f71f
13 changed files with 77 additions and 88 deletions

View File

@@ -1346,8 +1346,6 @@ The following symbols are defined by the assembler:
.It Dv @ Ta Ic EQU Ta PC value (essentially, the current memory address) .It Dv @ Ta Ic EQU Ta PC value (essentially, the current memory address)
.It Dv _RS Ta Ic = Ta _RS Counter .It Dv _RS Ta Ic = Ta _RS Counter
.It Dv _NARG Ta Ic EQU Ta Number of arguments passed to macro, updated by Ic SHIFT .It Dv _NARG Ta Ic EQU Ta Number of arguments passed to macro, updated by Ic SHIFT
.It Dv __LINE__ Ta Ic EQU Ta The current line number
.It Dv __FILE__ Ta Ic EQUS Ta The current filename
.It Dv __DATE__ Ta Ic EQUS Ta Today's date .It Dv __DATE__ Ta Ic EQUS Ta Today's date
.It Dv __TIME__ Ta Ic EQUS Ta The current time .It Dv __TIME__ Ta Ic EQUS Ta The current time
.It Dv __ISO_8601_LOCAL__ Ta Ic EQUS Ta ISO 8601 timestamp (local) .It Dv __ISO_8601_LOCAL__ Ta Ic EQUS Ta ISO 8601 timestamp (local)

View File

@@ -78,12 +78,15 @@ static int32_t Callback_NARG(void)
static int32_t Callback__LINE__(void) static int32_t Callback__LINE__(void)
{ {
warning(WARNING_OBSOLETE, "`__LINE__` is deprecated\n");
return lexer_GetLineNo(); return lexer_GetLineNo();
} }
static char const *Callback__FILE__(void) static char const *Callback__FILE__(void)
{ {
// FIXME: this is dangerous, and here's why this is CURRENTLY okay. It's still bad, fix it. warning(WARNING_OBSOLETE, "`__FILE__` is deprecated\n");
// There are only two call sites for this; one copies the contents directly, the other is // There are only two call sites for this; one copies the contents directly, the other is
// EQUS expansions, which cannot straddle file boundaries. So this should be fine. // EQUS expansions, which cannot straddle file boundaries. So this should be fine.
static char *buf = NULL; static char *buf = NULL;
@@ -680,7 +683,9 @@ void sym_Init(time_t now)
{ {
PCSymbol = createBuiltinSymbol("@"); PCSymbol = createBuiltinSymbol("@");
struct Symbol *_NARGSymbol = createBuiltinSymbol("_NARG"); struct Symbol *_NARGSymbol = createBuiltinSymbol("_NARG");
// __LINE__ is deprecated
struct Symbol *__LINE__Symbol = createBuiltinSymbol("__LINE__"); struct Symbol *__LINE__Symbol = createBuiltinSymbol("__LINE__");
// __FILE__ is deprecated
struct Symbol *__FILE__Symbol = createBuiltinSymbol("__FILE__"); struct Symbol *__FILE__Symbol = createBuiltinSymbol("__FILE__");
PCSymbol->type = SYM_LABEL; PCSymbol->type = SYM_LABEL;

View File

@@ -39,5 +39,6 @@ PRINTLN \1
endm endm
; Representative numeric and string builtins ; Representative numeric and string builtins
tickle __LINE__, 1 ; (SOURCE_DATE_EPOCH in test.sh makes this reproducible)
tickle __FILE__, 0 tickle __UTC_YEAR__, 1
tickle __ISO_8601_UTC__, 0

View File

@@ -1,57 +1,57 @@
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(7): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(7):
'__LINE__' already defined as constant at <builtin> '__UTC_YEAR__' already defined as constant at <command-line>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(8): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(8):
'__LINE__' already defined as constant at <builtin> '__UTC_YEAR__' already defined as constant at <command-line>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(11): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(11):
'__LINE__' already defined at <builtin> '__UTC_YEAR__' already defined at <command-line>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(12): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(12):
'__LINE__' already defined at <builtin> '__UTC_YEAR__' already defined at <command-line>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(16):
Built-in symbol '__LINE__' cannot be purged
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(17):
Built-in symbol '__LINE__' cannot be purged
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(20):
'__LINE__' already defined at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(21):
'__LINE__' already defined at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(24):
'__LINE__' already defined as constant at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(25):
'__LINE__' already defined as constant at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(28):
'__LINE__' already defined at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(29):
'__LINE__' already defined at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(32):
'__LINE__' already defined as constant at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(33):
'__LINE__' already defined as constant at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(36):
'__LINE__' already defined as non-EQUS at <builtin>
error: builtin-overwrite.asm(42) -> builtin-overwrite.asm::tickle(37):
'__LINE__' already defined as non-EQUS at <builtin>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(16): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(16):
Built-in symbol '__FILE__' cannot be purged Built-in symbol '__UTC_YEAR__' cannot be purged
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(17): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(17):
Built-in symbol '__FILE__' cannot be purged Built-in symbol '__UTC_YEAR__' cannot be purged
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(20): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(20):
'__FILE__' already defined at <builtin> '__UTC_YEAR__' already defined at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(21): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(21):
'__FILE__' already defined at <builtin> '__UTC_YEAR__' already defined at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(24): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(24):
'__FILE__' already defined as constant at <builtin> '__UTC_YEAR__' already defined as constant at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(25): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(25):
'__FILE__' already defined as constant at <builtin> '__UTC_YEAR__' already defined as constant at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(28): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(28):
'__FILE__' already defined at <builtin> '__UTC_YEAR__' already defined at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(29): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(29):
'__FILE__' already defined at <builtin> '__UTC_YEAR__' already defined at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(32): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(32):
'__FILE__' already defined as constant at <builtin> '__UTC_YEAR__' already defined as constant at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(33): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(33):
'__FILE__' already defined as constant at <builtin> '__UTC_YEAR__' already defined as constant at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(36): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(36):
Built-in symbol '__FILE__' cannot be redefined '__UTC_YEAR__' already defined as non-EQUS at <command-line>
error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(37): error: builtin-overwrite.asm(43) -> builtin-overwrite.asm::tickle(37):
Built-in symbol '__FILE__' cannot be redefined '__UTC_YEAR__' already defined as non-EQUS at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(16):
Built-in symbol '__ISO_8601_UTC__' cannot be purged
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(17):
Built-in symbol '__ISO_8601_UTC__' cannot be purged
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(20):
'__ISO_8601_UTC__' already defined at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(21):
'__ISO_8601_UTC__' already defined at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(24):
'__ISO_8601_UTC__' already defined as constant at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(25):
'__ISO_8601_UTC__' already defined as constant at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(28):
'__ISO_8601_UTC__' already defined at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(29):
'__ISO_8601_UTC__' already defined at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(32):
'__ISO_8601_UTC__' already defined as constant at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(33):
'__ISO_8601_UTC__' already defined as constant at <command-line>
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(36):
Built-in symbol '__ISO_8601_UTC__' cannot be redefined
error: builtin-overwrite.asm(44) -> builtin-overwrite.asm::tickle(37):
Built-in symbol '__ISO_8601_UTC__' cannot be redefined
error: Assembly aborted (28 errors)! error: Assembly aborted (28 errors)!

View File

@@ -1,14 +1,14 @@
$9 $7C5
$D $7C5
$12 $7C5
$16 $7C5
$1A $7C5
$1E $7C5
$22 $7C5
$26 $7C5
builtin-overwrite.asm 1989-04-21T12:34:56Z
builtin-overwrite.asm 1989-04-21T12:34:56Z
builtin-overwrite.asm 1989-04-21T12:34:56Z
builtin-overwrite.asm 1989-04-21T12:34:56Z
builtin-overwrite.asm 1989-04-21T12:34:56Z
builtin-overwrite.asm 1989-04-21T12:34:56Z

View File

@@ -33,8 +33,5 @@ endm
_RS += 100 _RS += 100
println _RS println _RS
__LINE__ *= 200
println __LINE__
UnDeFiNeD ^= 300 UnDeFiNeD ^= 300
println UnDeFiNeD println UnDeFiNeD

View File

@@ -1,5 +1,3 @@
error: compound-assignment.asm(36): error: compound-assignment.asm(36):
'__LINE__' already defined as constant at <builtin>
error: compound-assignment.asm(39):
Expected constant expression: 'UnDeFiNeD' is not constant at assembly time Expected constant expression: 'UnDeFiNeD' is not constant at assembly time
error: Assembly aborted (2 errors)! error: Assembly aborted (1 error)!

View File

@@ -35,5 +35,4 @@ $5
$14 $14
$A $A
$64 $64
$25
$0 $0

View File

@@ -0,0 +1,2 @@
warning: file-sym.asm(1): [-Wobsolete]
`__FILE__` is deprecated

View File

@@ -1,3 +1,3 @@
warn "main {__FILE__}" warn "main file"
def v3 = v1 + v2 def v3 = v1 + v2
println "{d:v1} + {d:v2} = {d:v3}" println "{d:v1} + {d:v2} = {d:v3}"

View File

@@ -1,4 +1,4 @@
warning: preinclude.asm(0) -> preinclude.inc(1): [-Wuser] warning: preinclude.asm(0) -> preinclude.inc(1): [-Wuser]
pre-include "preinclude.inc" pre-included file
warning: preinclude.asm(1): [-Wuser] warning: preinclude.asm(1): [-Wuser]
main "preinclude.asm" main file

View File

@@ -1,4 +1,4 @@
warn "pre-include {__FILE__}" warn "pre-included file"
def v1 = 12 def v1 = 12
rept 3 rept 3

View File

@@ -2,6 +2,9 @@
export LC_ALL=C export LC_ALL=C
# Game Boy release date, 1989-04-21T12:34:56Z (for reproducible test results)
export SOURCE_DATE_EPOCH=609165296
o="$(mktemp)" o="$(mktemp)"
gb="$(mktemp)" gb="$(mktemp)"
input="$(mktemp)" input="$(mktemp)"
@@ -52,20 +55,6 @@ else
rm -f version.asm rm -f version.asm
fi fi
# Add the quote test, except on Windows
if uname | grep -viq mingw; then
cat > quote\"file.asm <<EOF
WARN __FILE__
EOF
cat > quote\"file.out <<EOF
EOF
cat > quote\"file.err <<EOF
warning: quote"file.asm(1): [-Wuser]
quote"file.asm
while expanding symbol "__FILE__"
EOF
fi
# Check whether to use '.simple.err' files if they exist # Check whether to use '.simple.err' files if they exist
# (rgbasm with pre-3.0 Bison just reports "syntax error") # (rgbasm with pre-3.0 Bison just reports "syntax error")
$RGBASM -Weverything -o $o syntax-error.asm > $output 2> $errput $RGBASM -Weverything -o $o syntax-error.asm > $output 2> $errput