diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index c5355dcc6..832f00994 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -184,7 +184,7 @@ jobs:
fail-fast: false
matrix:
build_type: [Release, Debug]
- llvm_version: [16]
+ llvm_version: [16, 17]
steps:
- uses: actions/checkout@v3
diff --git a/lib/std/collections/list.c3 b/lib/std/collections/list.c3
index 6eac30d9d..06fdda514 100644
--- a/lib/std/collections/list.c3
+++ b/lib/std/collections/list.c3
@@ -38,6 +38,26 @@ fn void List.tinit(List* list, usz initial_capacity = 16)
list.init(initial_capacity, mem::temp()) @inline;
}
+fn String List.to_string(List* list, Allocator* using = mem::heap()) @dynamic
+{
+ if (!list.size) return "[]".copy(using);
+ if (list.size == 1) return string::printf("[%s]", list.entries[0], .using = using);
+
+ @stack_mem(512 + 128; Allocator* mem)
+ {
+ DString str;
+ str.init(512, mem);
+ str.append("[");
+ foreach (i, element : list.entries[:list.size])
+ {
+ if (i != 0) str.append(", ");
+ str.printf("%s", element);
+ }
+ str.printf("]");
+ return str.copy_str(using);
+ };
+}
+
fn void List.push(List* list, Type element) @inline
{
list.append(element);
diff --git a/lib/std/io/io_printf.c3 b/lib/std/io/io_printf.c3
index fcaa7a256..c2c1a3356 100644
--- a/lib/std/io/io_printf.c3
+++ b/lib/std/io/io_printf.c3
@@ -135,9 +135,9 @@ macro bool! Formatter.print_with_function(Formatter* this, any arg)
this.width = old_width;
this.prec = old_prec;
}
- @pool()
+ @stack_mem(512; Allocator* mem)
{
- this.out_substr(arg.to_string(mem::temp()))!;
+ this.out_substr(arg.to_string(mem))!;
return true;
};
}
diff --git a/lib/std/net/inetaddr.c3 b/lib/std/net/inetaddr.c3
index ded894cd5..2a20d597d 100644
--- a/lib/std/net/inetaddr.c3
+++ b/lib/std/net/inetaddr.c3
@@ -50,18 +50,18 @@ fn void! InetAddress.to_format(InetAddress* addr, Formatter* formatter) @dynamic
formatter.printf("%d.%d.%d.%d", addr.ipv4.a, addr.ipv4.b, addr.ipv4.c, addr.ipv4.d)!;
}
-fn String! InetAddress.to_string(InetAddress* addr, Allocator* using = mem::heap()) @dynamic
+fn String InetAddress.to_string(InetAddress* addr, Allocator* using = mem::heap()) @dynamic
{
if (addr.is_ipv6)
{
char[8 * 5 + 1] buffer;
String res = (String)io::bprintf(&buffer, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x",
addr.ipv6.a, addr.ipv6.b, addr.ipv6.c, addr.ipv6.d,
- addr.ipv6.e, addr.ipv6.f, addr.ipv6.g, addr.ipv6.h)!;
+ addr.ipv6.e, addr.ipv6.f, addr.ipv6.g, addr.ipv6.h)!!;
return res.copy(using);
}
char[3 * 4 + 3 + 1] buffer;
- String res = (String)io::bprintf(&buffer, "%d.%d.%d.%d", addr.ipv4.a, addr.ipv4.b, addr.ipv4.c, addr.ipv4.d)!;
+ String res = (String)io::bprintf(&buffer, "%d.%d.%d.%d", addr.ipv4.a, addr.ipv4.b, addr.ipv4.c, addr.ipv4.d)!!;
return res.copy(using);
}
diff --git a/src/build/build_options.c b/src/build/build_options.c
index 2b12fdba7..cdd8a4794 100644
--- a/src/build/build_options.c
+++ b/src/build/build_options.c
@@ -134,7 +134,7 @@ static void usage(void)
OUTPUT(" --x86vec=