@@ -64,7 +64,8 @@ pub fn run(
64
64
65
65
fn lowerExprAnonResTy (self : * LowerZon , node : Zoir.Node.Index ) CompileError ! InternPool.Index {
66
66
const gpa = self .sema .gpa ;
67
- const ip = & self .sema .pt .zcu .intern_pool ;
67
+ const pt = self .sema .pt ;
68
+ const ip = & pt .zcu .intern_pool ;
68
69
switch (node .get (self .file .zoir .? )) {
69
70
.true = > return .bool_true ,
70
71
.false = > return .bool_false ,
@@ -73,55 +74,75 @@ fn lowerExprAnonResTy(self: *LowerZon, node: Zoir.Node.Index) CompileError!Inter
73
74
.neg_inf = > return self .fail (node , "negative infinity requires a known result type" , .{}),
74
75
.nan = > return self .fail (node , "nan requires a known result type" , .{}),
75
76
.int_literal = > | int | switch (int ) {
76
- .small = > | val | return self . sema . pt .intern (.{ .int = .{
77
+ .small = > | val | return pt .intern (.{ .int = .{
77
78
.ty = .comptime_int_type ,
78
79
.storage = .{ .i64 = val },
79
80
} }),
80
- .big = > | val | return self . sema . pt .intern (.{ .int = .{
81
+ .big = > | val | return pt .intern (.{ .int = .{
81
82
.ty = .comptime_int_type ,
82
83
.storage = .{ .big_int = val },
83
84
} }),
84
85
},
85
86
.float_literal = > | val | {
86
- const result = try self . sema . pt .floatValue (.fromInterned (.comptime_float_type ), val );
87
+ const result = try pt .floatValue (.fromInterned (.comptime_float_type ), val );
87
88
return result .toIntern ();
88
89
},
89
- .char_literal = > | val | return self . sema . pt .intern (.{ .int = .{
90
+ .char_literal = > | val | return pt .intern (.{ .int = .{
90
91
.ty = .comptime_int_type ,
91
92
.storage = .{ .i64 = val },
92
93
} }),
93
- .enum_literal = > | val | return self . sema . pt .intern (.{
94
+ .enum_literal = > | val | return pt .intern (.{
94
95
.enum_literal = try ip .getOrPutString (
95
- self . sema . gpa ,
96
- self . sema . pt .tid ,
96
+ gpa ,
97
+ pt .tid ,
97
98
val .get (self .file .zoir .? ),
98
99
.no_embedded_nulls ,
99
100
),
100
101
}),
101
102
.string_literal = > | val | {
102
- const ip_str = try ip .getOrPutString (gpa , self . sema . pt .tid , val , .maybe_embedded_nulls );
103
+ const ip_str = try ip .getOrPutString (gpa , pt .tid , val , .maybe_embedded_nulls );
103
104
const result = try self .sema .addStrLit (ip_str , val .len );
104
105
return result .toInterned ().? ;
105
106
},
106
107
.empty_literal = > {
107
108
const ty = try ip .getTupleType (
108
109
gpa ,
109
- self . sema . pt .tid ,
110
+ pt .tid ,
110
111
.{
111
112
.types = &.{},
112
113
.values = &.{},
113
114
},
114
115
);
115
- return self . sema . pt .intern (.{ .aggregate = .{
116
+ return pt .intern (.{ .aggregate = .{
116
117
.ty = ty ,
117
118
.storage = .{ .elems = &.{} },
118
119
} });
119
120
},
120
- .array_literal , .struct_literal = > @panic ("unimplemented" ),
121
+ .array_literal = > | nodes | {
122
+ const types = try self .sema .arena .alloc (InternPool .Index , nodes .len );
123
+ const values = try self .sema .arena .alloc (InternPool .Index , nodes .len );
124
+ for (0.. nodes .len ) | i | {
125
+ values [i ] = try self .lowerExprAnonResTy (nodes .at (@intCast (i )));
126
+ types [i ] = Value .fromInterned (values [i ]).typeOf (pt .zcu ).toIntern ();
127
+ }
128
+ const ty = try ip .getTupleType (
129
+ gpa ,
130
+ pt .tid ,
131
+ .{
132
+ .types = types ,
133
+ .values = values ,
134
+ },
135
+ );
136
+ return pt .intern (.{ .aggregate = .{
137
+ .ty = ty ,
138
+ .storage = .{ .elems = values },
139
+ } });
140
+ },
141
+ .struct_literal = > @panic ("unimplemented" ),
121
142
}
122
143
}
123
144
124
- /// Validate that `ty` is a valid ZON type, or is `.none`. If it is not, emit a compile error.
145
+ /// Validate that `ty` is a valid ZON type, or emit a compile error.
125
146
///
126
147
/// Rules out nested optionals, error sets, etc.
127
148
fn checkType (self : * LowerZon , ty : Type ) ! void {
0 commit comments