[Bug c++/84814] New: Type of arithmetic expression
smal.root at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Mar 10 23:39:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84814
Bug ID: 84814
Summary: Type of arithmetic expression
Product: gcc
Version: 7.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: smal.root at gmail dot com
Target Milestone: ---
Created attachment 43620
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43620&action=edit
Project archive
File: main.cpp, line: 20.
When used variant
> if((curtime - LastTime) >= Request)
then we get following assembly code (file: type_test_wo_conv.lss):
> 8000260: 8806 ldrh r6, [r0, #0]
> 8000262: 7825 ldrb r5, [r4, #0]
> 8000264: b292 uxth r2, r2
> 8000266: 1b92 subs r2, r2, r6
> 8000268: 42aa cmp r2, r5
as you can see "subs" result is not converted to uint16_t, but must. Because
both arguments of subtraction has same type:
"— Otherwise, the integral promotions (4.5) shall be performed on both
operands. Then the following rules shall be applied to the promoted operands:
— If both operands have the same type, no further conversion is needed."
As result - arguments of "cmp" is invalid uint32_t values.
If we use additional "manual" type conversion for expression
> if((uint16_t)(curtime - LastTime) >= Request)
then we get right result:
> 8000260: 8806 ldrh r6, [r0, #0]
> 8000262: 7825 ldrb r5, [r4, #0]
> 8000264: 1b92 subs r2, r2, r6
> 8000266: b292 uxth r2, r2
> 8000268: 42aa cmp r2, r5
after "subs" result is converted to uint16_t.
More information about the Gcc-bugs
mailing list