TypeInfo gained a span. Hex lexing fixed. Basic block returns fixed. Removal of Ast.exit. Enum parameter list parses. Enum analysis improved. Exit deduction improved. Switch over a bool allowed. Switch analysis improved. Added -% operator. Updated implicit casts. Use of bigint. Signed-unsigned comparisons.

This commit is contained in:
Christoffer Lerno
2020-03-20 17:55:24 +01:00
parent f4b4bab947
commit b1aa64cdcc
25 changed files with 1679 additions and 672 deletions

View File

@@ -0,0 +1,178 @@
module comparisons;
func void test_signed()
{
int a = 0;
int b = 1;
bool ab_gt = a > b;
bool ab_ge = a >= b;
bool ab_le = a <= b;
bool ab_lt = a < b;
bool ab_ne = a != b;
bool ab_eq = a == b;
}
func void test_unsigned()
{
uint a = 0;
uint b = 1;
bool ab_gt = a > b;
bool ab_ge = a >= b;
bool ab_le = a <= b;
bool ab_lt = a < b;
bool ab_ne = a != b;
bool ab_eq = a == b;
}
extern func void printf(char *s);
func void test_signedunsigned()
{
char a = 0 - 1;
byte b = cast(a, byte);
printf("Signed-unsigned -1 0xFF \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 1;
b = 1;
printf("Signed-unsigned 1 1 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 1;
b = 4;
printf("Signed-unsigned 1 4 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 4;
b = 1;
printf("Signed-unsigned 4 1 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 4;
b = 129;
printf("Signed-unsigned 4 129 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 0 - 4;
b = 129;
printf("Signed-unsigned -4 129 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
}
func void test_unsignedsigned()
{
int b = -1;
uint a = cast(b, uint);
printf("Unsigned-signed 0xFFFFFFFF -1 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 1;
b = 1;
printf("Unsigned-signed 1 1 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 4;
b = 1;
printf("Unsigned-signed 4 1 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 1;
b = 4;
printf("Unsigned-signed 1 4 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
a = 0x8000_0001;
b = 4;
printf("Unsigned-signed 0x8000_0001 4 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
b = 0 - 4;
a = 0x8000_0001;
printf("Unsigned-signed 0x8000_0001 -4 \n");
if (a > b) printf("a > b\n");
if (a >= b) printf("a >= b\n");
if (a < b) printf("a < b\n");
if (a <= b) printf("a <= b\n");
if (a != b) printf("a != b\n");
if (a == b) printf("a == b\n");
}
func void main()
{
test_signedunsigned();
test_unsignedsigned();
printf("-- Done ---\n");
}

View File

@@ -1,6 +1,6 @@
module helloworld;
func void printf(char *str);
extern func void printf(char *str);
func void main()
{

View File

@@ -38,6 +38,87 @@ struct Teob
int oekfeo;
}
enum EnumTest : long
{
VALUE1 = 4,
VALUE2
}
enum EnumTestDefault
{
VALUE,
VALUE2
}
enum EnumTestNoOverflowAfterLong : long
{
VALUE = 0x7FFF_FFFF_FFFF_FFFE,
VALUE_NO_EXCEED
}
enum EnumTestSmall : ushort
{
VALUE = 0xFF,
VALUE2 = 0xFFFF
}
enum EnumWithData : ushort (int a, char[] x, long b = 4)
{
// Currently the args are ignored TODO!
TEST1(42, "hello", 328) = 3,
TEST2(12, "world")
}
/* ERRORS
enum EnumWithErrorData : int (int
{
TEST
}
enum EnumWithErrorWithMissingName : int (int)
{
TEST
}
enum EnumTestNoOverflowAfterULong : ulong
{
VALUE = 0xFFFF_FFFF_FFFF_FFFE,
VALUE_NO_EXCEED
}
enum EnumTestOverflow
{
VALUE = 0x80000000,
}
enum EnumTestOverflowAfter
{
VALUE = 0x80000000 - 1,
VALUE_EXCEED
}
enum EnumTestOverflowAfterLong : long
{
VALUE = 0x7FFF_FFFF_FFFF_FFFF,
VALUE_EXCEED
}
enum EnumTestOverflowAfterULong : ulong
{
VALUE = 0xFFFF_FFFF_FFFF_FFFF,
VALUE_EXCEED
}
enum EnumTestErrorType : float
{
VALUE_BOOM
}
*/
error Error
{
BLURB,
@@ -60,6 +141,71 @@ func int borok() throws
{
return 1;
}
func void testNoReturn()
{
int i = 0;
}
func int testReturn()
{
int i = 0;
return i;
}
func int testReturnWithOtherAtEnd()
{
int i = 0;
return i;
if (i == 10) i++;
i = i + 2;
}
func int testReturnWithError() throws Error
{
int i = 0;
throw Error.NO_SUCH_FILE;
i = i + 1;
}
func int testReturnWithConditional()
{
int i = 0;
if (i > 0)
{
return 1;
}
else
{
return 2;
}
}
func int testReturnWithCondThrow() throws Error
{
int i = 0;
if (i > 0)
{
throw Error.NO_SUCH_FILE;
}
else
{
throw Error.NO_SUCH_FILE;
}
}
func int testReturnSwitch()
{
int i = 0;
switch (i)
{
case 1:
return 2;
case 2:
return 3;
default:
return 4;
}
}
func int barok() throws Error, OtherError
{
@@ -281,6 +427,7 @@ func int main(int x)
{
int efd = 9;
int okfe = 1;
return 1;
switch (int bobe = okfe > 0 ? 1 : 0)
{
case 0:
@@ -304,7 +451,6 @@ func int main(int x)
printf("default\n");
break;
}
return 1;
int aa = x++;
int bb = x--;
int cc = ++x;
@@ -377,6 +523,7 @@ int i = 0;
EX:
printf("EX\n");
goto YEF;
return 1;
}
func void test2(int* x, int y, int z)