blob: ac2587cf7e5d0795fd7ef0356a74eb270cc84e27 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
uses c89:stdio as io;
int fail(char^ s) {
io:fprintf(io:stderr, "Failure: %s\n", s);
return 0;
}
// TODO math functions in LRL
import linkname "fabs" float fabs_f(float x);
import linkname "fabsf" cfloat fabs_cf(cfloat x);
import linkname "fabs" cfloat fabs_cd(cdouble x);
int f() {
// use variables with constants to avoid constexpr from optimizing out
// the modulo expressions below.
var eint8 c17 = 17;
var eint8 c123 = 123;
var eint16 c31999 = 31999;
var uint16 c65123 = 65123;
// unsigned integer
byte b = 253 mod c17;
uint ui = 65321 mod c65123;
// TODO add larger int types
//uint64 ui64 = 18446744073709551615 mod 18446744073709551615;
ulong ul = 456 mod c123;
if b != 15 return fail("253 mod 17 != 15");
if ui != 198 return fail("65321 mod 65123 != 198");
if ul != 87 return fail("456 mod 123 != 87");
// signed integer
int8 s8a = -123 mod c17;
int8 s8b = 123 mod -c17;
int8 s8c = -123 mod -c17;
int sia = -32000 mod c31999;
int sib = 32000 mod -c31999;
int sic = -32000 mod -c31999;
// TODO add larger int types
//int64 si64a = 9223372036854775807 mod 9223372036854775807;
// TODO fix type of smallest signed integer values
//int64 si64b = -9223372036854775808 mod 9223372036854775807;
//int64 si64c = 9223372036854775807 mod -9223372036854775808;
//int64 si64d = -9223372036854775808 mod -9223372036854775808;
long sl = -456 mod -c123;
if s8a != 13 return fail("-123 mod 17 != 13");
if s8b != -13 return fail("123 mod -17 != -13");
if s8c != -4 return fail("-123 mod -17 != -4");
if sia != 31998 return fail("-32000 mod 31999 != 31998");
if sib != -31998 return fail("32000 mod -31999 != -31998");
if sic != -1 return fail("-32000 mod -31999 != -1");
if sl != -87 return fail("-456 mod -123 != -87");
// floating point
float fa = 2.34 mod 1.23;
float fb = -2.34 mod 1.23;
float fc = 2.34 mod -1.23;
float fd = -2.34 mod -1.23;
cfloat cfa = 2.34 mod 1.23;
cfloat cfb = -2.34 mod 1.23;
cfloat cfc = 2.34 mod -1.23;
cfloat cfd = -2.34 mod -1.23;
cdouble cda = 2.34 mod 1.23;
cdouble cdb = -2.34 mod 1.23;
cdouble cdc = 2.34 mod -1.23;
cdouble cdd = -2.34 mod -1.23;
if fabs_f( fa - 1.11) > 0.1 as float return fail("2.34 mod 1.23 != 1.11");
if fabs_f( fb - 0.12) > 0.1 as float return fail("-2.34 mod 1.23 != 0.12");
if fabs_f( fc - -0.12) > 0.1 as float return fail("2.34 mod -1.23 != -0.12");
if fabs_f( fd - -1.11) > 0.1 as float return fail("-2.34 mod -1.23 != -1.10");
if fabs_cf(cfa - 1.11) > 0.1 as cfloat return fail("2.34 mod 1.23 != 1.11");
if fabs_cf(cfb - 0.12) > 0.1 as cfloat return fail("-2.34 mod 1.23 != 0.12");
if fabs_cf(cfc - -0.12) > 0.1 as cfloat return fail("2.34 mod -1.23 != -0.12");
if fabs_cf(cfd - -1.11) > 0.1 as cfloat return fail("-2.34 mod -1.23 != -1.10");
if fabs_cd(cda - 1.11) > 0.1 as cdouble return fail("2.34 mod 1.23 != 1.11");
if fabs_cd(cdb - 0.12) > 0.1 as cdouble return fail("-2.34 mod 1.23 != 0.12");
if fabs_cd(cdc - -0.12) > 0.1 as cdouble return fail("2.34 mod -1.23 != -0.12");
if fabs_cd(cdd - -1.11) > 0.1 as cdouble return fail("-2.34 mod -1.23 != -1.10");
return 1;
}
// TODO run the test code above somehow
/*linkname "main" int main() {
f();
}*/
|