| author | |
| committer | |
| log | c7b778992ec539e237d8afa7c105dcbad7ee280c |
| tree | d8e9e03fd9f84ad3a8a6439a82972806ed8bc914 |
| parent | ee651c3cd358f40f60db0bbcd82ffde99aed9b88 |
6 files changed, 57 insertions(+), 141 deletions(-)
src/AstGen.zig+30-84| ... | ... | @@ -1273,16 +1273,8 @@ fn arrayInitExpr( |
| 1273 | 1273 | |
| 1274 | 1274 | assert(array_init.ast.elements.len != 0); // Otherwise it would be struct init. |
| 1275 | 1275 | |
| 1276 | const types: struct { | |
| 1277 | array: Zir.Inst.Ref, | |
| 1278 | elem: Zir.Inst.Ref, | |
| 1279 | sentinel: Zir.Inst.Ref, | |
| 1280 | } = inst: { | |
| 1281 | if (array_init.ast.type_expr == 0) break :inst .{ | |
| 1282 | .array = .none, | |
| 1283 | .elem = .none, | |
| 1284 | .sentinel = .none, | |
| 1285 | }; | |
| 1276 | const array_ty: Zir.Inst.Ref = inst: { | |
| 1277 | if (array_init.ast.type_expr == 0) break :inst .none; | |
| 1286 | 1278 | |
| 1287 | 1279 | infer: { |
| 1288 | 1280 | const array_type: Ast.full.ArrayType = switch (node_tags[array_init.ast.type_expr]) { |
| ... | ... | @@ -1297,15 +1289,10 @@ fn arrayInitExpr( |
| 1297 | 1289 | const len_inst = try gz.addInt(array_init.ast.elements.len); |
| 1298 | 1290 | const elem_type = try typeExpr(gz, scope, array_type.ast.elem_type); |
| 1299 | 1291 | if (array_type.ast.sentinel == 0) { |
| 1300 | const array_type_inst = try gz.addBin(.array_type, len_inst, elem_type); | |
| 1301 | break :inst .{ | |
| 1302 | .array = array_type_inst, | |
| 1303 | .elem = elem_type, | |
| 1304 | .sentinel = .none, | |
| 1305 | }; | |
| 1292 | break :inst try gz.addBin(.array_type, len_inst, elem_type); | |
| 1306 | 1293 | } else { |
| 1307 | 1294 | const sentinel = try comptimeExpr(gz, scope, .{ .ty = elem_type }, array_type.ast.sentinel); |
| 1308 | const array_type_inst = try gz.addPlNode( | |
| 1295 | break :inst try gz.addPlNode( | |
| 1309 | 1296 | .array_type_sentinel, |
| 1310 | 1297 | array_init.ast.type_expr, |
| 1311 | 1298 | Zir.Inst.ArrayTypeSentinel{ |
| ... | ... | @@ -1314,76 +1301,57 @@ fn arrayInitExpr( |
| 1314 | 1301 | .sentinel = sentinel, |
| 1315 | 1302 | }, |
| 1316 | 1303 | ); |
| 1317 | break :inst .{ | |
| 1318 | .array = array_type_inst, | |
| 1319 | .elem = elem_type, | |
| 1320 | .sentinel = sentinel, | |
| 1321 | }; | |
| 1322 | 1304 | } |
| 1323 | 1305 | } |
| 1324 | 1306 | } |
| 1325 | 1307 | const array_type_inst = try typeExpr(gz, scope, array_init.ast.type_expr); |
| 1326 | 1308 | _ = try gz.addUnNode(.validate_array_init_ty, array_type_inst, node); |
| 1327 | const elem_type = try gz.addUnNode(.elem_type, array_type_inst, array_init.ast.type_expr); | |
| 1328 | break :inst .{ | |
| 1329 | .array = array_type_inst, | |
| 1330 | .elem = elem_type, | |
| 1331 | .sentinel = .none, | |
| 1332 | }; | |
| 1309 | break :inst array_type_inst; | |
| 1333 | 1310 | }; |
| 1334 | 1311 | |
| 1335 | 1312 | switch (rl) { |
| 1336 | 1313 | .discard => { |
| 1314 | // TODO elements should still be coerced if type is provided | |
| 1337 | 1315 | for (array_init.ast.elements) |elem_init| { |
| 1338 | 1316 | _ = try expr(gz, scope, .discard, elem_init); |
| 1339 | 1317 | } |
| 1340 | 1318 | return Zir.Inst.Ref.void_value; |
| 1341 | 1319 | }, |
| 1342 | 1320 | .ref => { |
| 1343 | if (types.array != .none) { | |
| 1344 | return arrayInitExprRlTy(gz, scope, node, array_init.ast.elements, types.elem, types.sentinel, true); | |
| 1345 | } else { | |
| 1346 | return arrayInitExprRlNone(gz, scope, node, array_init.ast.elements, .array_init_anon_ref); | |
| 1347 | } | |
| 1321 | const tag: Zir.Inst.Tag = if (array_ty != .none) .array_init_ref else .array_init_anon_ref; | |
| 1322 | return arrayInitExprInner(gz, scope, node, array_init.ast.elements, array_ty, tag); | |
| 1348 | 1323 | }, |
| 1349 | 1324 | .none => { |
| 1350 | if (types.array != .none) { | |
| 1351 | return arrayInitExprRlTy(gz, scope, node, array_init.ast.elements, types.elem, types.sentinel, false); | |
| 1352 | } else { | |
| 1353 | return arrayInitExprRlNone(gz, scope, node, array_init.ast.elements, .array_init_anon); | |
| 1354 | } | |
| 1325 | const tag: Zir.Inst.Tag = if (array_ty != .none) .array_init else .array_init_anon; | |
| 1326 | return arrayInitExprInner(gz, scope, node, array_init.ast.elements, array_ty, tag); | |
| 1355 | 1327 | }, |
| 1356 | 1328 | .ty, .coerced_ty => { |
| 1357 | if (types.array != .none) { | |
| 1358 | const result = try arrayInitExprRlTy(gz, scope, node, array_init.ast.elements, types.elem, types.sentinel, false); | |
| 1359 | return rvalue(gz, rl, result, node); | |
| 1360 | } else { | |
| 1361 | const result = try arrayInitExprRlNone(gz, scope, node, array_init.ast.elements, .array_init_anon); | |
| 1362 | return rvalue(gz, rl, result, node); | |
| 1363 | } | |
| 1329 | const tag: Zir.Inst.Tag = if (array_ty != .none) .array_init else .array_init_anon; | |
| 1330 | const result = try arrayInitExprInner(gz, scope, node, array_init.ast.elements, array_ty, tag); | |
| 1331 | return rvalue(gz, rl, result, node); | |
| 1364 | 1332 | }, |
| 1365 | 1333 | .ptr => |ptr_inst| { |
| 1366 | return arrayInitExprRlPtr(gz, scope, rl, node, ptr_inst, array_init.ast.elements, types.array); | |
| 1334 | return arrayInitExprRlPtr(gz, scope, rl, node, ptr_inst, array_init.ast.elements, array_ty); | |
| 1367 | 1335 | }, |
| 1368 | 1336 | .inferred_ptr => |ptr_inst| { |
| 1369 | if (types.array == .none) { | |
| 1337 | if (array_ty == .none) { | |
| 1370 | 1338 | // We treat this case differently so that we don't get a crash when |
| 1371 | 1339 | // analyzing array_base_ptr against an alloc_inferred_mut. |
| 1372 | 1340 | // See corresponding logic in structInitExpr. |
| 1373 | 1341 | const result = try arrayInitExprRlNone(gz, scope, node, array_init.ast.elements, .array_init_anon); |
| 1374 | 1342 | return rvalue(gz, rl, result, node); |
| 1375 | 1343 | } else { |
| 1376 | return arrayInitExprRlPtr(gz, scope, rl, node, ptr_inst, array_init.ast.elements, types.array); | |
| 1344 | return arrayInitExprRlPtr(gz, scope, rl, node, ptr_inst, array_init.ast.elements, array_ty); | |
| 1377 | 1345 | } |
| 1378 | 1346 | }, |
| 1379 | 1347 | .block_ptr => |block_gz| { |
| 1380 | 1348 | // This condition is here for the same reason as the above condition in `inferred_ptr`. |
| 1381 | 1349 | // See corresponding logic in structInitExpr. |
| 1382 | if (types.array == .none and astgen.isInferred(block_gz.rl_ptr)) { | |
| 1350 | if (array_ty == .none and astgen.isInferred(block_gz.rl_ptr)) { | |
| 1383 | 1351 | const result = try arrayInitExprRlNone(gz, scope, node, array_init.ast.elements, .array_init_anon); |
| 1384 | 1352 | return rvalue(gz, rl, result, node); |
| 1385 | 1353 | } |
| 1386 | return arrayInitExprRlPtr(gz, scope, rl, node, block_gz.rl_ptr, array_init.ast.elements, types.array); | |
| 1354 | return arrayInitExprRlPtr(gz, scope, rl, node, block_gz.rl_ptr, array_init.ast.elements, array_ty); | |
| 1387 | 1355 | }, |
| 1388 | 1356 | } |
| 1389 | 1357 | } |
| ... | ... | @@ -1410,52 +1378,33 @@ fn arrayInitExprRlNone( |
| 1410 | 1378 | return try gz.addPlNodePayloadIndex(tag, node, payload_index); |
| 1411 | 1379 | } |
| 1412 | 1380 | |
| 1413 | fn arrayInitExprRlTy( | |
| 1381 | fn arrayInitExprInner( | |
| 1414 | 1382 | gz: *GenZir, |
| 1415 | 1383 | scope: *Scope, |
| 1416 | 1384 | node: Ast.Node.Index, |
| 1417 | 1385 | elements: []const Ast.Node.Index, |
| 1418 | elem_ty_inst: Zir.Inst.Ref, | |
| 1419 | sentinel: Zir.Inst.Ref, | |
| 1420 | ref: bool, | |
| 1386 | array_ty_inst: Zir.Inst.Ref, | |
| 1387 | tag: Zir.Inst.Tag, | |
| 1421 | 1388 | ) InnerError!Zir.Inst.Ref { |
| 1422 | 1389 | const astgen = gz.astgen; |
| 1423 | 1390 | |
| 1424 | const info: struct { | |
| 1425 | len: usize, | |
| 1426 | tag: Zir.Inst.Tag, | |
| 1427 | } = blk: { | |
| 1428 | if (sentinel != .none) { | |
| 1429 | break :blk .{ | |
| 1430 | .len = elements.len + 1, | |
| 1431 | .tag = if (ref) .array_init_sent_ref else .array_init_sent, | |
| 1432 | }; | |
| 1433 | } else { | |
| 1434 | break :blk .{ | |
| 1435 | .len = elements.len, | |
| 1436 | .tag = if (ref) .array_init_ref else .array_init, | |
| 1437 | }; | |
| 1438 | } | |
| 1439 | }; | |
| 1440 | ||
| 1391 | const len = elements.len + @boolToInt(array_ty_inst != .none); | |
| 1441 | 1392 | const payload_index = try addExtra(astgen, Zir.Inst.MultiOp{ |
| 1442 | .operands_len = @intCast(u32, info.len), | |
| 1393 | .operands_len = @intCast(u32, len), | |
| 1443 | 1394 | }); |
| 1444 | var extra_index = try reserveExtra(astgen, info.len); | |
| 1445 | ||
| 1446 | const elem_rl: ResultLoc = .{ .ty = elem_ty_inst }; | |
| 1447 | for (elements) |elem_init| { | |
| 1448 | const elem_ref = try expr(gz, scope, elem_rl, elem_init); | |
| 1449 | astgen.extra.items[extra_index] = @enumToInt(elem_ref); | |
| 1395 | var extra_index = try reserveExtra(astgen, len); | |
| 1396 | if (array_ty_inst != .none) { | |
| 1397 | astgen.extra.items[extra_index] = @enumToInt(array_ty_inst); | |
| 1450 | 1398 | extra_index += 1; |
| 1451 | 1399 | } |
| 1452 | 1400 | |
| 1453 | if (sentinel != .none) { | |
| 1454 | astgen.extra.items[extra_index] = @enumToInt(sentinel); | |
| 1401 | for (elements) |elem_init| { | |
| 1402 | const elem_ref = try expr(gz, scope, .none, elem_init); | |
| 1403 | astgen.extra.items[extra_index] = @enumToInt(elem_ref); | |
| 1455 | 1404 | extra_index += 1; |
| 1456 | 1405 | } |
| 1457 | 1406 | |
| 1458 | return try gz.addPlNodePayloadIndex(info.tag, node, payload_index); | |
| 1407 | return try gz.addPlNodePayloadIndex(tag, node, payload_index); | |
| 1459 | 1408 | } |
| 1460 | 1409 | |
| 1461 | 1410 | fn arrayInitExprRlPtr( |
| ... | ... | @@ -2244,7 +2193,6 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) Inner |
| 2244 | 2193 | .array_type, |
| 2245 | 2194 | .array_type_sentinel, |
| 2246 | 2195 | .vector_type, |
| 2247 | .elem_type, | |
| 2248 | 2196 | .indexable_ptr_len, |
| 2249 | 2197 | .anyframe_type, |
| 2250 | 2198 | .as, |
| ... | ... | @@ -2347,10 +2295,8 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) Inner |
| 2347 | 2295 | .struct_init_anon_ref, |
| 2348 | 2296 | .array_init, |
| 2349 | 2297 | .array_init_anon, |
| 2350 | .array_init_sent, | |
| 2351 | 2298 | .array_init_ref, |
| 2352 | 2299 | .array_init_anon_ref, |
| 2353 | .array_init_sent_ref, | |
| 2354 | 2300 | .union_init, |
| 2355 | 2301 | .field_type, |
| 2356 | 2302 | .field_type_ref, |
src/Sema.zig+17-28| ... | ... | @@ -726,7 +726,6 @@ fn analyzeBodyInner( |
| 726 | 726 | .elem_ptr_imm => try sema.zirElemPtrImm(block, inst), |
| 727 | 727 | .elem_val => try sema.zirElemVal(block, inst), |
| 728 | 728 | .elem_val_node => try sema.zirElemValNode(block, inst), |
| 729 | .elem_type => try sema.zirElemType(block, inst), | |
| 730 | 729 | .enum_literal => try sema.zirEnumLiteral(block, inst), |
| 731 | 730 | .enum_to_int => try sema.zirEnumToInt(block, inst), |
| 732 | 731 | .int_to_enum => try sema.zirIntToEnum(block, inst), |
| ... | ... | @@ -798,10 +797,8 @@ fn analyzeBodyInner( |
| 798 | 797 | .struct_init_ref => try sema.zirStructInit(block, inst, true), |
| 799 | 798 | .struct_init_anon => try sema.zirStructInitAnon(block, inst, false), |
| 800 | 799 | .struct_init_anon_ref => try sema.zirStructInitAnon(block, inst, true), |
| 801 | .array_init => try sema.zirArrayInit(block, inst, false, false), | |
| 802 | .array_init_sent => try sema.zirArrayInit(block, inst, false, true), | |
| 803 | .array_init_ref => try sema.zirArrayInit(block, inst, true, false), | |
| 804 | .array_init_sent_ref => try sema.zirArrayInit(block, inst, true, true), | |
| 800 | .array_init => try sema.zirArrayInit(block, inst, false), | |
| 801 | .array_init_ref => try sema.zirArrayInit(block, inst, true), | |
| 805 | 802 | .array_init_anon => try sema.zirArrayInitAnon(block, inst, false), |
| 806 | 803 | .array_init_anon_ref => try sema.zirArrayInitAnon(block, inst, true), |
| 807 | 804 | .union_init => try sema.zirUnionInit(block, inst), |
| ... | ... | @@ -13436,7 +13433,6 @@ fn zirArrayInit( |
| 13436 | 13433 | block: *Block, |
| 13437 | 13434 | inst: Zir.Inst.Index, |
| 13438 | 13435 | is_ref: bool, |
| 13439 | is_sent: bool, | |
| 13440 | 13436 | ) CompileError!Air.Inst.Ref { |
| 13441 | 13437 | const gpa = sema.gpa; |
| 13442 | 13438 | const inst_data = sema.code.instructions.items(.data)[inst].pl_node; |
| ... | ... | @@ -13444,30 +13440,23 @@ fn zirArrayInit( |
| 13444 | 13440 | |
| 13445 | 13441 | const extra = sema.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index); |
| 13446 | 13442 | const args = sema.code.refSlice(extra.end, extra.data.operands_len); |
| 13447 | assert(args.len != 0); | |
| 13443 | assert(args.len >= 2); // array_ty + at least one element | |
| 13448 | 13444 | |
| 13449 | const resolved_args = try gpa.alloc(Air.Inst.Ref, args.len); | |
| 13450 | defer gpa.free(resolved_args); | |
| 13451 | ||
| 13452 | for (args) |arg, i| resolved_args[i] = try sema.resolveInst(arg); | |
| 13445 | const array_ty = try sema.resolveType(block, src, args[0]); | |
| 13446 | const sentinel_val = array_ty.sentinel(); | |
| 13453 | 13447 | |
| 13454 | const elem_ty = sema.typeOf(resolved_args[0]); | |
| 13455 | const array_ty = blk: { | |
| 13456 | if (!is_sent) { | |
| 13457 | break :blk try Type.Tag.array.create(sema.arena, .{ | |
| 13458 | .len = resolved_args.len, | |
| 13459 | .elem_type = elem_ty, | |
| 13460 | }); | |
| 13461 | } | |
| 13448 | const resolved_args = try gpa.alloc(Air.Inst.Ref, args.len - 1 + @boolToInt(sentinel_val != null)); | |
| 13449 | defer gpa.free(resolved_args); | |
| 13450 | const elem_ty = array_ty.elemType2(); | |
| 13451 | for (args[1..]) |arg, i| { | |
| 13452 | const resolved_arg = try sema.resolveInst(arg); | |
| 13453 | const arg_src = src; // TODO better source location | |
| 13454 | resolved_args[i] = try sema.coerce(block, elem_ty, resolved_arg, arg_src); | |
| 13455 | } | |
| 13462 | 13456 | |
| 13463 | const sentinel_ref = resolved_args[resolved_args.len - 1]; | |
| 13464 | const val = try sema.resolveConstValue(block, src, sentinel_ref); | |
| 13465 | break :blk try Type.Tag.array_sentinel.create(sema.arena, .{ | |
| 13466 | .len = resolved_args.len - 1, | |
| 13467 | .sentinel = val, | |
| 13468 | .elem_type = elem_ty, | |
| 13469 | }); | |
| 13470 | }; | |
| 13457 | if (sentinel_val) |some| { | |
| 13458 | resolved_args[resolved_args.len - 1] = try sema.addConstant(elem_ty, some); | |
| 13459 | } | |
| 13471 | 13460 | |
| 13472 | 13461 | const opt_runtime_src: ?LazySrcLoc = for (resolved_args) |arg| { |
| 13473 | 13462 | const arg_src = src; // TODO better source location |
| ... | ... | @@ -13488,7 +13477,7 @@ fn zirArrayInit( |
| 13488 | 13477 | }; |
| 13489 | 13478 | |
| 13490 | 13479 | try sema.requireRuntimeBlock(block, runtime_src); |
| 13491 | try sema.queueFullTypeResolution(elem_ty); | |
| 13480 | try sema.queueFullTypeResolution(array_ty); | |
| 13492 | 13481 | |
| 13493 | 13482 | if (is_ref) { |
| 13494 | 13483 | const target = sema.mod.getTarget(); |
src/Zir.zig-20| ... | ... | @@ -221,9 +221,6 @@ pub const Inst = struct { |
| 221 | 221 | /// Uses the `pl_node` union field with `Bin` payload. |
| 222 | 222 | /// lhs is length, rhs is element type. |
| 223 | 223 | vector_type, |
| 224 | /// Given an array type, returns the element type. | |
| 225 | /// Uses the `un_node` union field. | |
| 226 | elem_type, | |
| 227 | 224 | /// Given a pointer to an indexable object, returns the len property. This is |
| 228 | 225 | /// used by for loops. This instruction also emits a for-loop specific compile |
| 229 | 226 | /// error if the indexable object is not indexable. |
| ... | ... | @@ -737,20 +734,12 @@ pub const Inst = struct { |
| 737 | 734 | /// Array initialization syntax. |
| 738 | 735 | /// Uses the `pl_node` field. Payload is `MultiOp`. |
| 739 | 736 | array_init, |
| 740 | /// Array initialization with sentinel. | |
| 741 | /// Uses the `pl_node` field. Payload is `MultiOp`. | |
| 742 | /// Final op in MultiOp is the sentinel. | |
| 743 | array_init_sent, | |
| 744 | 737 | /// Anonymous array initialization syntax. |
| 745 | 738 | /// Uses the `pl_node` field. Payload is `MultiOp`. |
| 746 | 739 | array_init_anon, |
| 747 | 740 | /// Array initialization syntax, make the result a pointer. |
| 748 | 741 | /// Uses the `pl_node` field. Payload is `MultiOp`. |
| 749 | 742 | array_init_ref, |
| 750 | /// Array initialization with sentinel. | |
| 751 | /// Uses the `pl_node` field. Payload is `MultiOp`. | |
| 752 | /// Final op in MultiOp is the sentinel. | |
| 753 | array_init_sent_ref, | |
| 754 | 743 | /// Anonymous array initialization syntax, make the result a pointer. |
| 755 | 744 | /// Uses the `pl_node` field. Payload is `MultiOp`. |
| 756 | 745 | array_init_anon_ref, |
| ... | ... | @@ -1019,7 +1008,6 @@ pub const Inst = struct { |
| 1019 | 1008 | .array_type, |
| 1020 | 1009 | .array_type_sentinel, |
| 1021 | 1010 | .vector_type, |
| 1022 | .elem_type, | |
| 1023 | 1011 | .indexable_ptr_len, |
| 1024 | 1012 | .anyframe_type, |
| 1025 | 1013 | .as, |
| ... | ... | @@ -1153,10 +1141,8 @@ pub const Inst = struct { |
| 1153 | 1141 | .struct_init_anon, |
| 1154 | 1142 | .struct_init_anon_ref, |
| 1155 | 1143 | .array_init, |
| 1156 | .array_init_sent, | |
| 1157 | 1144 | .array_init_anon, |
| 1158 | 1145 | .array_init_ref, |
| 1159 | .array_init_sent_ref, | |
| 1160 | 1146 | .array_init_anon_ref, |
| 1161 | 1147 | .union_init, |
| 1162 | 1148 | .field_type, |
| ... | ... | @@ -1314,7 +1300,6 @@ pub const Inst = struct { |
| 1314 | 1300 | .array_type, |
| 1315 | 1301 | .array_type_sentinel, |
| 1316 | 1302 | .vector_type, |
| 1317 | .elem_type, | |
| 1318 | 1303 | .indexable_ptr_len, |
| 1319 | 1304 | .anyframe_type, |
| 1320 | 1305 | .as, |
| ... | ... | @@ -1426,10 +1411,8 @@ pub const Inst = struct { |
| 1426 | 1411 | .struct_init_anon, |
| 1427 | 1412 | .struct_init_anon_ref, |
| 1428 | 1413 | .array_init, |
| 1429 | .array_init_sent, | |
| 1430 | 1414 | .array_init_anon, |
| 1431 | 1415 | .array_init_ref, |
| 1432 | .array_init_sent_ref, | |
| 1433 | 1416 | .array_init_anon_ref, |
| 1434 | 1417 | .union_init, |
| 1435 | 1418 | .field_type, |
| ... | ... | @@ -1554,7 +1537,6 @@ pub const Inst = struct { |
| 1554 | 1537 | .array_type = .bin, |
| 1555 | 1538 | .array_type_sentinel = .pl_node, |
| 1556 | 1539 | .vector_type = .pl_node, |
| 1557 | .elem_type = .un_node, | |
| 1558 | 1540 | .indexable_ptr_len = .un_node, |
| 1559 | 1541 | .anyframe_type = .un_node, |
| 1560 | 1542 | .as = .bin, |
| ... | ... | @@ -1688,10 +1670,8 @@ pub const Inst = struct { |
| 1688 | 1670 | .struct_init_anon = .pl_node, |
| 1689 | 1671 | .struct_init_anon_ref = .pl_node, |
| 1690 | 1672 | .array_init = .pl_node, |
| 1691 | .array_init_sent = .pl_node, | |
| 1692 | 1673 | .array_init_anon = .pl_node, |
| 1693 | 1674 | .array_init_ref = .pl_node, |
| 1694 | .array_init_sent_ref = .pl_node, | |
| 1695 | 1675 | .array_init_anon_ref = .pl_node, |
| 1696 | 1676 | .union_init = .pl_node, |
| 1697 | 1677 | .type_info = .un_node, |
src/print_zir.zig+3-7| ... | ... | @@ -226,7 +226,6 @@ const Writer = struct { |
| 226 | 226 | .pop_count, |
| 227 | 227 | .byte_swap, |
| 228 | 228 | .bit_reverse, |
| 229 | .elem_type, | |
| 230 | 229 | .@"resume", |
| 231 | 230 | .@"await", |
| 232 | 231 | .switch_cond, |
| ... | ... | @@ -268,10 +267,6 @@ const Writer = struct { |
| 268 | 267 | .array_init_anon_ref, |
| 269 | 268 | => try self.writeArrayInit(stream, inst), |
| 270 | 269 | |
| 271 | .array_init_sent, | |
| 272 | .array_init_sent_ref, | |
| 273 | => try self.writeArrayInitSent(stream, inst), | |
| 274 | ||
| 275 | 270 | .slice_start => try self.writeSliceStart(stream, inst), |
| 276 | 271 | .slice_end => try self.writeSliceEnd(stream, inst), |
| 277 | 272 | .slice_sentinel => try self.writeSliceSentinel(stream, inst), |
| ... | ... | @@ -2085,8 +2080,9 @@ const Writer = struct { |
| 2085 | 2080 | const extra = self.code.extraData(Zir.Inst.MultiOp, inst_data.payload_index); |
| 2086 | 2081 | const args = self.code.refSlice(extra.end, extra.data.operands_len); |
| 2087 | 2082 | |
| 2088 | try stream.writeAll(".{"); | |
| 2089 | for (args) |arg, i| { | |
| 2083 | try self.writeInstRef(stream, args[0]); | |
| 2084 | try stream.writeAll("{"); | |
| 2085 | for (args[1..]) |arg, i| { | |
| 2090 | 2086 | if (i != 0) try stream.writeAll(", "); |
| 2091 | 2087 | try self.writeInstRef(stream, arg); |
| 2092 | 2088 | } |
test/behavior/basic.zig+7| ... | ... | @@ -942,3 +942,10 @@ test "comptime int in switch in catch is casted to correct inferred type" { |
| 942 | 942 | }; |
| 943 | 943 | _ = b; |
| 944 | 944 | } |
| 945 | ||
| 946 | test "vector initialized with array init syntax has proper type" { | |
| 947 | comptime { | |
| 948 | const actual = -@Vector(4, i32){ 1, 2, 3, 4 }; | |
| 949 | try std.testing.expectEqual(@Vector(4, i32){ -1, -2, -3, -4 }, actual); | |
| 950 | } | |
| 951 | } |
test/behavior/tuple.zig-2| ... | ... | @@ -194,8 +194,6 @@ test "tuple as the result from a labeled block" { |
| 194 | 194 | } |
| 195 | 195 | |
| 196 | 196 | test "initializing tuple with explicit type" { |
| 197 | if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO | |
| 198 | ||
| 199 | 197 | const T = @TypeOf(.{ @as(i32, 0), @as(u32, 0) }); |
| 200 | 198 | var a = T{ 0, 0 }; |
| 201 | 199 | _ = a; |