diff --git a/examples/basic/0036-basic-ufcs-aliases.sx b/examples/basic/0036-basic-ufcs-aliases.sx index 3b3bf79f..4da31770 100644 --- a/examples/basic/0036-basic-ufcs-aliases.sx +++ b/examples/basic/0036-basic-ufcs-aliases.sx @@ -35,7 +35,7 @@ main :: () { print("{}\n", a); // 2 print("{}\n", b); // 1 - wrap :: (x: i64) -> (i64) { (x,) } + wrap :: (x: i64) -> (i64,) { (x,) } // 1-tuple needs trailing comma; (i64) groups t := wrap(99); print("{}\n", t.0); // 99 } diff --git a/examples/diagnostics/1195-diagnostics-err-parenthesized-optional-tuple.sx b/examples/diagnostics/1195-diagnostics-err-parenthesized-optional-tuple.sx deleted file mode 100644 index 863f2206..00000000 --- a/examples/diagnostics/1195-diagnostics-err-parenthesized-optional-tuple.sx +++ /dev/null @@ -1,18 +0,0 @@ -// `?(?i64)` is `optional` wrapping the SINGLE-FIELD TUPLE `(?i64)` — in type -// position `(T)` is a 1-tuple, not a grouping (specs.md §"Tuple Types"). So -// assigning a bare `?i64` value to a `?(?i64)` slot is a type mismatch: the -// optional's payload is the tuple `(?i64)`, not `?i64`. -// -// Regression (issue 0165): this used to silently lower to a malformed -// `insertvalue { {{i64,i1}}, i1 }` that aborted the LLVM verifier. It now -// produces a clean diagnostic naming the payload type and pointing at the -// parens-are-a-tuple gotcha. (To write a genuine nested optional, alias the -// inner one: `Opt :: ?i64; x : ?Opt = ...` — see -// examples/optionals/0911-nested-optional-via-alias.sx.) -#import "modules/std.sx"; - -main :: () { - inner : ?i64 = 5; - outer : ?(?i64) = inner; - print("unreachable\n"); -} diff --git a/examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.exit b/examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.exit deleted file mode 100644 index d00491fd..00000000 --- a/examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.exit +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.stderr b/examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.stderr deleted file mode 100644 index a895f180..00000000 --- a/examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.stderr +++ /dev/null @@ -1,5 +0,0 @@ -error: cannot assign a value of type '?i64' to optional '?(?i64)': its payload type is '(?i64)' (note: in type position '(T)' is a single-field tuple, not a grouping — write the inner optional without parentheses) - --> examples/diagnostics/1195-diagnostics-err-parenthesized-optional-tuple.sx:16:3 - | -16 | outer : ?(?i64) = inner; - | ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/examples/protocols/expected/0414-protocols-generic-struct-protocol-erase.ir b/examples/protocols/expected/0414-protocols-generic-struct-protocol-erase.ir index e720c698..929ffa83 100644 --- a/examples/protocols/expected/0414-protocols-generic-struct-protocol-erase.ir +++ b/examples/protocols/expected/0414-protocols-generic-struct-protocol-erase.ir @@ -297,12 +297,12 @@ @tn.str.396 = private constant [7 x i8] c"[1]Any\00" @tn.str.397 = private constant [8 x i8] c"*[1]Any\00" @tn.str.398 = private constant [7 x i8] c"*[]Any\00" -@tn.str.399 = private constant [10 x i8] c"(VL__i64)\00" +@tn.str.399 = private constant [11 x i8] c"(VL__i64,)\00" @tn.str.400 = private constant [19 x i8] c"Combined__i64__i64\00" @tn.str.401 = private constant [20 x i8] c"*Combined__i64__i64\00" @tn.str.402 = private constant [10 x i8] c"**IntCell\00" @tn.str.403 = private constant [19 x i8] c"*__VL__i64__Vtable\00" -@tn.str.404 = private constant [11 x i8] c"*(VL__i64)\00" +@tn.str.404 = private constant [12 x i8] c"*(VL__i64,)\00" @tn.str.405 = private constant [21 x i8] c"**Combined__i64__i64\00" @tn.str.406 = private constant [9 x i8] c"*VL__i64\00" @tn.str.407 = private constant [8 x i8] c"*string\00" @@ -417,7 +417,7 @@ @tn.str.516 = private constant [8 x i8] c"**[]Any\00" @tn.str.517 = private constant [11 x i8] c"***IntCell\00" @tn.str.518 = private constant [20 x i8] c"**__VL__i64__Vtable\00" -@tn.str.519 = private constant [12 x i8] c"**(VL__i64)\00" +@tn.str.519 = private constant [13 x i8] c"**(VL__i64,)\00" @tn.str.520 = private constant [22 x i8] c"***Combined__i64__i64\00" @tn.str.521 = private constant [10 x i8] c"**VL__i64\00" @tn.str.522 = private constant [9 x i8] c"**string\00" @@ -442,7 +442,7 @@ @tn.str.541 = private constant [9 x i8] c"*?string\00" @tn.str.542 = private constant [16 x i8] c"*?ProcessResult\00" @tn.str.543 = private constant [9 x i8] c"*?[64]u8\00" -@__sx_type_names = private constant [404 x { ptr, i64 }] [{ ptr, i64 } { ptr @tn.str, i64 12 }, { ptr, i64 } { ptr @tn.str.141, i64 4 }, { ptr, i64 } { ptr @tn.str.142, i64 2 }, { ptr, i64 } { ptr @tn.str.143, i64 3 }, { ptr, i64 } { ptr @tn.str.144, i64 3 }, { ptr, i64 } { ptr @tn.str.145, i64 3 }, { ptr, i64 } { ptr @tn.str.146, i64 2 }, { ptr, i64 } { ptr @tn.str.147, i64 3 }, { ptr, i64 } { ptr @tn.str.148, i64 3 }, { ptr, i64 } { ptr @tn.str.149, i64 3 }, { ptr, i64 } { ptr @tn.str.150, i64 3 }, { ptr, i64 } { ptr @tn.str.151, i64 3 }, { ptr, i64 } { ptr @tn.str.152, i64 6 }, { ptr, i64 } { ptr @tn.str.153, i64 3 }, { ptr, i64 } { ptr @tn.str.154, i64 8 }, { ptr, i64 } { ptr @tn.str.155, i64 5 }, { ptr, i64 } { ptr @tn.str.156, i64 5 }, { ptr, i64 } { ptr @tn.str.157, i64 4 }, { ptr, i64 } { ptr @tn.str.158, i64 7 }, { ptr, i64 } { ptr @tn.str.159, i64 4 }, { ptr, i64 } { ptr @tn.str.160, i64 1 }, { ptr, i64 } { ptr @tn.str.161, i64 1 }, { ptr, i64 } { ptr @tn.str.162, i64 1 }, { ptr, i64 } { ptr @tn.str.163, i64 1 }, { ptr, i64 } { ptr @tn.str.164, i64 1 }, { ptr, i64 } { ptr @tn.str.165, i64 1 }, { ptr, i64 } { ptr @tn.str.166, i64 1 }, { ptr, i64 } { ptr @tn.str.167, i64 1 }, { ptr, i64 } { ptr @tn.str.168, i64 1 }, { ptr, i64 } { ptr @tn.str.169, i64 1 }, { ptr, i64 } { ptr @tn.str.170, i64 1 }, { ptr, i64 } { ptr @tn.str.171, i64 1 }, { ptr, i64 } { ptr @tn.str.172, i64 1 }, { ptr, i64 } { ptr @tn.str.173, i64 1 }, { ptr, i64 } { ptr @tn.str.174, i64 1 }, { ptr, i64 } { ptr @tn.str.175, i64 1 }, { ptr, i64 } { ptr @tn.str.176, i64 1 }, { ptr, i64 } { ptr @tn.str.177, i64 1 }, { ptr, i64 } { ptr @tn.str.178, i64 1 }, { ptr, i64 } { ptr @tn.str.179, i64 1 }, { ptr, i64 } { ptr @tn.str.180, i64 1 }, { ptr, i64 } { ptr @tn.str.181, i64 1 }, { ptr, i64 } { ptr @tn.str.182, i64 1 }, { ptr, i64 } { ptr @tn.str.183, i64 1 }, { ptr, i64 } { ptr @tn.str.184, i64 1 }, { ptr, i64 } { ptr @tn.str.185, i64 1 }, { ptr, i64 } { ptr @tn.str.186, i64 1 }, { ptr, i64 } { ptr @tn.str.187, i64 1 }, { ptr, i64 } { ptr @tn.str.188, i64 1 }, { ptr, i64 } { ptr @tn.str.189, i64 1 }, { ptr, i64 } { ptr @tn.str.190, i64 1 }, { ptr, i64 } { ptr @tn.str.191, i64 1 }, { ptr, i64 } { ptr @tn.str.192, i64 1 }, { ptr, i64 } { ptr @tn.str.193, i64 1 }, { ptr, i64 } { ptr @tn.str.194, i64 1 }, { ptr, i64 } { ptr @tn.str.195, i64 1 }, { ptr, i64 } { ptr @tn.str.196, i64 1 }, { ptr, i64 } { ptr @tn.str.197, i64 1 }, { ptr, i64 } { ptr @tn.str.198, i64 1 }, { ptr, i64 } { ptr @tn.str.199, i64 1 }, { ptr, i64 } { ptr @tn.str.200, i64 1 }, { ptr, i64 } { ptr @tn.str.201, i64 1 }, { ptr, i64 } { ptr @tn.str.202, i64 1 }, { ptr, i64 } { ptr @tn.str.203, i64 1 }, { ptr, i64 } { ptr @tn.str.204, i64 1 }, { ptr, i64 } { ptr @tn.str.205, i64 1 }, { ptr, i64 } { ptr @tn.str.206, i64 1 }, { ptr, i64 } { ptr @tn.str.207, i64 1 }, { ptr, i64 } { ptr @tn.str.208, i64 1 }, { ptr, i64 } { ptr @tn.str.209, i64 1 }, { ptr, i64 } { ptr @tn.str.210, i64 1 }, { ptr, i64 } { ptr @tn.str.211, i64 1 }, { ptr, i64 } { ptr @tn.str.212, i64 1 }, { ptr, i64 } { ptr @tn.str.213, i64 1 }, { ptr, i64 } { ptr @tn.str.214, i64 1 }, { ptr, i64 } { ptr @tn.str.215, i64 1 }, { ptr, i64 } { ptr @tn.str.216, i64 1 }, { ptr, i64 } { ptr @tn.str.217, i64 1 }, { ptr, i64 } { ptr @tn.str.218, i64 1 }, { ptr, i64 } { ptr @tn.str.219, i64 1 }, { ptr, i64 } { ptr @tn.str.220, i64 1 }, { ptr, i64 } { ptr @tn.str.221, i64 1 }, { ptr, i64 } { ptr @tn.str.222, i64 1 }, { ptr, i64 } { ptr @tn.str.223, i64 1 }, { ptr, i64 } { ptr @tn.str.224, i64 1 }, { ptr, i64 } { ptr @tn.str.225, i64 1 }, { ptr, i64 } { ptr @tn.str.226, i64 1 }, { ptr, i64 } { ptr @tn.str.227, i64 1 }, { ptr, i64 } { ptr @tn.str.228, i64 1 }, { ptr, i64 } { ptr @tn.str.229, i64 1 }, { ptr, i64 } { ptr @tn.str.230, i64 1 }, { ptr, i64 } { ptr @tn.str.231, i64 1 }, { ptr, i64 } { ptr @tn.str.232, i64 1 }, { ptr, i64 } { ptr @tn.str.233, i64 1 }, { ptr, i64 } { ptr @tn.str.234, i64 1 }, { ptr, i64 } { ptr @tn.str.235, i64 1 }, { ptr, i64 } { ptr @tn.str.236, i64 1 }, { ptr, i64 } { ptr @tn.str.237, i64 1 }, { ptr, i64 } { ptr @tn.str.238, i64 1 }, { ptr, i64 } { ptr @tn.str.239, i64 1 }, { ptr, i64 } { ptr @tn.str.240, i64 5 }, { ptr, i64 } { ptr @tn.str.241, i64 5 }, { ptr, i64 } { ptr @tn.str.242, i64 15 }, { ptr, i64 } { ptr @tn.str.243, i64 9 }, { ptr, i64 } { ptr @tn.str.244, i64 9 }, { ptr, i64 } { ptr @tn.str.245, i64 9 }, { ptr, i64 } { ptr @tn.str.246, i64 9 }, { ptr, i64 } { ptr @tn.str.247, i64 2 }, { ptr, i64 } { ptr @tn.str.248, i64 1 }, { ptr, i64 } { ptr @tn.str.249, i64 7 }, { ptr, i64 } { ptr @tn.str.250, i64 6 }, { ptr, i64 } { ptr @tn.str.251, i64 8 }, { ptr, i64 } { ptr @tn.str.252, i64 8 }, { ptr, i64 } { ptr @tn.str.253, i64 8 }, { ptr, i64 } { ptr @tn.str.254, i64 9 }, { ptr, i64 } { ptr @tn.str.255, i64 5 }, { ptr, i64 } { ptr @tn.str.256, i64 11 }, { ptr, i64 } { ptr @tn.str.257, i64 12 }, { ptr, i64 } { ptr @tn.str.258, i64 11 }, { ptr, i64 } { ptr @tn.str.259, i64 10 }, { ptr, i64 } { ptr @tn.str.260, i64 11 }, { ptr, i64 } { ptr @tn.str.261, i64 3 }, { ptr, i64 } { ptr @tn.str.262, i64 4 }, { ptr, i64 } { ptr @tn.str.263, i64 10 }, { ptr, i64 } { ptr @tn.str.264, i64 11 }, { ptr, i64 } { ptr @tn.str.265, i64 5 }, { ptr, i64 } { ptr @tn.str.266, i64 6 }, { ptr, i64 } { ptr @tn.str.267, i64 8 }, { ptr, i64 } { ptr @tn.str.268, i64 9 }, { ptr, i64 } { ptr @tn.str.269, i64 17 }, { ptr, i64 } { ptr @tn.str.270, i64 18 }, { ptr, i64 } { ptr @tn.str.271, i64 8 }, { ptr, i64 } { ptr @tn.str.272, i64 8 }, { ptr, i64 } { ptr @tn.str.273, i64 4 }, { ptr, i64 } { ptr @tn.str.274, i64 5 }, { ptr, i64 } { ptr @tn.str.275, i64 5 }, { ptr, i64 } { ptr @tn.str.276, i64 7 }, { ptr, i64 } { ptr @tn.str.277, i64 10 }, { ptr, i64 } { ptr @tn.str.278, i64 8 }, { ptr, i64 } { ptr @tn.str.279, i64 13 }, { ptr, i64 } { ptr @tn.str.280, i64 14 }, { ptr, i64 } { ptr @tn.str.281, i64 4 }, { ptr, i64 } { ptr @tn.str.282, i64 8 }, { ptr, i64 } { ptr @tn.str.283, i64 9 }, { ptr, i64 } { ptr @tn.str.284, i64 4 }, { ptr, i64 } { ptr @tn.str.285, i64 7 }, { ptr, i64 } { ptr @tn.str.286, i64 14 }, { ptr, i64 } { ptr @tn.str.287, i64 14 }, { ptr, i64 } { ptr @tn.str.288, i64 9 }, { ptr, i64 } { ptr @tn.str.289, i64 5 }, { ptr, i64 } { ptr @tn.str.290, i64 6 }, { ptr, i64 } { ptr @tn.str.291, i64 5 }, { ptr, i64 } { ptr @tn.str.292, i64 6 }, { ptr, i64 } { ptr @tn.str.293, i64 8 }, { ptr, i64 } { ptr @tn.str.294, i64 6 }, { ptr, i64 } { ptr @tn.str.295, i64 9 }, { ptr, i64 } { ptr @tn.str.296, i64 7 }, { ptr, i64 } { ptr @tn.str.297, i64 4 }, { ptr, i64 } { ptr @tn.str.298, i64 4 }, { ptr, i64 } { ptr @tn.str.299, i64 5 }, { ptr, i64 } { ptr @tn.str.300, i64 16 }, { ptr, i64 } { ptr @tn.str.301, i64 14 }, { ptr, i64 } { ptr @tn.str.302, i64 21 }, { ptr, i64 } { ptr @tn.str.303, i64 6 }, { ptr, i64 } { ptr @tn.str.304, i64 7 }, { ptr, i64 } { ptr @tn.str.305, i64 24 }, { ptr, i64 } { ptr @tn.str.306, i64 23 }, { ptr, i64 } { ptr @tn.str.307, i64 12 }, { ptr, i64 } { ptr @tn.str.308, i64 12 }, { ptr, i64 } { ptr @tn.str.309, i64 15 }, { ptr, i64 } { ptr @tn.str.310, i64 12 }, { ptr, i64 } { ptr @tn.str.311, i64 22 }, { ptr, i64 } { ptr @tn.str.312, i64 4 }, { ptr, i64 } { ptr @tn.str.313, i64 8 }, { ptr, i64 } { ptr @tn.str.314, i64 8 }, { ptr, i64 } { ptr @tn.str.315, i64 10 }, { ptr, i64 } { ptr @tn.str.316, i64 7 }, { ptr, i64 } { ptr @tn.str.317, i64 9 }, { ptr, i64 } { ptr @tn.str.318, i64 4 }, { ptr, i64 } { ptr @tn.str.319, i64 13 }, { ptr, i64 } { ptr @tn.str.320, i64 6 }, { ptr, i64 } { ptr @tn.str.321, i64 7 }, { ptr, i64 } { ptr @tn.str.322, i64 18 }, { ptr, i64 } { ptr @tn.str.323, i64 9 }, { ptr, i64 } { ptr @tn.str.324, i64 5 }, { ptr, i64 } { ptr @tn.str.325, i64 6 }, { ptr, i64 } { ptr @tn.str.326, i64 6 }, { ptr, i64 } { ptr @tn.str.327, i64 6 }, { ptr, i64 } { ptr @tn.str.328, i64 7 }, { ptr, i64 } { ptr @tn.str.329, i64 7 }, { ptr, i64 } { ptr @tn.str.330, i64 7 }, { ptr, i64 } { ptr @tn.str.331, i64 6 }, { ptr, i64 } { ptr @tn.str.332, i64 10 }, { ptr, i64 } { ptr @tn.str.333, i64 7 }, { ptr, i64 } { ptr @tn.str.334, i64 11 }, { ptr, i64 } { ptr @tn.str.335, i64 8 }, { ptr, i64 } { ptr @tn.str.336, i64 5 }, { ptr, i64 } { ptr @tn.str.337, i64 4 }, { ptr, i64 } { ptr @tn.str.338, i64 16 }, { ptr, i64 } { ptr @tn.str.339, i64 5 }, { ptr, i64 } { ptr @tn.str.340, i64 15 }, { ptr, i64 } { ptr @tn.str.341, i64 7 }, { ptr, i64 } { ptr @tn.str.342, i64 7 }, { ptr, i64 } { ptr @tn.str.343, i64 6 }, { ptr, i64 } { ptr @tn.str.344, i64 7 }, { ptr, i64 } { ptr @tn.str.345, i64 8 }, { ptr, i64 } { ptr @tn.str.346, i64 8 }, { ptr, i64 } { ptr @tn.str.347, i64 4 }, { ptr, i64 } { ptr @tn.str.348, i64 8 }, { ptr, i64 } { ptr @tn.str.349, i64 10 }, { ptr, i64 } { ptr @tn.str.350, i64 4 }, { ptr, i64 } { ptr @tn.str.351, i64 5 }, { ptr, i64 } { ptr @tn.str.352, i64 5 }, { ptr, i64 } { ptr @tn.str.353, i64 13 }, { ptr, i64 } { ptr @tn.str.354, i64 9 }, { ptr, i64 } { ptr @tn.str.355, i64 9 }, { ptr, i64 } { ptr @tn.str.356, i64 28 }, { ptr, i64 } { ptr @tn.str.357, i64 10 }, { ptr, i64 } { ptr @tn.str.358, i64 10 }, { ptr, i64 } { ptr @tn.str.359, i64 7 }, { ptr, i64 } { ptr @tn.str.360, i64 6 }, { ptr, i64 } { ptr @tn.str.361, i64 17 }, { ptr, i64 } { ptr @tn.str.362, i64 7 }, { ptr, i64 } { ptr @tn.str.363, i64 6 }, { ptr, i64 } { ptr @tn.str.364, i64 16 }, { ptr, i64 } { ptr @tn.str.365, i64 6 }, { ptr, i64 } { ptr @tn.str.366, i64 8 }, { ptr, i64 } { ptr @tn.str.367, i64 9 }, { ptr, i64 } { ptr @tn.str.368, i64 7 }, { ptr, i64 } { ptr @tn.str.369, i64 8 }, { ptr, i64 } { ptr @tn.str.370, i64 9 }, { ptr, i64 } { ptr @tn.str.371, i64 6 }, { ptr, i64 } { ptr @tn.str.372, i64 4 }, { ptr, i64 } { ptr @tn.str.373, i64 5 }, { ptr, i64 } { ptr @tn.str.374, i64 6 }, { ptr, i64 } { ptr @tn.str.375, i64 19 }, { ptr, i64 } { ptr @tn.str.376, i64 7 }, { ptr, i64 } { ptr @tn.str.377, i64 7 }, { ptr, i64 } { ptr @tn.str.378, i64 8 }, { ptr, i64 } { ptr @tn.str.379, i64 11 }, { ptr, i64 } { ptr @tn.str.380, i64 8 }, { ptr, i64 } { ptr @tn.str.381, i64 18 }, { ptr, i64 } { ptr @tn.str.382, i64 7 }, { ptr, i64 } { ptr @tn.str.383, i64 8 }, { ptr, i64 } { ptr @tn.str.384, i64 1 }, { ptr, i64 } { ptr @tn.str.385, i64 8 }, { ptr, i64 } { ptr @tn.str.386, i64 7 }, { ptr, i64 } { ptr @tn.str.387, i64 17 }, { ptr, i64 } { ptr @tn.str.388, i64 2 }, { ptr, i64 } { ptr @tn.str.389, i64 4 }, { ptr, i64 } { ptr @tn.str.390, i64 12 }, { ptr, i64 } { ptr @tn.str.391, i64 13 }, { ptr, i64 } { ptr @tn.str.392, i64 10 }, { ptr, i64 } { ptr @tn.str.393, i64 10 }, { ptr, i64 } { ptr @tn.str.394, i64 5 }, { ptr, i64 } { ptr @tn.str.395, i64 4 }, { ptr, i64 } { ptr @tn.str.396, i64 6 }, { ptr, i64 } { ptr @tn.str.397, i64 7 }, { ptr, i64 } { ptr @tn.str.398, i64 6 }, { ptr, i64 } { ptr @tn.str.399, i64 9 }, { ptr, i64 } { ptr @tn.str.400, i64 18 }, { ptr, i64 } { ptr @tn.str.401, i64 19 }, { ptr, i64 } { ptr @tn.str.402, i64 9 }, { ptr, i64 } { ptr @tn.str.403, i64 18 }, { ptr, i64 } { ptr @tn.str.404, i64 10 }, { ptr, i64 } { ptr @tn.str.405, i64 20 }, { ptr, i64 } { ptr @tn.str.406, i64 8 }, { ptr, i64 } { ptr @tn.str.407, i64 7 }, { ptr, i64 } { ptr @tn.str.408, i64 3 }, { ptr, i64 } { ptr @tn.str.409, i64 5 }, { ptr, i64 } { ptr @tn.str.410, i64 13 }, { ptr, i64 } { ptr @tn.str.411, i64 13 }, { ptr, i64 } { ptr @tn.str.412, i64 14 }, { ptr, i64 } { ptr @tn.str.413, i64 10 }, { ptr, i64 } { ptr @tn.str.414, i64 9 }, { ptr, i64 } { ptr @tn.str.415, i64 10 }, { ptr, i64 } { ptr @tn.str.416, i64 9 }, { ptr, i64 } { ptr @tn.str.417, i64 14 }, { ptr, i64 } { ptr @tn.str.418, i64 9 }, { ptr, i64 } { ptr @tn.str.419, i64 10 }, { ptr, i64 } { ptr @tn.str.420, i64 9 }, { ptr, i64 } { ptr @tn.str.421, i64 8 }, { ptr, i64 } { ptr @tn.str.422, i64 6 }, { ptr, i64 } { ptr @tn.str.423, i64 6 }, { ptr, i64 } { ptr @tn.str.424, i64 6 }, { ptr, i64 } { ptr @tn.str.425, i64 7 }, { ptr, i64 } { ptr @tn.str.426, i64 6 }, { ptr, i64 } { ptr @tn.str.427, i64 7 }, { ptr, i64 } { ptr @tn.str.428, i64 6 }, { ptr, i64 } { ptr @tn.str.429, i64 7 }, { ptr, i64 } { ptr @tn.str.430, i64 5 }, { ptr, i64 } { ptr @tn.str.431, i64 7 }, { ptr, i64 } { ptr @tn.str.432, i64 4 }, { ptr, i64 } { ptr @tn.str.433, i64 16 }, { ptr, i64 } { ptr @tn.str.434, i64 3 }, { ptr, i64 } { ptr @tn.str.435, i64 8 }, { ptr, i64 } { ptr @tn.str.436, i64 11 }, { ptr, i64 } { ptr @tn.str.437, i64 7 }, { ptr, i64 } { ptr @tn.str.438, i64 9 }, { ptr, i64 } { ptr @tn.str.439, i64 8 }, { ptr, i64 } { ptr @tn.str.440, i64 10 }, { ptr, i64 } { ptr @tn.str.441, i64 6 }, { ptr, i64 } { ptr @tn.str.442, i64 7 }, { ptr, i64 } { ptr @tn.str.443, i64 5 }, { ptr, i64 } { ptr @tn.str.444, i64 9 }, { ptr, i64 } { ptr @tn.str.445, i64 11 }, { ptr, i64 } { ptr @tn.str.446, i64 11 }, { ptr, i64 } { ptr @tn.str.447, i64 9 }, { ptr, i64 } { ptr @tn.str.448, i64 2 }, { ptr, i64 } { ptr @tn.str.449, i64 9 }, { ptr, i64 } { ptr @tn.str.450, i64 3 }, { ptr, i64 } { ptr @tn.str.451, i64 10 }, { ptr, i64 } { ptr @tn.str.452, i64 9 }, { ptr, i64 } { ptr @tn.str.453, i64 12 }, { ptr, i64 } { ptr @tn.str.454, i64 9 }, { ptr, i64 } { ptr @tn.str.455, i64 9 }, { ptr, i64 } { ptr @tn.str.456, i64 6 }, { ptr, i64 } { ptr @tn.str.457, i64 16 }, { ptr, i64 } { ptr @tn.str.458, i64 13 }, { ptr, i64 } { ptr @tn.str.459, i64 5 }, { ptr, i64 } { ptr @tn.str.460, i64 6 }, { ptr, i64 } { ptr @tn.str.461, i64 6 }, { ptr, i64 } { ptr @tn.str.462, i64 11 }, { ptr, i64 } { ptr @tn.str.463, i64 12 }, { ptr, i64 } { ptr @tn.str.464, i64 12 }, { ptr, i64 } { ptr @tn.str.465, i64 5 }, { ptr, i64 } { ptr @tn.str.466, i64 6 }, { ptr, i64 } { ptr @tn.str.467, i64 11 }, { ptr, i64 } { ptr @tn.str.468, i64 10 }, { ptr, i64 } { ptr @tn.str.469, i64 8 }, { ptr, i64 } { ptr @tn.str.470, i64 5 }, { ptr, i64 } { ptr @tn.str.471, i64 10 }, { ptr, i64 } { ptr @tn.str.472, i64 5 }, { ptr, i64 } { ptr @tn.str.473, i64 12 }, { ptr, i64 } { ptr @tn.str.474, i64 7 }, { ptr, i64 } { ptr @tn.str.475, i64 10 }, { ptr, i64 } { ptr @tn.str.476, i64 19 }, { ptr, i64 } { ptr @tn.str.477, i64 6 }, { ptr, i64 } { ptr @tn.str.478, i64 5 }, { ptr, i64 } { ptr @tn.str.479, i64 10 }, { ptr, i64 } { ptr @tn.str.480, i64 5 }, { ptr, i64 } { ptr @tn.str.481, i64 9 }, { ptr, i64 } { ptr @tn.str.482, i64 7 }, { ptr, i64 } { ptr @tn.str.483, i64 10 }, { ptr, i64 } { ptr @tn.str.484, i64 8 }, { ptr, i64 } { ptr @tn.str.485, i64 6 }, { ptr, i64 } { ptr @tn.str.486, i64 8 }, { ptr, i64 } { ptr @tn.str.487, i64 5 }, { ptr, i64 } { ptr @tn.str.488, i64 8 }, { ptr, i64 } { ptr @tn.str.489, i64 6 }, { ptr, i64 } { ptr @tn.str.490, i64 8 }, { ptr, i64 } { ptr @tn.str.491, i64 8 }, { ptr, i64 } { ptr @tn.str.492, i64 12 }, { ptr, i64 } { ptr @tn.str.493, i64 6 }, { ptr, i64 } { ptr @tn.str.494, i64 9 }, { ptr, i64 } { ptr @tn.str.495, i64 6 }, { ptr, i64 } { ptr @tn.str.496, i64 14 }, { ptr, i64 } { ptr @tn.str.497, i64 10 }, { ptr, i64 } { ptr @tn.str.498, i64 11 }, { ptr, i64 } { ptr @tn.str.499, i64 8 }, { ptr, i64 } { ptr @tn.str.500, i64 8 }, { ptr, i64 } { ptr @tn.str.501, i64 7 }, { ptr, i64 } { ptr @tn.str.502, i64 7 }, { ptr, i64 } { ptr @tn.str.503, i64 10 }, { ptr, i64 } { ptr @tn.str.504, i64 9 }, { ptr, i64 } { ptr @tn.str.505, i64 7 }, { ptr, i64 } { ptr @tn.str.506, i64 6 }, { ptr, i64 } { ptr @tn.str.507, i64 8 }, { ptr, i64 } { ptr @tn.str.508, i64 12 }, { ptr, i64 } { ptr @tn.str.509, i64 9 }, { ptr, i64 } { ptr @tn.str.510, i64 13 }, { ptr, i64 } { ptr @tn.str.511, i64 14 }, { ptr, i64 } { ptr @tn.str.512, i64 11 }, { ptr, i64 } { ptr @tn.str.513, i64 11 }, { ptr, i64 } { ptr @tn.str.514, i64 5 }, { ptr, i64 } { ptr @tn.str.515, i64 8 }, { ptr, i64 } { ptr @tn.str.516, i64 7 }, { ptr, i64 } { ptr @tn.str.517, i64 10 }, { ptr, i64 } { ptr @tn.str.518, i64 19 }, { ptr, i64 } { ptr @tn.str.519, i64 11 }, { ptr, i64 } { ptr @tn.str.520, i64 21 }, { ptr, i64 } { ptr @tn.str.521, i64 9 }, { ptr, i64 } { ptr @tn.str.522, i64 8 }, { ptr, i64 } { ptr @tn.str.523, i64 4 }, { ptr, i64 } { ptr @tn.str.524, i64 6 }, { ptr, i64 } { ptr @tn.str.525, i64 14 }, { ptr, i64 } { ptr @tn.str.526, i64 15 }, { ptr, i64 } { ptr @tn.str.527, i64 11 }, { ptr, i64 } { ptr @tn.str.528, i64 11 }, { ptr, i64 } { ptr @tn.str.529, i64 10 }, { ptr, i64 } { ptr @tn.str.530, i64 15 }, { ptr, i64 } { ptr @tn.str.531, i64 11 }, { ptr, i64 } { ptr @tn.str.532, i64 10 }, { ptr, i64 } { ptr @tn.str.533, i64 9 }, { ptr, i64 } { ptr @tn.str.534, i64 7 }, { ptr, i64 } { ptr @tn.str.535, i64 7 }, { ptr, i64 } { ptr @tn.str.536, i64 8 }, { ptr, i64 } { ptr @tn.str.537, i64 8 }, { ptr, i64 } { ptr @tn.str.538, i64 8 }, { ptr, i64 } { ptr @tn.str.539, i64 6 }, { ptr, i64 } { ptr @tn.str.540, i64 6 }, { ptr, i64 } { ptr @tn.str.541, i64 8 }, { ptr, i64 } { ptr @tn.str.542, i64 15 }, { ptr, i64 } { ptr @tn.str.543, i64 8 }] +@__sx_type_names = private constant [404 x { ptr, i64 }] [{ ptr, i64 } { ptr @tn.str, i64 12 }, { ptr, i64 } { ptr @tn.str.141, i64 4 }, { ptr, i64 } { ptr @tn.str.142, i64 2 }, { ptr, i64 } { ptr @tn.str.143, i64 3 }, { ptr, i64 } { ptr @tn.str.144, i64 3 }, { ptr, i64 } { ptr @tn.str.145, i64 3 }, { ptr, i64 } { ptr @tn.str.146, i64 2 }, { ptr, i64 } { ptr @tn.str.147, i64 3 }, { ptr, i64 } { ptr @tn.str.148, i64 3 }, { ptr, i64 } { ptr @tn.str.149, i64 3 }, { ptr, i64 } { ptr @tn.str.150, i64 3 }, { ptr, i64 } { ptr @tn.str.151, i64 3 }, { ptr, i64 } { ptr @tn.str.152, i64 6 }, { ptr, i64 } { ptr @tn.str.153, i64 3 }, { ptr, i64 } { ptr @tn.str.154, i64 8 }, { ptr, i64 } { ptr @tn.str.155, i64 5 }, { ptr, i64 } { ptr @tn.str.156, i64 5 }, { ptr, i64 } { ptr @tn.str.157, i64 4 }, { ptr, i64 } { ptr @tn.str.158, i64 7 }, { ptr, i64 } { ptr @tn.str.159, i64 4 }, { ptr, i64 } { ptr @tn.str.160, i64 1 }, { ptr, i64 } { ptr @tn.str.161, i64 1 }, { ptr, i64 } { ptr @tn.str.162, i64 1 }, { ptr, i64 } { ptr @tn.str.163, i64 1 }, { ptr, i64 } { ptr @tn.str.164, i64 1 }, { ptr, i64 } { ptr @tn.str.165, i64 1 }, { ptr, i64 } { ptr @tn.str.166, i64 1 }, { ptr, i64 } { ptr @tn.str.167, i64 1 }, { ptr, i64 } { ptr @tn.str.168, i64 1 }, { ptr, i64 } { ptr @tn.str.169, i64 1 }, { ptr, i64 } { ptr @tn.str.170, i64 1 }, { ptr, i64 } { ptr @tn.str.171, i64 1 }, { ptr, i64 } { ptr @tn.str.172, i64 1 }, { ptr, i64 } { ptr @tn.str.173, i64 1 }, { ptr, i64 } { ptr @tn.str.174, i64 1 }, { ptr, i64 } { ptr @tn.str.175, i64 1 }, { ptr, i64 } { ptr @tn.str.176, i64 1 }, { ptr, i64 } { ptr @tn.str.177, i64 1 }, { ptr, i64 } { ptr @tn.str.178, i64 1 }, { ptr, i64 } { ptr @tn.str.179, i64 1 }, { ptr, i64 } { ptr @tn.str.180, i64 1 }, { ptr, i64 } { ptr @tn.str.181, i64 1 }, { ptr, i64 } { ptr @tn.str.182, i64 1 }, { ptr, i64 } { ptr @tn.str.183, i64 1 }, { ptr, i64 } { ptr @tn.str.184, i64 1 }, { ptr, i64 } { ptr @tn.str.185, i64 1 }, { ptr, i64 } { ptr @tn.str.186, i64 1 }, { ptr, i64 } { ptr @tn.str.187, i64 1 }, { ptr, i64 } { ptr @tn.str.188, i64 1 }, { ptr, i64 } { ptr @tn.str.189, i64 1 }, { ptr, i64 } { ptr @tn.str.190, i64 1 }, { ptr, i64 } { ptr @tn.str.191, i64 1 }, { ptr, i64 } { ptr @tn.str.192, i64 1 }, { ptr, i64 } { ptr @tn.str.193, i64 1 }, { ptr, i64 } { ptr @tn.str.194, i64 1 }, { ptr, i64 } { ptr @tn.str.195, i64 1 }, { ptr, i64 } { ptr @tn.str.196, i64 1 }, { ptr, i64 } { ptr @tn.str.197, i64 1 }, { ptr, i64 } { ptr @tn.str.198, i64 1 }, { ptr, i64 } { ptr @tn.str.199, i64 1 }, { ptr, i64 } { ptr @tn.str.200, i64 1 }, { ptr, i64 } { ptr @tn.str.201, i64 1 }, { ptr, i64 } { ptr @tn.str.202, i64 1 }, { ptr, i64 } { ptr @tn.str.203, i64 1 }, { ptr, i64 } { ptr @tn.str.204, i64 1 }, { ptr, i64 } { ptr @tn.str.205, i64 1 }, { ptr, i64 } { ptr @tn.str.206, i64 1 }, { ptr, i64 } { ptr @tn.str.207, i64 1 }, { ptr, i64 } { ptr @tn.str.208, i64 1 }, { ptr, i64 } { ptr @tn.str.209, i64 1 }, { ptr, i64 } { ptr @tn.str.210, i64 1 }, { ptr, i64 } { ptr @tn.str.211, i64 1 }, { ptr, i64 } { ptr @tn.str.212, i64 1 }, { ptr, i64 } { ptr @tn.str.213, i64 1 }, { ptr, i64 } { ptr @tn.str.214, i64 1 }, { ptr, i64 } { ptr @tn.str.215, i64 1 }, { ptr, i64 } { ptr @tn.str.216, i64 1 }, { ptr, i64 } { ptr @tn.str.217, i64 1 }, { ptr, i64 } { ptr @tn.str.218, i64 1 }, { ptr, i64 } { ptr @tn.str.219, i64 1 }, { ptr, i64 } { ptr @tn.str.220, i64 1 }, { ptr, i64 } { ptr @tn.str.221, i64 1 }, { ptr, i64 } { ptr @tn.str.222, i64 1 }, { ptr, i64 } { ptr @tn.str.223, i64 1 }, { ptr, i64 } { ptr @tn.str.224, i64 1 }, { ptr, i64 } { ptr @tn.str.225, i64 1 }, { ptr, i64 } { ptr @tn.str.226, i64 1 }, { ptr, i64 } { ptr @tn.str.227, i64 1 }, { ptr, i64 } { ptr @tn.str.228, i64 1 }, { ptr, i64 } { ptr @tn.str.229, i64 1 }, { ptr, i64 } { ptr @tn.str.230, i64 1 }, { ptr, i64 } { ptr @tn.str.231, i64 1 }, { ptr, i64 } { ptr @tn.str.232, i64 1 }, { ptr, i64 } { ptr @tn.str.233, i64 1 }, { ptr, i64 } { ptr @tn.str.234, i64 1 }, { ptr, i64 } { ptr @tn.str.235, i64 1 }, { ptr, i64 } { ptr @tn.str.236, i64 1 }, { ptr, i64 } { ptr @tn.str.237, i64 1 }, { ptr, i64 } { ptr @tn.str.238, i64 1 }, { ptr, i64 } { ptr @tn.str.239, i64 1 }, { ptr, i64 } { ptr @tn.str.240, i64 5 }, { ptr, i64 } { ptr @tn.str.241, i64 5 }, { ptr, i64 } { ptr @tn.str.242, i64 15 }, { ptr, i64 } { ptr @tn.str.243, i64 9 }, { ptr, i64 } { ptr @tn.str.244, i64 9 }, { ptr, i64 } { ptr @tn.str.245, i64 9 }, { ptr, i64 } { ptr @tn.str.246, i64 9 }, { ptr, i64 } { ptr @tn.str.247, i64 2 }, { ptr, i64 } { ptr @tn.str.248, i64 1 }, { ptr, i64 } { ptr @tn.str.249, i64 7 }, { ptr, i64 } { ptr @tn.str.250, i64 6 }, { ptr, i64 } { ptr @tn.str.251, i64 8 }, { ptr, i64 } { ptr @tn.str.252, i64 8 }, { ptr, i64 } { ptr @tn.str.253, i64 8 }, { ptr, i64 } { ptr @tn.str.254, i64 9 }, { ptr, i64 } { ptr @tn.str.255, i64 5 }, { ptr, i64 } { ptr @tn.str.256, i64 11 }, { ptr, i64 } { ptr @tn.str.257, i64 12 }, { ptr, i64 } { ptr @tn.str.258, i64 11 }, { ptr, i64 } { ptr @tn.str.259, i64 10 }, { ptr, i64 } { ptr @tn.str.260, i64 11 }, { ptr, i64 } { ptr @tn.str.261, i64 3 }, { ptr, i64 } { ptr @tn.str.262, i64 4 }, { ptr, i64 } { ptr @tn.str.263, i64 10 }, { ptr, i64 } { ptr @tn.str.264, i64 11 }, { ptr, i64 } { ptr @tn.str.265, i64 5 }, { ptr, i64 } { ptr @tn.str.266, i64 6 }, { ptr, i64 } { ptr @tn.str.267, i64 8 }, { ptr, i64 } { ptr @tn.str.268, i64 9 }, { ptr, i64 } { ptr @tn.str.269, i64 17 }, { ptr, i64 } { ptr @tn.str.270, i64 18 }, { ptr, i64 } { ptr @tn.str.271, i64 8 }, { ptr, i64 } { ptr @tn.str.272, i64 8 }, { ptr, i64 } { ptr @tn.str.273, i64 4 }, { ptr, i64 } { ptr @tn.str.274, i64 5 }, { ptr, i64 } { ptr @tn.str.275, i64 5 }, { ptr, i64 } { ptr @tn.str.276, i64 7 }, { ptr, i64 } { ptr @tn.str.277, i64 10 }, { ptr, i64 } { ptr @tn.str.278, i64 8 }, { ptr, i64 } { ptr @tn.str.279, i64 13 }, { ptr, i64 } { ptr @tn.str.280, i64 14 }, { ptr, i64 } { ptr @tn.str.281, i64 4 }, { ptr, i64 } { ptr @tn.str.282, i64 8 }, { ptr, i64 } { ptr @tn.str.283, i64 9 }, { ptr, i64 } { ptr @tn.str.284, i64 4 }, { ptr, i64 } { ptr @tn.str.285, i64 7 }, { ptr, i64 } { ptr @tn.str.286, i64 14 }, { ptr, i64 } { ptr @tn.str.287, i64 14 }, { ptr, i64 } { ptr @tn.str.288, i64 9 }, { ptr, i64 } { ptr @tn.str.289, i64 5 }, { ptr, i64 } { ptr @tn.str.290, i64 6 }, { ptr, i64 } { ptr @tn.str.291, i64 5 }, { ptr, i64 } { ptr @tn.str.292, i64 6 }, { ptr, i64 } { ptr @tn.str.293, i64 8 }, { ptr, i64 } { ptr @tn.str.294, i64 6 }, { ptr, i64 } { ptr @tn.str.295, i64 9 }, { ptr, i64 } { ptr @tn.str.296, i64 7 }, { ptr, i64 } { ptr @tn.str.297, i64 4 }, { ptr, i64 } { ptr @tn.str.298, i64 4 }, { ptr, i64 } { ptr @tn.str.299, i64 5 }, { ptr, i64 } { ptr @tn.str.300, i64 16 }, { ptr, i64 } { ptr @tn.str.301, i64 14 }, { ptr, i64 } { ptr @tn.str.302, i64 21 }, { ptr, i64 } { ptr @tn.str.303, i64 6 }, { ptr, i64 } { ptr @tn.str.304, i64 7 }, { ptr, i64 } { ptr @tn.str.305, i64 24 }, { ptr, i64 } { ptr @tn.str.306, i64 23 }, { ptr, i64 } { ptr @tn.str.307, i64 12 }, { ptr, i64 } { ptr @tn.str.308, i64 12 }, { ptr, i64 } { ptr @tn.str.309, i64 15 }, { ptr, i64 } { ptr @tn.str.310, i64 12 }, { ptr, i64 } { ptr @tn.str.311, i64 22 }, { ptr, i64 } { ptr @tn.str.312, i64 4 }, { ptr, i64 } { ptr @tn.str.313, i64 8 }, { ptr, i64 } { ptr @tn.str.314, i64 8 }, { ptr, i64 } { ptr @tn.str.315, i64 10 }, { ptr, i64 } { ptr @tn.str.316, i64 7 }, { ptr, i64 } { ptr @tn.str.317, i64 9 }, { ptr, i64 } { ptr @tn.str.318, i64 4 }, { ptr, i64 } { ptr @tn.str.319, i64 13 }, { ptr, i64 } { ptr @tn.str.320, i64 6 }, { ptr, i64 } { ptr @tn.str.321, i64 7 }, { ptr, i64 } { ptr @tn.str.322, i64 18 }, { ptr, i64 } { ptr @tn.str.323, i64 9 }, { ptr, i64 } { ptr @tn.str.324, i64 5 }, { ptr, i64 } { ptr @tn.str.325, i64 6 }, { ptr, i64 } { ptr @tn.str.326, i64 6 }, { ptr, i64 } { ptr @tn.str.327, i64 6 }, { ptr, i64 } { ptr @tn.str.328, i64 7 }, { ptr, i64 } { ptr @tn.str.329, i64 7 }, { ptr, i64 } { ptr @tn.str.330, i64 7 }, { ptr, i64 } { ptr @tn.str.331, i64 6 }, { ptr, i64 } { ptr @tn.str.332, i64 10 }, { ptr, i64 } { ptr @tn.str.333, i64 7 }, { ptr, i64 } { ptr @tn.str.334, i64 11 }, { ptr, i64 } { ptr @tn.str.335, i64 8 }, { ptr, i64 } { ptr @tn.str.336, i64 5 }, { ptr, i64 } { ptr @tn.str.337, i64 4 }, { ptr, i64 } { ptr @tn.str.338, i64 16 }, { ptr, i64 } { ptr @tn.str.339, i64 5 }, { ptr, i64 } { ptr @tn.str.340, i64 15 }, { ptr, i64 } { ptr @tn.str.341, i64 7 }, { ptr, i64 } { ptr @tn.str.342, i64 7 }, { ptr, i64 } { ptr @tn.str.343, i64 6 }, { ptr, i64 } { ptr @tn.str.344, i64 7 }, { ptr, i64 } { ptr @tn.str.345, i64 8 }, { ptr, i64 } { ptr @tn.str.346, i64 8 }, { ptr, i64 } { ptr @tn.str.347, i64 4 }, { ptr, i64 } { ptr @tn.str.348, i64 8 }, { ptr, i64 } { ptr @tn.str.349, i64 10 }, { ptr, i64 } { ptr @tn.str.350, i64 4 }, { ptr, i64 } { ptr @tn.str.351, i64 5 }, { ptr, i64 } { ptr @tn.str.352, i64 5 }, { ptr, i64 } { ptr @tn.str.353, i64 13 }, { ptr, i64 } { ptr @tn.str.354, i64 9 }, { ptr, i64 } { ptr @tn.str.355, i64 9 }, { ptr, i64 } { ptr @tn.str.356, i64 28 }, { ptr, i64 } { ptr @tn.str.357, i64 10 }, { ptr, i64 } { ptr @tn.str.358, i64 10 }, { ptr, i64 } { ptr @tn.str.359, i64 7 }, { ptr, i64 } { ptr @tn.str.360, i64 6 }, { ptr, i64 } { ptr @tn.str.361, i64 17 }, { ptr, i64 } { ptr @tn.str.362, i64 7 }, { ptr, i64 } { ptr @tn.str.363, i64 6 }, { ptr, i64 } { ptr @tn.str.364, i64 16 }, { ptr, i64 } { ptr @tn.str.365, i64 6 }, { ptr, i64 } { ptr @tn.str.366, i64 8 }, { ptr, i64 } { ptr @tn.str.367, i64 9 }, { ptr, i64 } { ptr @tn.str.368, i64 7 }, { ptr, i64 } { ptr @tn.str.369, i64 8 }, { ptr, i64 } { ptr @tn.str.370, i64 9 }, { ptr, i64 } { ptr @tn.str.371, i64 6 }, { ptr, i64 } { ptr @tn.str.372, i64 4 }, { ptr, i64 } { ptr @tn.str.373, i64 5 }, { ptr, i64 } { ptr @tn.str.374, i64 6 }, { ptr, i64 } { ptr @tn.str.375, i64 19 }, { ptr, i64 } { ptr @tn.str.376, i64 7 }, { ptr, i64 } { ptr @tn.str.377, i64 7 }, { ptr, i64 } { ptr @tn.str.378, i64 8 }, { ptr, i64 } { ptr @tn.str.379, i64 11 }, { ptr, i64 } { ptr @tn.str.380, i64 8 }, { ptr, i64 } { ptr @tn.str.381, i64 18 }, { ptr, i64 } { ptr @tn.str.382, i64 7 }, { ptr, i64 } { ptr @tn.str.383, i64 8 }, { ptr, i64 } { ptr @tn.str.384, i64 1 }, { ptr, i64 } { ptr @tn.str.385, i64 8 }, { ptr, i64 } { ptr @tn.str.386, i64 7 }, { ptr, i64 } { ptr @tn.str.387, i64 17 }, { ptr, i64 } { ptr @tn.str.388, i64 2 }, { ptr, i64 } { ptr @tn.str.389, i64 4 }, { ptr, i64 } { ptr @tn.str.390, i64 12 }, { ptr, i64 } { ptr @tn.str.391, i64 13 }, { ptr, i64 } { ptr @tn.str.392, i64 10 }, { ptr, i64 } { ptr @tn.str.393, i64 10 }, { ptr, i64 } { ptr @tn.str.394, i64 5 }, { ptr, i64 } { ptr @tn.str.395, i64 4 }, { ptr, i64 } { ptr @tn.str.396, i64 6 }, { ptr, i64 } { ptr @tn.str.397, i64 7 }, { ptr, i64 } { ptr @tn.str.398, i64 6 }, { ptr, i64 } { ptr @tn.str.399, i64 10 }, { ptr, i64 } { ptr @tn.str.400, i64 18 }, { ptr, i64 } { ptr @tn.str.401, i64 19 }, { ptr, i64 } { ptr @tn.str.402, i64 9 }, { ptr, i64 } { ptr @tn.str.403, i64 18 }, { ptr, i64 } { ptr @tn.str.404, i64 11 }, { ptr, i64 } { ptr @tn.str.405, i64 20 }, { ptr, i64 } { ptr @tn.str.406, i64 8 }, { ptr, i64 } { ptr @tn.str.407, i64 7 }, { ptr, i64 } { ptr @tn.str.408, i64 3 }, { ptr, i64 } { ptr @tn.str.409, i64 5 }, { ptr, i64 } { ptr @tn.str.410, i64 13 }, { ptr, i64 } { ptr @tn.str.411, i64 13 }, { ptr, i64 } { ptr @tn.str.412, i64 14 }, { ptr, i64 } { ptr @tn.str.413, i64 10 }, { ptr, i64 } { ptr @tn.str.414, i64 9 }, { ptr, i64 } { ptr @tn.str.415, i64 10 }, { ptr, i64 } { ptr @tn.str.416, i64 9 }, { ptr, i64 } { ptr @tn.str.417, i64 14 }, { ptr, i64 } { ptr @tn.str.418, i64 9 }, { ptr, i64 } { ptr @tn.str.419, i64 10 }, { ptr, i64 } { ptr @tn.str.420, i64 9 }, { ptr, i64 } { ptr @tn.str.421, i64 8 }, { ptr, i64 } { ptr @tn.str.422, i64 6 }, { ptr, i64 } { ptr @tn.str.423, i64 6 }, { ptr, i64 } { ptr @tn.str.424, i64 6 }, { ptr, i64 } { ptr @tn.str.425, i64 7 }, { ptr, i64 } { ptr @tn.str.426, i64 6 }, { ptr, i64 } { ptr @tn.str.427, i64 7 }, { ptr, i64 } { ptr @tn.str.428, i64 6 }, { ptr, i64 } { ptr @tn.str.429, i64 7 }, { ptr, i64 } { ptr @tn.str.430, i64 5 }, { ptr, i64 } { ptr @tn.str.431, i64 7 }, { ptr, i64 } { ptr @tn.str.432, i64 4 }, { ptr, i64 } { ptr @tn.str.433, i64 16 }, { ptr, i64 } { ptr @tn.str.434, i64 3 }, { ptr, i64 } { ptr @tn.str.435, i64 8 }, { ptr, i64 } { ptr @tn.str.436, i64 11 }, { ptr, i64 } { ptr @tn.str.437, i64 7 }, { ptr, i64 } { ptr @tn.str.438, i64 9 }, { ptr, i64 } { ptr @tn.str.439, i64 8 }, { ptr, i64 } { ptr @tn.str.440, i64 10 }, { ptr, i64 } { ptr @tn.str.441, i64 6 }, { ptr, i64 } { ptr @tn.str.442, i64 7 }, { ptr, i64 } { ptr @tn.str.443, i64 5 }, { ptr, i64 } { ptr @tn.str.444, i64 9 }, { ptr, i64 } { ptr @tn.str.445, i64 11 }, { ptr, i64 } { ptr @tn.str.446, i64 11 }, { ptr, i64 } { ptr @tn.str.447, i64 9 }, { ptr, i64 } { ptr @tn.str.448, i64 2 }, { ptr, i64 } { ptr @tn.str.449, i64 9 }, { ptr, i64 } { ptr @tn.str.450, i64 3 }, { ptr, i64 } { ptr @tn.str.451, i64 10 }, { ptr, i64 } { ptr @tn.str.452, i64 9 }, { ptr, i64 } { ptr @tn.str.453, i64 12 }, { ptr, i64 } { ptr @tn.str.454, i64 9 }, { ptr, i64 } { ptr @tn.str.455, i64 9 }, { ptr, i64 } { ptr @tn.str.456, i64 6 }, { ptr, i64 } { ptr @tn.str.457, i64 16 }, { ptr, i64 } { ptr @tn.str.458, i64 13 }, { ptr, i64 } { ptr @tn.str.459, i64 5 }, { ptr, i64 } { ptr @tn.str.460, i64 6 }, { ptr, i64 } { ptr @tn.str.461, i64 6 }, { ptr, i64 } { ptr @tn.str.462, i64 11 }, { ptr, i64 } { ptr @tn.str.463, i64 12 }, { ptr, i64 } { ptr @tn.str.464, i64 12 }, { ptr, i64 } { ptr @tn.str.465, i64 5 }, { ptr, i64 } { ptr @tn.str.466, i64 6 }, { ptr, i64 } { ptr @tn.str.467, i64 11 }, { ptr, i64 } { ptr @tn.str.468, i64 10 }, { ptr, i64 } { ptr @tn.str.469, i64 8 }, { ptr, i64 } { ptr @tn.str.470, i64 5 }, { ptr, i64 } { ptr @tn.str.471, i64 10 }, { ptr, i64 } { ptr @tn.str.472, i64 5 }, { ptr, i64 } { ptr @tn.str.473, i64 12 }, { ptr, i64 } { ptr @tn.str.474, i64 7 }, { ptr, i64 } { ptr @tn.str.475, i64 10 }, { ptr, i64 } { ptr @tn.str.476, i64 19 }, { ptr, i64 } { ptr @tn.str.477, i64 6 }, { ptr, i64 } { ptr @tn.str.478, i64 5 }, { ptr, i64 } { ptr @tn.str.479, i64 10 }, { ptr, i64 } { ptr @tn.str.480, i64 5 }, { ptr, i64 } { ptr @tn.str.481, i64 9 }, { ptr, i64 } { ptr @tn.str.482, i64 7 }, { ptr, i64 } { ptr @tn.str.483, i64 10 }, { ptr, i64 } { ptr @tn.str.484, i64 8 }, { ptr, i64 } { ptr @tn.str.485, i64 6 }, { ptr, i64 } { ptr @tn.str.486, i64 8 }, { ptr, i64 } { ptr @tn.str.487, i64 5 }, { ptr, i64 } { ptr @tn.str.488, i64 8 }, { ptr, i64 } { ptr @tn.str.489, i64 6 }, { ptr, i64 } { ptr @tn.str.490, i64 8 }, { ptr, i64 } { ptr @tn.str.491, i64 8 }, { ptr, i64 } { ptr @tn.str.492, i64 12 }, { ptr, i64 } { ptr @tn.str.493, i64 6 }, { ptr, i64 } { ptr @tn.str.494, i64 9 }, { ptr, i64 } { ptr @tn.str.495, i64 6 }, { ptr, i64 } { ptr @tn.str.496, i64 14 }, { ptr, i64 } { ptr @tn.str.497, i64 10 }, { ptr, i64 } { ptr @tn.str.498, i64 11 }, { ptr, i64 } { ptr @tn.str.499, i64 8 }, { ptr, i64 } { ptr @tn.str.500, i64 8 }, { ptr, i64 } { ptr @tn.str.501, i64 7 }, { ptr, i64 } { ptr @tn.str.502, i64 7 }, { ptr, i64 } { ptr @tn.str.503, i64 10 }, { ptr, i64 } { ptr @tn.str.504, i64 9 }, { ptr, i64 } { ptr @tn.str.505, i64 7 }, { ptr, i64 } { ptr @tn.str.506, i64 6 }, { ptr, i64 } { ptr @tn.str.507, i64 8 }, { ptr, i64 } { ptr @tn.str.508, i64 12 }, { ptr, i64 } { ptr @tn.str.509, i64 9 }, { ptr, i64 } { ptr @tn.str.510, i64 13 }, { ptr, i64 } { ptr @tn.str.511, i64 14 }, { ptr, i64 } { ptr @tn.str.512, i64 11 }, { ptr, i64 } { ptr @tn.str.513, i64 11 }, { ptr, i64 } { ptr @tn.str.514, i64 5 }, { ptr, i64 } { ptr @tn.str.515, i64 8 }, { ptr, i64 } { ptr @tn.str.516, i64 7 }, { ptr, i64 } { ptr @tn.str.517, i64 10 }, { ptr, i64 } { ptr @tn.str.518, i64 19 }, { ptr, i64 } { ptr @tn.str.519, i64 12 }, { ptr, i64 } { ptr @tn.str.520, i64 21 }, { ptr, i64 } { ptr @tn.str.521, i64 9 }, { ptr, i64 } { ptr @tn.str.522, i64 8 }, { ptr, i64 } { ptr @tn.str.523, i64 4 }, { ptr, i64 } { ptr @tn.str.524, i64 6 }, { ptr, i64 } { ptr @tn.str.525, i64 14 }, { ptr, i64 } { ptr @tn.str.526, i64 15 }, { ptr, i64 } { ptr @tn.str.527, i64 11 }, { ptr, i64 } { ptr @tn.str.528, i64 11 }, { ptr, i64 } { ptr @tn.str.529, i64 10 }, { ptr, i64 } { ptr @tn.str.530, i64 15 }, { ptr, i64 } { ptr @tn.str.531, i64 11 }, { ptr, i64 } { ptr @tn.str.532, i64 10 }, { ptr, i64 } { ptr @tn.str.533, i64 9 }, { ptr, i64 } { ptr @tn.str.534, i64 7 }, { ptr, i64 } { ptr @tn.str.535, i64 7 }, { ptr, i64 } { ptr @tn.str.536, i64 8 }, { ptr, i64 } { ptr @tn.str.537, i64 8 }, { ptr, i64 } { ptr @tn.str.538, i64 8 }, { ptr, i64 } { ptr @tn.str.539, i64 6 }, { ptr, i64 } { ptr @tn.str.540, i64 6 }, { ptr, i64 } { ptr @tn.str.541, i64 8 }, { ptr, i64 } { ptr @tn.str.542, i64 15 }, { ptr, i64 } { ptr @tn.str.543, i64 8 }] @str.544 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 @str.545 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 @str.546 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 @@ -1381,7 +1381,7 @@ @str.1477 = private unnamed_addr constant [19 x i8] c"*__VL__i64__Vtable\00", align 1 @str.1478 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.1479 = private unnamed_addr constant [5 x i8] c"null\00", align 1 -@str.1480 = private unnamed_addr constant [11 x i8] c"*(VL__i64)\00", align 1 +@str.1480 = private unnamed_addr constant [12 x i8] c"*(VL__i64,)\00", align 1 @str.1481 = private unnamed_addr constant [4 x i8] c"@0x\00", align 1 @str.1482 = private unnamed_addr constant [5 x i8] c"null\00", align 1 @str.1483 = private unnamed_addr constant [21 x i8] c"**Combined__i64__i64\00", align 1 @@ -16197,7 +16197,7 @@ if.else.1256: ; preds = %entry %loadN = load i64, ptr %allocaN, align 8 %call = call { ptr, i64 } @int_to_hex_string(ptr %0, i64 %loadN) %callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.1481, i64 3 }, { ptr, i64 } %call) - %callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.1480, i64 10 }, { ptr, i64 } %callN) + %callN = call { ptr, i64 } @concat(ptr %0, { ptr, i64 } { ptr @str.1480, i64 11 }, { ptr, i64 } %callN) br label %if.merge.1257 if.merge.1257: ; preds = %if.else.1256, %if.then.1255 diff --git a/examples/types/0201-types-parenthesized-type-grouping.sx b/examples/types/0201-types-parenthesized-type-grouping.sx new file mode 100644 index 00000000..b3bbf870 --- /dev/null +++ b/examples/types/0201-types-parenthesized-type-grouping.sx @@ -0,0 +1,38 @@ +// Parenthesized type grouping: in type position `(T)` (single element, no +// trailing comma) is a GROUPING that resolves to the inner type — mirroring +// value position where `(expr)` groups and `(expr,)` is a 1-tuple. A 1-tuple +// type requires the trailing comma `(T,)`; `(A, B)` is a 2-tuple. +// +// This lets a closure/optional type be parenthesized for readability: +// [1](Closure(i64,i64) -> i64) // array of closures (grouped element type) +// ?(?i64) // nested optional +// without the parens silently turning it into a 1-tuple. + +#import "modules/std.sx"; + +add :: (a: i64, b: i64) -> i64 { return a + b; } + +main :: () { + // `(i64)` groups to `i64`. + g : (i64) = 7; + print("{}\n", g); // 7 + // `((i64))` groups twice. + gg : ((i64)) = 8; + print("{}\n", gg); // 8 + + // `?(?i64)` is a genuine nested optional (grouping, not a 1-tuple). + no : ?(?i64) = 5; + print("{}\n", no!!); // 5 + + // Parenthesized closure element type → array of callable closures. + fns : [1](Closure(i64, i64) -> i64) = .[ add ]; + print("{}\n", fns[0](3, 4)); // 7 + + // A 1-tuple type still requires the trailing comma. + one : (i64,) = (9,); + print("{}\n", one.0); // 9 + + // A 2-tuple is unaffected. + two : (i64, i64) = (40, 2); + print("{}\n", two.0 + two.1); // 42 +} diff --git a/examples/types/expected/0201-types-parenthesized-type-grouping.exit b/examples/types/expected/0201-types-parenthesized-type-grouping.exit new file mode 100644 index 00000000..573541ac --- /dev/null +++ b/examples/types/expected/0201-types-parenthesized-type-grouping.exit @@ -0,0 +1 @@ +0 diff --git a/examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.stdout b/examples/types/expected/0201-types-parenthesized-type-grouping.stderr similarity index 100% rename from examples/diagnostics/expected/1195-diagnostics-err-parenthesized-optional-tuple.stdout rename to examples/types/expected/0201-types-parenthesized-type-grouping.stderr diff --git a/examples/types/expected/0201-types-parenthesized-type-grouping.stdout b/examples/types/expected/0201-types-parenthesized-type-grouping.stdout new file mode 100644 index 00000000..5e1673c6 --- /dev/null +++ b/examples/types/expected/0201-types-parenthesized-type-grouping.stdout @@ -0,0 +1,6 @@ +7 +8 +5 +7 +9 +42 diff --git a/issues/0165-parenthesized-nested-optional-malformed.md b/issues/0165-parenthesized-nested-optional-malformed.md index 110637c0..502760a2 100644 --- a/issues/0165-parenthesized-nested-optional-malformed.md +++ b/issues/0165-parenthesized-nested-optional-malformed.md @@ -14,6 +14,11 @@ > Genuine nested optionals via alias (`Opt :: ?i64; ?Opt`) work and round-trip. > Regressions: `examples/optionals/0911-nested-optional-via-alias.sx`, > `examples/diagnostics/1195-diagnostics-err-parenthesized-optional-tuple.sx`. +> **UPDATE (grouping):** `(T)` in type position is now a GROUPING, not a +> 1-tuple, so `?(?i64)` is a genuine NESTED OPTIONAL and compiles (what this +> issue originally wanted). The coerce guard now only fires for an explicit +> 1-tuple child `?(T,)` mismatch (note reworded). The obsolete diagnostic +> example 1195 was removed; see `examples/types/0201-types-parenthesized-type-grouping.sx`. > Verified by 3 adversarial reviews. (A review noted `?any` over-rejection; > that turned out to be a casing non-bug — lowercase `any` is an undefined name, > the type is `Any`; see 0171, closed NOT-A-BUG.) diff --git a/issues/0170-closure-optional-layout-truncated.md b/issues/0170-closure-optional-layout-truncated.md index 0fbd42a7..fea2c5ce 100644 --- a/issues/0170-closure-optional-layout-truncated.md +++ b/issues/0170-closure-optional-layout-truncated.md @@ -16,6 +16,12 @@ > `examples/closures/0311-closures-optional-closure.sx`. (Adjacent pre-existing > bug found + filed: 0177 — array-element closure direct call `fns[i](args)` > crashes.) +> +> **UPDATE (grouping):** with parenthesized-type grouping now in place, +> `?(() -> void)` parses as optional-of-(bare function pointer) `() -> void`, +> not a tuple-optional; assigning a closure literal to it correctly diagnoses the +> closure-vs-bare-fnptr mismatch (use `?Closure() -> void`). The `g!()` +> call-through fix here is unchanged and still correct for `?Closure(...)`. ## Symptom diff --git a/issues/0177-array-element-closure-direct-call-crashes.md b/issues/0177-array-element-closure-direct-call-crashes.md index c2f791f0..9f645f18 100644 --- a/issues/0177-array-element-closure-direct-call-crashes.md +++ b/issues/0177-array-element-closure-direct-call-crashes.md @@ -1,5 +1,19 @@ # 0177 — calling a closure stored in an array element directly (`fns[i](args)`) crashes / miscompiles +> **RESOLVED via parenthesized-type grouping.** The repro +> `[1](Closure(i64,i64) -> i64) = .[ add ]` was not an array of closures — under +> the old rule `(Closure(...) -> R)` was a 1-tuple, so it was an array of +> 1-tuples and `fns[0](...)` tried to call a tuple → LLVM "Called function must +> be a pointer!". Per the user's direction, parentheses in TYPE position are now +> a GROUPING (mirroring value position): `(T)` (no trailing comma) resolves to +> the inner type, `(T,)` is the 1-tuple. So `[1](Closure(...) -> R)` is now an +> array of closures and `fns[0](3,4)` returns `7`. (The canonical non-paren +> `[1]Closure(...) -> R = .[ add ]` already worked.) Implemented in +> `src/parser.zig` (single unnamed non-spread element, no trailing comma → +> return the inner type node). Regression: +> `examples/types/0201-types-parenthesized-type-grouping.sx`. specs.md §Type +> Syntax updated. Verified by 3 adversarial reviews; suite 792/0. + ## Symptom A closure (or `Closure(...)`-typed value) stored in an array, called DIRECTLY via diff --git a/specs.md b/specs.md index 13a4527b..5b8f9c22 100644 --- a/specs.md +++ b/specs.md @@ -840,13 +840,22 @@ zeroed : (i32, i32) = ---; // zero-initialized tuple Note: In value position, `(expr)` without a comma is a grouping expression, not a tuple. Use `(expr,)` for a 1-tuple value. #### Type Syntax -In type position, `(T)` is always a tuple type — no trailing comma needed. The `->` arrow disambiguates function types from tuple types: +In type position, parentheses mirror value position: `(T)` (a single element, no +trailing comma) is a **grouping** that resolves to the inner type `T`, while +`(T,)` (trailing comma) is a 1-tuple. `(A, B)` is a 2-tuple. The `->` arrow +disambiguates function types from grouped/tuple types: ```sx -(i64) // tuple type with one field +(i64) // grouping: resolves to i64 (NOT a tuple) +(i64,) // tuple type with one field (i64, i64) // tuple type with two fields (i64) -> i64 // function type: takes i64, returns i64 (i64, i64) -> i64 // function type: takes two i64, returns i64 +?(?i64) // grouping → a genuine nested optional +[1](Closure(i64,i64) -> i64) // grouping → array of one closure ``` +Grouping lets a closure/optional/function type be parenthesized for readability +without silently becoming a 1-tuple. A named single element `(x: T)` stays a +(named) tuple. #### Field Access ```sx @@ -859,7 +868,7 @@ named.0; // 10 — numeric index also works on named tuples #### As Return Type ```sx swap :: (a: i64, b: i64) -> (i64, i64) { (b, a); } -wrap :: (x: i64) -> (i64) { (x,); } +wrap :: (x: i64) -> (i64,) { (x,); } // 1-tuple return needs the trailing comma s := swap(1, 2); // s.0 = 2, s.1 = 1 t := wrap(42); // t.0 = 42 diff --git a/src/ir/lower/coerce.zig b/src/ir/lower/coerce.zig index 9654eb4c..4e6fc449 100644 --- a/src/ir/lower/coerce.zig +++ b/src/ir/lower/coerce.zig @@ -703,7 +703,7 @@ pub fn coerceMode(self: *Lowering, val: Ref, src_ty: TypeId, dst_ty: TypeId, mod // actually IS a tuple (the `?(?T)` typo); for any other // mismatch the parens note would be misleading. const note: []const u8 = if (self.module.types.get(child_ty) == .tuple) - " (note: in type position '(T)' is a single-field tuple, not a grouping — write the inner optional without parentheses)" + " (note: '(T,)' with a trailing comma is a 1-tuple; '(T)' without a comma groups to the inner type)" else ""; d.addFmt(.err, ast.Span{ .start = cs.start, .end = cs.end }, "cannot wrap a value of type '{s}' into optional '{s}': its payload type is '{s}'{s}", .{ self.formatTypeName(src_ty), self.formatTypeName(dst_ty), self.formatTypeName(child_ty), note }); diff --git a/src/ir/lower/generic.zig b/src/ir/lower/generic.zig index 5e12d242..d4e16d42 100644 --- a/src/ir/lower/generic.zig +++ b/src/ir/lower/generic.zig @@ -570,6 +570,10 @@ pub fn formatTypeName(self: *Lowering, ty: TypeId) []const u8 { } buf.appendSlice(self.alloc, self.formatTypeName(f)) catch break :blk "tuple"; } + // A 1-tuple renders with the trailing comma `(T,)` — `(T)` now means + // a grouping (the inner type), so the comma is required to spell a + // 1-tuple unambiguously (and keeps diagnostics self-consistent). + if (t.fields.len == 1) buf.append(self.alloc, ',') catch break :blk "tuple"; buf.append(self.alloc, ')') catch break :blk "tuple"; break :blk buf.toOwnedSlice(self.alloc) catch "tuple"; }, diff --git a/src/ir/lower/stmt.zig b/src/ir/lower/stmt.zig index 9217379b..f39d46c0 100644 --- a/src/ir/lower/stmt.zig +++ b/src/ir/lower/stmt.zig @@ -336,7 +336,7 @@ pub fn lowerVarDecl(self: *Lowering, vd: *const ast.VarDecl) void { // Only mention the `(T)`-is-a-1-tuple gotcha when the // payload actually IS a tuple (the `?(?T)` typo). const note: []const u8 = if (self.module.types.get(child) == .tuple) - " (note: in type position '(T)' is a single-field tuple, not a grouping — write the inner optional without parentheses)" + " (note: '(T,)' with a trailing comma is a 1-tuple; '(T)' without a comma groups to the inner type)" else ""; d.addFmt(.err, ast.Span{ .start = cs.start, .end = cs.end }, "cannot assign a value of type '{s}' to optional '{s}': its payload type is '{s}'{s}", .{ self.formatTypeName(post_rt), self.formatTypeName(ty), self.formatTypeName(child), note }); diff --git a/src/ir/types.zig b/src/ir/types.zig index a78873f7..d85f319e 100644 --- a/src/ir/types.zig +++ b/src/ir/types.zig @@ -1117,6 +1117,8 @@ pub const TypeTable = struct { if (i > 0) buf.appendSlice(alloc, ", ") catch break :blk "(?)"; buf.appendSlice(alloc, self.formatTypeName(alloc, f)) catch break :blk "(?)"; } + // 1-tuple renders `(T,)` — `(T)` now spells a grouping. + if (tu.fields.len == 1) buf.append(alloc, ',') catch break :blk "(?)"; buf.append(alloc, ')') catch break :blk "(?)"; break :blk buf.toOwnedSlice(alloc) catch "(?)"; }, diff --git a/src/parser.zig b/src/parser.zig index 5312d1b0..4e85ad3e 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -552,10 +552,17 @@ pub const Parser = struct { // An error channel type (`!` / `!Named`) is only valid as the // trailing element of a result list. Reject any element after it. var saw_error_type = false; + // Track an explicit trailing comma so a single-element `(T,)` stays a + // 1-tuple while `(T)` (no comma) is a GROUPING — see the grouping + // return below. + var had_trailing_comma = false; while (self.current.tag != .r_paren and self.current.tag != .eof) { if (param_types.items.len > 0) { try self.expect(.comma); - if (self.current.tag == .r_paren) break; // trailing comma ok + if (self.current.tag == .r_paren) { + had_trailing_comma = true; + break; // trailing comma ok + } } if (saw_error_type) { return self.fail("error type '!' must be the last element of a result list"); @@ -601,9 +608,21 @@ pub const Parser = struct { .abi = abi, } }); } - // No '->': tuple type (even for single element). Keep field names - // for a named tuple `(x: T, y: U)` so `t.x` resolves. `field_names` - // is non-optional per slot, so synthesize `_` for any unnamed one. + // No '->': GROUPING vs tuple. Mirror value position (`(expr)` groups, + // `(expr,)` is a 1-tuple): a single UNNAMED, non-spread element with + // NO trailing comma is a grouping — resolve to the inner type. This + // lets `(Closure(i64,i64) -> i64)`, `?(?i64)`, etc. parenthesize a + // type for grouping/readability. A 1-tuple type now requires the + // trailing comma `(T,)`; named `(x: T)` and spread `(..Ts)` stay + // tuples. + if (param_types.items.len == 1 and !had_trailing_comma and !has_names and + param_types.items[0].data != .spread_expr) + { + return param_types.items[0]; + } + // Tuple type. Keep field names for a named tuple `(x: T, y: U)` so + // `t.x` resolves. `field_names` is non-optional per slot, so + // synthesize `_` for any unnamed one. var field_names: ?[]const []const u8 = null; if (has_names) { var fns = std.ArrayList([]const u8).empty;