Skip to content

Commit ea70722

Browse files
committed
fbc: sf.net # 925: CSIGN/CUSGN preserve size when converting pointers
- previously on 64-bit CSIGN was converted to LONG and CSGN was converted to ULONG, when size should be preserved - this also was seen in the STEP value of FOR...NEXT statements where STEP value for pointers was also converted to LONG - this change preserves the size of the pointer when converted to [u]integer (cherry picked from commit 9320ee7) # Conflicts: # changelog.txt
1 parent c692b9b commit ea70722

File tree

3 files changed

+122
-2
lines changed

3 files changed

+122
-2
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Version 1.07.2
1414
[fixed]
1515
- sf.net #921: gfxlib: horizontal line drawing on 8-bit image was using wrong bpp
1616
- github #258: on windows directx and gdi drivers, only show window after intialization is complete (adeyblue)
17+
- sf.net #925: CSIGN/CUSGN preserve size when converting pointers on 64-bit and implict conversion of STEP value in FOR...NEXT statement
1718

1819

1920
Version 1.07.1

src/compiler/symb-data.bas

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,16 @@ function typeToSigned _
224224
case FB_DATATYPE_WCHAR
225225
return typeToSigned( env.target.wchar )
226226

227-
case FB_DATATYPE_ULONG, FB_DATATYPE_POINTER
227+
case FB_DATATYPE_ULONG
228228
nd = FB_DATATYPE_LONG
229229

230+
case FB_DATATYPE_POINTER
231+
if( env.pointersize = 8 ) then
232+
nd = FB_DATATYPE_LONGINT
233+
else
234+
nd = FB_DATATYPE_LONG
235+
end if
236+
230237
case FB_DATATYPE_ULONGINT
231238
nd = FB_DATATYPE_LONGINT
232239

@@ -260,9 +267,16 @@ function typeToUnsigned _
260267
case FB_DATATYPE_INTEGER, FB_DATATYPE_ENUM
261268
nd = FB_DATATYPE_UINT
262269

263-
case FB_DATATYPE_LONG, FB_DATATYPE_POINTER
270+
case FB_DATATYPE_LONG
264271
nd = FB_DATATYPE_ULONG
265272

273+
case FB_DATATYPE_POINTER
274+
if( env.pointersize = 8 ) then
275+
nd = FB_DATATYPE_ULONGINT
276+
else
277+
nd = FB_DATATYPE_ULONG
278+
end if
279+
266280
case FB_DATATYPE_LONGINT
267281
nd = FB_DATATYPE_ULONGINT
268282

tests/numbers/casting.bas

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,109 @@ SUITE( fbc_tests.numbers.casting )
5757
CU_ASSERT( culngint( d ) = 123 )
5858
END_TEST
5959

60+
#macro check_int( typ, s_value, u_value )
61+
scope
62+
dim s as typ = s_value
63+
dim u as unsigned typ = u_value
64+
65+
'' Sizes match?
66+
CU_ASSERT( sizeof( s ) = sizeof( u ) )
67+
CU_ASSERT( sizeof( csign( s ) ) = sizeof( s ) )
68+
CU_ASSERT( sizeof( cunsg( s ) ) = sizeof( s ) )
69+
CU_ASSERT( sizeof( csign( u ) ) = sizeof( u ) )
70+
CU_ASSERT( sizeof( cunsg( u ) ) = sizeof( u ) )
71+
72+
'' values match?
73+
CU_ASSERT( csign( s ) = s )
74+
CU_ASSERT( csign( u ) = s )
75+
CU_ASSERT( cunsg( s ) = u )
76+
CU_ASSERT( cunsg( u ) = u )
77+
78+
'' types match?
79+
#assert typeof( csign( s ) ) = typeof( typ )
80+
#assert typeof( cunsg( s ) ) = typeof( unsigned typ )
81+
#assert typeof( csign( u ) ) = typeof( typ )
82+
#assert typeof( cunsg( u ) ) = typeof( unsigned typ )
83+
84+
'' same value when convert back to original type?
85+
dim s2 as typ = csign( u )
86+
dim u2 as unsigned typ = cunsg( s )
87+
CU_ASSERT( s2 = s )
88+
CU_ASSERT( u2 = u )
89+
90+
end scope
91+
#endmacro
92+
93+
TEST( sign_ints )
94+
check_int( byte, 0, 0 )
95+
check_int( byte, 127, 127 )
96+
check_int( byte, -128, 128 )
97+
check_int( byte, -1, 255 )
98+
99+
check_int( short, 0, 0 )
100+
check_int( short, 32767, 32767 )
101+
check_int( short, -32768, 32768 )
102+
check_int( short, -1, 65535 )
103+
104+
check_int( long, 0ll, 0ull )
105+
check_int( long, 2147483647ll, 2147483647ull )
106+
check_int( long, -2147483648ll, 2147483648ull )
107+
check_int( long, -1ll, 4294967295ull )
108+
109+
#ifndef __FB_64BIT__
110+
check_int( integer, 0ll, 0ull )
111+
check_int( integer, 2147483647ll, 2147483647ull )
112+
check_int( integer, -2147483648ll, 2147483648ull )
113+
check_int( integer, -1ll, 4294967295ull )
114+
#else
115+
check_int( integer, 0ll, 0ull )
116+
check_int( integer, 9223372036854775807ll, 9223372036854775807ull )
117+
check_int( integer, -9223372036854775808ll, 9223372036854775808ull )
118+
check_int( integer, -1ll, 18446744073709551615ull )
119+
#endif
120+
121+
check_int( longint, 0ll, 0ull )
122+
check_int( longint, 9223372036854775807ll, 9223372036854775807ull )
123+
check_int( longint, -9223372036854775808ll, 9223372036854775808ull )
124+
check_int( longint, -1ll, 18446744073709551615ull )
125+
126+
END_TEST
127+
128+
TEST( sign_ptrs )
129+
130+
union T
131+
p as any ptr
132+
i as integer
133+
end union
134+
135+
dim x as T
136+
137+
#ifndef __FB_64BIT__
138+
x.i = &h800000001
139+
#else
140+
x.i = &h80000000000000001
141+
#endif
142+
143+
CU_ASSERT( sizeof( x.p ) = sizeof( x.i ) )
144+
CU_ASSERT( sizeof( csign( x.p ) ) = sizeof( x.p ) )
145+
CU_ASSERT( sizeof( cunsg( x.p ) ) = sizeof( x.p ) )
146+
147+
scope
148+
var ni = csign( x.i )
149+
var np = csign( x.p )
150+
CU_ASSERT( np = ni )
151+
var p = cast( any ptr, np )
152+
CU_ASSERT( p = x.p )
153+
end scope
154+
155+
scope
156+
var ni = cunsg( x.i )
157+
var np = cunsg( x.p )
158+
CU_ASSERT( np = ni )
159+
var p = cast( any ptr, np )
160+
CU_ASSERT( p = x.p )
161+
end scope
162+
163+
END_TEST
164+
60165
END_SUITE

0 commit comments

Comments
 (0)