[Nasm-bugs] [Bug 3392623] New: git nasm: %xdefine macro(a) (a) expands a
noreply-nasm at dev.nasm.us
noreply-nasm at dev.nasm.us
Tue Oct 15 05:50:37 PDT 2019
https://bugzilla.nasm.us/show_bug.cgi?id=3392623
Bug ID: 3392623
Summary: git nasm: %xdefine macro(a) (a) expands a
Product: NASM
Version: 2.15 (development)
Hardware: All
OS: All
Status: OPEN
Severity: severe
Priority: Medium
Component: Assembler
Assignee: nobody at nasm.us
Reporter: pushbx at ulukai.org
CC: chang.seok.bae at intel.com, gorcunov at gmail.com,
hpa at zytor.com, nasm-bugs at nasm.us
Obtained from: Built from git using configure
The version of nasm here is
https://repo.or.cz/nasm.git/commitdiff/d03a6c8ffedd1496221eca5f02ba0215794cfaf9
plus the patch given in https://bugzilla.nasm.us/show_bug.cgi?id=3392599#c11
The test.asm contents are lifted directly from
https://hg.ulukai.org/ecm/lmacros/file/67a2ee517d8e/lmacros1.mac test2.asm
contains a workaround that uses %define instead of %xdefine.
The problem is that I used d as a single-line macro parameter in the _Xdigits
macros, which are specified with %xdefine, but d is also %idefine to dword. The
new preprocessor expands this d in the %xdefine line to dword, whereas older
preprocessors don't.
$ nasm -v
NASM version 2.15rc0 compiled on Oct 10 2019
$ cat test.asm
%idefine d dword
%define _1digits_nocheck(d) (((d)% 10)+'0')
%xdefine _1digits(d) (!!(d/10)*(1<<32)+ _1digits_nocheck(d))
db _1digits(8)
$ nasm test.asm
test.asm:6: error: expression syntax error
$ nasm -Ls -Lp -l test.lst test.asm
test.asm:6: error: expression syntax error
$ cat test.lst
0 ;;; %define __?FILE?__
0 ;;; %define __?LINE?__
0 ;;; %define __?BITS?__
0 ;;; %define __?PTR?__
0 ;;; %define __?PASS?__ 1
0 ;;; %define __?SECT?__
0 ;;; %defalias __SECT__ __?SECT?__
0 ;;; %define
__?SECTALIGN_ALIGN_UPDATES_SECTION?__ 1
0 ;;; %defalias
__SECTALIGN_ALIGN_UPDATES_SECTION__ __?SECTALIGN_ALIGN_UPDATES_SECTION?__
0 ;;; %define __?FLOAT_DAZ?__ nodaz
0 ;;; %define __?FLOAT_ROUND?__ near
0 ;;; %define __?FLOAT?__
__?FLOAT_DAZ?__,__?FLOAT_ROUND?__
0 ;;; %defalias __FLOAT_DAZ__
__?FLOAT_DAZ?__
0 ;;; %defalias __FLOAT_ROUND__
__?FLOAT_ROUND?__
0 ;;; %defalias __FLOAT__ __?FLOAT?__
0 ;;; %defalias __NASM_MAJOR__
__?NASM_MAJOR?__
0 ;;; %defalias __NASM_MINOR__
__?NASM_MINOR?__
0 ;;; %defalias __NASM_SUBMINOR__
__?NASM_SUBMINOR?__
0 ;;; %defalias __NASM_PATCHLEVEL__
__?NASM_PATCHLEVEL?__
0 ;;; %defalias __NASM_SNAPSHOT__
__?NASM_SNAPSHOT?__
0 ;;; %defalias __NASM_VERSION_ID__
__?NASM_VERSION_ID?__
0 ;;; %defalias __NASM_VER__
__?NASM_VER?__
0 ;;; %defalias __OUTPUT_FORMAT__
__?OUTPUT_FORMAT?__
0 ;;; %defalias __DEBUG_FORMAT__
__?DEBUG_FORMAT?__
0 ;;; %defalias __DATE__ __?DATE?__
0 ;;; %defalias __DATE_NUM__
__?DATE_NUM?__
0 ;;; %defalias __TIME__ __?TIME?__
0 ;;; %defalias __TIME_NUM__
__?TIME_NUM?__
0 ;;; %defalias __UTC_DATE__
__?UTC_DATE?__
0 ;;; %defalias __UTC_DATE_NUM__
__?UTC_DATE_NUM?__
0 ;;; %defalias __UTC_TIME__
__?UTC_TIME?__
0 ;;; %defalias __UTC_TIME_NUM__
__?UTC_TIME_NUM?__
0 ;;; %defalias __POSIX_TIME__
__?POSIX_TIME?__
0 ;;; %defalias __FILE__ __?FILE?__
0 ;;; %defalias __LINE__ __?LINE?__
0 ;;; %defalias __BITS__ __?BITS?__
0 ;;; %defalias __PTR__ __?PTR?__
0 ;;; %defalias __PASS__ __?PASS?__
0 ;;; %idefine __?infinity?__ %?
0 ;;; %idefine __?nan?__ %?
0 ;;; %idefine __?qnan?__ %?
0 ;;; %idefine __?snan?__ %?
0 ;;; %idefine __?float8?__ %?
0 ;;; %idefine __?float16?__ %?
0 ;;; %idefine __?float32?__ %?
0 ;;; %idefine __?float64?__ %?
0 ;;; %idefine __?float80m?__ %?
0 ;;; %idefine __?float80e?__ %?
0 ;;; %idefine __?float128l?__ %?
0 ;;; %idefine __?float128h?__ %?
0 ;;; %idefine __?utf16?__ %?
0 ;;; %idefine __?utf16le?__ %?
0 ;;; %idefine __?utf16be?__ %?
0 ;;; %idefine __?utf32?__ %?
0 ;;; %idefine __?utf32le?__ %?
0 ;;; %idefine __?utf32be?__ %?
0 ;;; %idefine __?ilog2e?__ %?
0 ;;; %idefine __?ilog2w?__ %?
0 ;;; %idefine __?ilog2f?__ %?
0 ;;; %idefine __?ilog2c?__ %?
0 ;;; %idefalias __infinity__
__?infinity?__
0 ;;; %idefalias __nan__ __?nan?__
0 ;;; %idefalias __qnan__ __?qnan?__
0 ;;; %idefalias __snan__ __?snan?__
0 ;;; %idefalias __float8__ __?float8?__
0 ;;; %idefalias __float16__
__?float16?__
0 ;;; %idefalias __float32__
__?float32?__
0 ;;; %idefalias __float64__
__?float64?__
0 ;;; %idefalias __float80m__
__?float80m?__
0 ;;; %idefalias __float80e__
__?float80e?__
0 ;;; %idefalias __float128l__
__?float128l?__
0 ;;; %idefalias __float128h__
__?float128h?__
0 ;;; %idefalias __utf16__ __?utf16?__
0 ;;; %idefalias __utf16le__
__?utf16le?__
0 ;;; %idefalias __utf16be__
__?utf16be?__
0 ;;; %idefalias __utf32__ __?utf32?__
0 ;;; %idefalias __utf32le__
__?utf32le?__
0 ;;; %idefalias __utf32be__
__?utf32be?__
0 ;;; %idefalias __ilog2e__ __?ilog2e?__
0 ;;; %idefalias __ilog2w__ __?ilog2w?__
0 ;;; %idefalias __ilog2f__ __?ilog2f?__
0 ;;; %idefalias __ilog2c__ __?ilog2c?__
0 ;;; %define __?NASM_MAJOR?__ 2
0 ;;; %define __?NASM_MINOR?__ 14
0 ;;; %define __?NASM_SUBMINOR?__ 99
0 ;;; %define __?NASM_PATCHLEVEL?__ 90
0 ;;; %define __?NASM_VERSION_ID?__
0020E635Ah
0 ;;; %define __?NASM_VER?__ "2.15rc0"
0 ;;; %define __?SECT?__ [section .text]
0 ;;; %define __?DATE?__ "2019-10-15"
0 ;;; %define __?DATE_NUM?__ 20191015
0 ;;; %define __?TIME?__ "14:37:07"
0 ;;; %define __?TIME_NUM?__ 143707
0 ;;; %define __?UTC_DATE?__
"2019-10-15"
0 ;;; %define __?UTC_DATE_NUM?__
20191015
0 ;;; %define __?UTC_TIME?__ "12:37:07"
0 ;;; %define __?UTC_TIME_NUM?__ 123707
0 ;;; %define __?POSIX_TIME?__
1571143027
0 ;;; %define __?OUTPUT_FORMAT?__ bin
1 %idefine d dword
1 ;;; %idefine d dword
2
3 %define _1digits_nocheck(d) (((d)%
10)+'0')
3 ;;; %define _1digits_nocheck(d) (((d)%
10)+'0')
4 %xdefine _1digits(d)
(!!(d/10)*(1<<32)+ _1digits_nocheck(d))
4 ;;; %define _1digits(d)
(!!(dword/10)*(1<<32)+ (((dword)% 10)+'0'))
5
6 db _1digits(8)
6 ****************** error: expression syntax error
$ cat test2.asm
%idefine d dword
%define _1digits_nocheck(d) (((d)% 10)+'0')
%define _1digits(d) (!!(d/10)*(1<<32)+ _1digits_nocheck(d))
db _1digits(8)
$ nasm test2.asm
$ nasm -Ls -Lp -l test2.lst test2.asm
$ cat test2.lst
0 ;;; %define __?FILE?__
0 ;;; %define __?LINE?__
0 ;;; %define __?BITS?__
0 ;;; %define __?PTR?__
0 ;;; %define __?PASS?__ 2
0 ;;; %define __?SECT?__
0 ;;; %defalias __SECT__ __?SECT?__
0 ;;; %define
__?SECTALIGN_ALIGN_UPDATES_SECTION?__ 1
0 ;;; %defalias
__SECTALIGN_ALIGN_UPDATES_SECTION__ __?SECTALIGN_ALIGN_UPDATES_SECTION?__
0 ;;; %define __?FLOAT_DAZ?__ nodaz
0 ;;; %define __?FLOAT_ROUND?__ near
0 ;;; %define __?FLOAT?__
__?FLOAT_DAZ?__,__?FLOAT_ROUND?__
0 ;;; %defalias __FLOAT_DAZ__
__?FLOAT_DAZ?__
0 ;;; %defalias __FLOAT_ROUND__
__?FLOAT_ROUND?__
0 ;;; %defalias __FLOAT__ __?FLOAT?__
0 ;;; %defalias __NASM_MAJOR__
__?NASM_MAJOR?__
0 ;;; %defalias __NASM_MINOR__
__?NASM_MINOR?__
0 ;;; %defalias __NASM_SUBMINOR__
__?NASM_SUBMINOR?__
0 ;;; %defalias __NASM_PATCHLEVEL__
__?NASM_PATCHLEVEL?__
0 ;;; %defalias __NASM_SNAPSHOT__
__?NASM_SNAPSHOT?__
0 ;;; %defalias __NASM_VERSION_ID__
__?NASM_VERSION_ID?__
0 ;;; %defalias __NASM_VER__
__?NASM_VER?__
0 ;;; %defalias __OUTPUT_FORMAT__
__?OUTPUT_FORMAT?__
0 ;;; %defalias __DEBUG_FORMAT__
__?DEBUG_FORMAT?__
0 ;;; %defalias __DATE__ __?DATE?__
0 ;;; %defalias __DATE_NUM__
__?DATE_NUM?__
0 ;;; %defalias __TIME__ __?TIME?__
0 ;;; %defalias __TIME_NUM__
__?TIME_NUM?__
0 ;;; %defalias __UTC_DATE__
__?UTC_DATE?__
0 ;;; %defalias __UTC_DATE_NUM__
__?UTC_DATE_NUM?__
0 ;;; %defalias __UTC_TIME__
__?UTC_TIME?__
0 ;;; %defalias __UTC_TIME_NUM__
__?UTC_TIME_NUM?__
0 ;;; %defalias __POSIX_TIME__
__?POSIX_TIME?__
0 ;;; %defalias __FILE__ __?FILE?__
0 ;;; %defalias __LINE__ __?LINE?__
0 ;;; %defalias __BITS__ __?BITS?__
0 ;;; %defalias __PTR__ __?PTR?__
0 ;;; %defalias __PASS__ __?PASS?__
0 ;;; %idefine __?infinity?__ %?
0 ;;; %idefine __?nan?__ %?
0 ;;; %idefine __?qnan?__ %?
0 ;;; %idefine __?snan?__ %?
0 ;;; %idefine __?float8?__ %?
0 ;;; %idefine __?float16?__ %?
0 ;;; %idefine __?float32?__ %?
0 ;;; %idefine __?float64?__ %?
0 ;;; %idefine __?float80m?__ %?
0 ;;; %idefine __?float80e?__ %?
0 ;;; %idefine __?float128l?__ %?
0 ;;; %idefine __?float128h?__ %?
0 ;;; %idefine __?utf16?__ %?
0 ;;; %idefine __?utf16le?__ %?
0 ;;; %idefine __?utf16be?__ %?
0 ;;; %idefine __?utf32?__ %?
0 ;;; %idefine __?utf32le?__ %?
0 ;;; %idefine __?utf32be?__ %?
0 ;;; %idefine __?ilog2e?__ %?
0 ;;; %idefine __?ilog2w?__ %?
0 ;;; %idefine __?ilog2f?__ %?
0 ;;; %idefine __?ilog2c?__ %?
0 ;;; %idefalias __infinity__
__?infinity?__
0 ;;; %idefalias __nan__ __?nan?__
0 ;;; %idefalias __qnan__ __?qnan?__
0 ;;; %idefalias __snan__ __?snan?__
0 ;;; %idefalias __float8__ __?float8?__
0 ;;; %idefalias __float16__
__?float16?__
0 ;;; %idefalias __float32__
__?float32?__
0 ;;; %idefalias __float64__
__?float64?__
0 ;;; %idefalias __float80m__
__?float80m?__
0 ;;; %idefalias __float80e__
__?float80e?__
0 ;;; %idefalias __float128l__
__?float128l?__
0 ;;; %idefalias __float128h__
__?float128h?__
0 ;;; %idefalias __utf16__ __?utf16?__
0 ;;; %idefalias __utf16le__
__?utf16le?__
0 ;;; %idefalias __utf16be__
__?utf16be?__
0 ;;; %idefalias __utf32__ __?utf32?__
0 ;;; %idefalias __utf32le__
__?utf32le?__
0 ;;; %idefalias __utf32be__
__?utf32be?__
0 ;;; %idefalias __ilog2e__ __?ilog2e?__
0 ;;; %idefalias __ilog2w__ __?ilog2w?__
0 ;;; %idefalias __ilog2f__ __?ilog2f?__
0 ;;; %idefalias __ilog2c__ __?ilog2c?__
0 ;;; %define __?NASM_MAJOR?__ 2
0 ;;; %define __?NASM_MINOR?__ 14
0 ;;; %define __?NASM_SUBMINOR?__ 99
0 ;;; %define __?NASM_PATCHLEVEL?__ 90
0 ;;; %define __?NASM_VERSION_ID?__
0020E635Ah
0 ;;; %define __?NASM_VER?__ "2.15rc0"
0 ;;; %define __?SECT?__ [section .text]
0 ;;; %define __?DATE?__ "2019-10-15"
0 ;;; %define __?DATE_NUM?__ 20191015
0 ;;; %define __?TIME?__ "14:37:45"
0 ;;; %define __?TIME_NUM?__ 143745
0 ;;; %define __?UTC_DATE?__
"2019-10-15"
0 ;;; %define __?UTC_DATE_NUM?__
20191015
0 ;;; %define __?UTC_TIME?__ "12:37:45"
0 ;;; %define __?UTC_TIME_NUM?__ 123745
0 ;;; %define __?POSIX_TIME?__
1571143065
0 ;;; %define __?OUTPUT_FORMAT?__ bin
1 %idefine d dword
1 ;;; %idefine d dword
2
3 %define _1digits_nocheck(d) (((d)%
10)+'0')
3 ;;; %define _1digits_nocheck(d) (((d)%
10)+'0')
4 %define _1digits(d)
(!!(d/10)*(1<<32)+ _1digits_nocheck(d))
4 ;;; %define _1digits(d)
(!!(d/10)*(1<<32)+ _1digits_nocheck(d))
5
6 00000000 38 db _1digits(8)
$ oldnasm -v
NASM version 2.14.03rc2 compiled on Aug 31 2019
$ oldnasm test.asm
$ oldnasm test2.asm
$ /usr/bin/nasm -v
NASM version 2.12.01
$ /usr/bin/nasm test.asm
$ /usr/bin/nasm test2.asm
$
--
You are receiving this mail because:
You are watching all bug changes.
You are on the CC list for the bug.
More information about the Nasm-bugs
mailing list