| ... | ... | @@ -374,12 +374,10 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In |
| 374 | 374 | .bool_and => return boolBinOp(mod, scope, rl, node, true), |
| 375 | 375 | .bool_or => return boolBinOp(mod, scope, rl, node, false), |
| 376 | 376 | |
| 377 | | .bool_not => @panic("TODO"), |
| 378 | | .bit_not => @panic("TODO"), |
| 379 | 377 | .negation => @panic("TODO"), |
| 380 | 378 | .negation_wrap => @panic("TODO"), |
| 381 | | //.bool_not => return rvalue(mod, scope, rl, try boolNot(mod, scope, node)), |
| 382 | | //.bit_not => return rvalue(mod, scope, rl, try bitNot(mod, scope, node)), |
| 379 | .bool_not => return rvalue(mod, scope, rl, try boolNot(mod, scope, node), node), |
| 380 | .bit_not => return rvalue(mod, scope, rl, try bitNot(mod, scope, node), node), |
| 383 | 381 | //.negation => return rvalue(mod, scope, rl, try negation(mod, scope, node, .sub)), |
| 384 | 382 | //.negation_wrap => return rvalue(mod, scope, rl, try negation(mod, scope, node, .subwrap)), |
| 385 | 383 | |
| ... | ... | @@ -419,10 +417,8 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In |
| 419 | 417 | }, |
| 420 | 418 | |
| 421 | 419 | .unreachable_literal => { |
| 422 | | if (true) @panic("TODO update for zir-memory-layout"); |
| 423 | | const main_token = main_tokens[node]; |
| 424 | | const src = token_starts[main_token]; |
| 425 | | return addZIRNoOp(mod, scope, src, .unreachable_safe); |
| 420 | const result = @enumToInt(zir.Const.unreachable_value); |
| 421 | return rvalue(mod, scope, rl, result, node); |
| 426 | 422 | }, |
| 427 | 423 | .@"return" => return ret(mod, scope, node), |
| 428 | 424 | .field_access => return fieldAccess(mod, scope, rl, node), |
| ... | ... | @@ -470,30 +466,27 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In |
| 470 | 466 | return rvalue(mod, scope, rl, result, node); |
| 471 | 467 | }, |
| 472 | 468 | .optional_type => { |
| 473 | | if (true) @panic("TODO update for zir-memory-layout"); |
| 474 | | const src = token_starts[main_tokens[node]]; |
| 469 | const src_token = tree.firstToken(node); |
| 470 | |
| 475 | 471 | const operand = try typeExpr(mod, scope, node_datas[node].lhs); |
| 476 | | const result = try addZIRUnOp(mod, scope, src, .optional_type, operand); |
| 477 | | return rvalue(mod, scope, rl, result); |
| 472 | const result = try gz.addUnTok(.optional_type, operand, src_token); |
| 473 | return rvalue(mod, scope, rl, result, node); |
| 478 | 474 | }, |
| 479 | 475 | .unwrap_optional => { |
| 480 | | if (true) @panic("TODO update for zir-memory-layout"); |
| 476 | const src_token = tree.firstToken(node); |
| 477 | |
| 481 | 478 | const src = token_starts[main_tokens[node]]; |
| 482 | 479 | switch (rl) { |
| 483 | | .ref => return addZIRUnOp( |
| 484 | | mod, |
| 485 | | scope, |
| 486 | | src, |
| 480 | .ref => return gz.addUnTok( |
| 487 | 481 | .optional_payload_safe_ptr, |
| 488 | 482 | try expr(mod, scope, .ref, node_datas[node].lhs), |
| 483 | src_token, |
| 489 | 484 | ), |
| 490 | | else => return rvalue(mod, scope, rl, try addZIRUnOp( |
| 491 | | mod, |
| 492 | | scope, |
| 493 | | src, |
| 485 | else => return rvalue(mod, scope, rl, try gz.addUnTok( |
| 494 | 486 | .optional_payload_safe, |
| 495 | 487 | try expr(mod, scope, .none, node_datas[node].lhs), |
| 496 | | )), |
| 488 | src_token, |
| 489 | ), node), |
| 497 | 490 | } |
| 498 | 491 | }, |
| 499 | 492 | .block_two, .block_two_semicolon => { |
| ... | ... | @@ -1336,27 +1329,24 @@ fn assignOp( |
| 1336 | 1329 | fn boolNot(mod: *Module, scope: *Scope, node: ast.Node.Index) InnerError!zir.Inst.Ref { |
| 1337 | 1330 | const tree = scope.tree(); |
| 1338 | 1331 | const node_datas = tree.nodes.items(.data); |
| 1339 | | const main_tokens = tree.nodes.items(.main_token); |
| 1340 | | const token_starts = tree.tokens.items(.start); |
| 1332 | const src_token = tree.firstToken(node); |
| 1341 | 1333 | |
| 1342 | | const src = token_starts[main_tokens[node]]; |
| 1343 | | const bool_type = try addZIRInstConst(mod, scope, src, .{ |
| 1344 | | .ty = Type.initTag(.type), |
| 1345 | | .val = Value.initTag(.bool_type), |
| 1346 | | }); |
| 1347 | | const operand = try expr(mod, scope, .{ .ty = bool_type }, node_datas[node].lhs); |
| 1348 | | return addZIRUnOp(mod, scope, src, .bool_not, operand); |
| 1334 | const gz = scope.getGenZir(); |
| 1335 | |
| 1336 | const operand = try expr(mod, scope, .{ .ty = @enumToInt(zir.Const.bool_type) }, node_datas[node].lhs); |
| 1337 | |
| 1338 | return gz.addUnTok(.bool_not, operand, src_token); |
| 1349 | 1339 | } |
| 1350 | 1340 | |
| 1351 | 1341 | fn bitNot(mod: *Module, scope: *Scope, node: ast.Node.Index) InnerError!zir.Inst.Ref { |
| 1352 | 1342 | const tree = scope.tree(); |
| 1353 | 1343 | const node_datas = tree.nodes.items(.data); |
| 1354 | | const main_tokens = tree.nodes.items(.main_token); |
| 1355 | | const token_starts = tree.tokens.items(.start); |
| 1344 | const src_token = tree.firstToken(node); |
| 1345 | |
| 1346 | const gz = scope.getGenZir(); |
| 1356 | 1347 | |
| 1357 | | const src = token_starts[main_tokens[node]]; |
| 1358 | 1348 | const operand = try expr(mod, scope, .none, node_datas[node].lhs); |
| 1359 | | return addZIRUnOp(mod, scope, src, .bit_not, operand); |
| 1349 | return gz.addUnTok(.bit_not, operand, src_token); |
| 1360 | 1350 | } |
| 1361 | 1351 | |
| 1362 | 1352 | fn negation( |