February 23 [Issue 24406] New: wrong signess of comparison with -O and byte-casted char | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=24406 Issue ID: 24406 Summary: wrong signess of comparison with -O and byte-casted char Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody@puremagic.com Reporter: a.horodniceanu@proton.me Reduced from https://github.com/Pure-D/serve-d/blob/master/lsp/source/served/lsp/textdocumentmanager.d#L1309: ``` void main () { char c = (() => cast(char)47)(); // c == '/' assert(cast(byte)c >= -0x40); } ``` ``` $ dmd -O -run main.d core.exception.AssertError@main.d(3): Assertion failure ---------------- ??:? _d_assertp [0x55635be3f818] ??:? _Dmain [0x55635be3f76b] ``` $ dmd -run main.d <no error> ``` Tested against master. The code generated is: ``` 0x0000555555597748 <+0>: push %rbp 0x0000555555597749 <+1>: mov %rsp,%rbp 0x000055555559774c <+4>: rex.W call *0x4b7fd(%rip) # 0x5555555e2f50 0x0000555555597753 <+11>: cmp $0xc0,%al 0x0000555555597755 <+13>: jb 0x55555559775b <_Dmain+19> 0x0000555555597757 <+15>: xor %eax,%eax 0x0000555555597759 <+17>: pop %rbp 0x000055555559775a <+18>: ret 0x000055555559775b <+19>: mov $0x3,%esi 0x0000555555597760 <+24>: lea 0x398b9(%rip),%rdi # 0x5555555d1020 <_TMP0> 0x0000555555597767 <+31>: call 0x5555555977d0 <_d_assertp> 0x000055555559776c <+36>: pop %rbp 0x000055555559776d <+37>: ret ``` The problem is with `jb 0x55555559775b <_Dmain+19>` since the comparison should be signed. -- |
Copyright © 1999-2021 by the D Language Foundation