New faults and syntax (#2034)

- Remove `[?]` syntax.
- Change `int!` to `int?` syntax.
- New `fault` declarations.
- Enum associated values can reference the calling enum.
This commit is contained in:
Christoffer Lerno
2025-03-10 00:11:35 +01:00
committed by GitHub
parent fefce25081
commit 25bccf4883
392 changed files with 3129 additions and 3658 deletions

View File

@@ -5,7 +5,7 @@ distinct Foo = float;
fn void main()
{
Foo a = 12.3;
Foo! b = 33.5;
Foo? b = 33.5;
(void)printf("%f %f %f", (float)a, a, b);
}

View File

@@ -1,11 +1,8 @@
int z;
fault MyError
{
FOO,
}
fault FOO;
fn void test(int a = z) {}
fn void test2(int b = MyError.FOO?) {}
fn void test2(int b = FOO?) {}

View File

@@ -1,3 +1,3 @@
module test;
fn void test4(void!); // #error: Parameters may not be optional.
fn void test4(void?); // #error: Parameters may not be optional.

View File

@@ -14,8 +14,8 @@ fn Callback**[][123]* tester()
GetCallback x = &tester;
def GetCallbackOpt = fn Callback2!();
def GetCallbackOpt = fn Callback2?();
fn Callback2! tester2() => null;
fn Callback2? tester2() => null;
GetCallbackOpt y = &tester2;

View File

@@ -8,8 +8,8 @@ def FuncSame = fn int(int z = 444);
fn int test(int a) { return a; }
fn int test2(int b = 3) { return b; }
fn int! test3(int b = 3) { return b; }
fn int! test4(int b = 3) { return b; }
fn int? test3(int b = 3) { return b; }
fn int? test4(int b = 3) { return b; }
fn void main()
{
@@ -37,8 +37,8 @@ fn void main()
@.str.2 = private unnamed_addr constant [3 x i8] c"%d\00", align 1
@.str.3 = private unnamed_addr constant [3 x i8] c"%s\00", align 1
@.str.4 = private unnamed_addr constant [12 x i8] c"fn int(int)\00", align 1
@"$ct.String" = linkonce global %.introspect { i8 18, i64 ptrtoint (ptr @"$ct.sa$char" to i64), ptr null, i64 16, i64 ptrtoint (ptr @"$ct.sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8
@"$ct.sa$char" = linkonce global %.introspect { i8 16, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8
@"$ct.String" = linkonce global %.introspect { i8 17, i64 ptrtoint (ptr @"$ct.sa$char" to i64), ptr null, i64 16, i64 ptrtoint (ptr @"$ct.sa$char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8
@"$ct.sa$char" = linkonce global %.introspect { i8 15, i64 0, ptr null, i64 16, i64 ptrtoint (ptr @"$ct.char" to i64), i64 0, [0 x i64] zeroinitializer }, align 8
@"$ct.char" = linkonce global %.introspect { i8 3, i64 0, ptr null, i64 1, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8
@.str.5 = private unnamed_addr constant [3 x i8] c"%s\00", align 1
@.str.6 = private unnamed_addr constant [12 x i8] c"fn int(int)\00", align 1
@@ -48,7 +48,7 @@ fn void main()
@.str.10 = private unnamed_addr constant [12 x i8] c"fn int(int)\00", align 1
@.str.11 = private unnamed_addr constant [3 x i8] c"%s\00", align 1
@.str.12 = private unnamed_addr constant [13 x i8] c"fn int!(int)\00", align 1
@"$ct.fn$int$int$" = linkonce global %.introspect { i8 13, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8
@"$ct.fn$int$int$" = linkonce global %.introspect { i8 12, i64 0, ptr null, i64 8, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8
define void @test.main() #0 {
entry:

View File

@@ -12,7 +12,7 @@ struct Foo
List{FnB} bFuncs;
}
fn void! Foo.deinit(&self)
fn void? Foo.deinit(&self)
{
self.aFuncs.free();
self.bFuncs.free();

View File

@@ -1,9 +1,9 @@
import std::io::path;
fn void! process_dir(String dir_name)
fn void? process_dir(String dir_name)
{
path::Path p = path::temp(dir_name)!;
path::PathWalker fnwalk = fn bool!(Path p, bool is_dir, void*) { // #error: issing return statement at the end
path::PathWalker fnwalk = fn bool?(Path p, bool is_dir, void*) { // #error: issing return statement at the end
io::printfn("path is %s", p);
};
}

View File

@@ -1,4 +1,4 @@
int[?] foo = {1,2,3};
int[*] foo = {1,2,3};
fn int* bar(int index)
{
int* array = &foo;

View File

@@ -5,7 +5,7 @@ fn void main()
{
}
def FooFunc = fn void! (Bar); // #error: Recursive definition
def FooFunc = fn void? (Bar); // #error: Recursive definition
def Foo = HashMap{String, FooFunc};
struct Bar

View File

@@ -201,11 +201,7 @@ fn Type getMult(Type a)
}
Type argh = 234;
fault MyErr
{
X,
Y
}
fault X, Y;
enum Hello : int
{
@@ -243,11 +239,11 @@ fn Type getValue(Blob blob)
%List = type { i64, i64, %any, ptr }
%Foo = type { i32, i32 }
@"$ct.test.Bobo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Blob" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Foor" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Foo2" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Bobo" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Blob" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Foor" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Foo2" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, align 8
@"$ct.test.Foo" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, align 8
@"$ct.int" = linkonce global %.introspect { i8 2, i64 0, ptr null, i64 4, i64 0, i64 0, [0 x i64] zeroinitializer }, align 8
@"$ct.test.MyEnum" = linkonce global { i8, i64, ptr, i64, i64, i64, [3 x %"char[]"] } { i8 8, i64 0, ptr null, i64 4, i64 ptrtoint (ptr @"$ct.int" to i64), i64 3, [3 x %"char[]"] [%"char[]" { ptr @.enum.HELO, i64 4 }, %"char[]" { ptr @.enum.WORLD, i64 5 }, %"char[]" { ptr @.enum.BYE, i64 3 }] }, align 8
@test_static.x = internal unnamed_addr global i32 1, align 4

View File

@@ -203,11 +203,7 @@ fn Type getMult(Type a)
}
Type argh = 234;
fault MyErr
{
X,
Y
}
fault X, Y;
enum Hello : int
{
@@ -259,11 +255,11 @@ $"$ct.int" = comdat any
$"$ct.test.MyEnum" = comdat any
@"$ct.test.Bobo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Blob" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Foor" = linkonce global %.introspect { i8 11, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Foo2" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Foo" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Bobo" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 20, i64 0, i64 6, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Blob" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Foor" = linkonce global %.introspect { i8 10, i64 0, ptr null, i64 16, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Foo2" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 4, i64 0, i64 1, [0 x i64] zeroinitializer }, comdat, align 8
@"$ct.test.Foo" = linkonce global %.introspect { i8 9, i64 0, ptr null, i64 8, i64 0, i64 2, [0 x i64] zeroinitializer }, comdat, align 8
@.enum.HELO = internal constant [5 x i8] c"HELO\00", align 1
@.enum.WORLD = internal constant [6 x i8] c"WORLD\00", align 1
@.enum.BYE = internal constant [4 x i8] c"BYE\00", align 1