| ... | @@ -113,6 +113,7 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr | ... | @@ -113,6 +113,7 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr |
| 113 | .Period => return rlWrap(mod, scope, rl, try field(mod, scope, node.castTag(.Period).?)), | 113 | .Period => return rlWrap(mod, scope, rl, try field(mod, scope, node.castTag(.Period).?)), |
| 114 | .Deref => return rlWrap(mod, scope, rl, try deref(mod, scope, node.castTag(.Deref).?)), | 114 | .Deref => return rlWrap(mod, scope, rl, try deref(mod, scope, node.castTag(.Deref).?)), |
| 115 | .BoolNot => return rlWrap(mod, scope, rl, try boolNot(mod, scope, node.castTag(.BoolNot).?)), | 115 | .BoolNot => return rlWrap(mod, scope, rl, try boolNot(mod, scope, node.castTag(.BoolNot).?)), |
| | 116 | .AddressOf => return rlWrap(mod, scope, rl, try addressOf(mod, scope, node.castTag(.AddressOf).?)), |
| 116 | .FloatLiteral => return rlWrap(mod, scope, rl, try floatLiteral(mod, scope, node.castTag(.FloatLiteral).?)), | 117 | .FloatLiteral => return rlWrap(mod, scope, rl, try floatLiteral(mod, scope, node.castTag(.FloatLiteral).?)), |
| 117 | .UndefinedLiteral => return rlWrap(mod, scope, rl, try undefLiteral(mod, scope, node.castTag(.UndefinedLiteral).?)), | 118 | .UndefinedLiteral => return rlWrap(mod, scope, rl, try undefLiteral(mod, scope, node.castTag(.UndefinedLiteral).?)), |
| 118 | .BoolLiteral => return rlWrap(mod, scope, rl, try boolLiteral(mod, scope, node.castTag(.BoolLiteral).?)), | 119 | .BoolLiteral => return rlWrap(mod, scope, rl, try boolLiteral(mod, scope, node.castTag(.BoolLiteral).?)), |
| ... | @@ -122,6 +123,7 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr | ... | @@ -122,6 +123,7 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr |
| 122 | .Block => return rlWrapVoid(mod, scope, rl, node, try blockExpr(mod, scope, node.castTag(.Block).?)), | 123 | .Block => return rlWrapVoid(mod, scope, rl, node, try blockExpr(mod, scope, node.castTag(.Block).?)), |
| 123 | .LabeledBlock => return labeledBlockExpr(mod, scope, rl, node.castTag(.LabeledBlock).?), | 124 | .LabeledBlock => return labeledBlockExpr(mod, scope, rl, node.castTag(.LabeledBlock).?), |
| 124 | .Break => return rlWrap(mod, scope, rl, try breakExpr(mod, scope, node.castTag(.Break).?)), | 125 | .Break => return rlWrap(mod, scope, rl, try breakExpr(mod, scope, node.castTag(.Break).?)), |
| | 126 | .PtrType => return rlWrap(mod, scope, rl, try ptrType(mod, scope, node.castTag(.PtrType).?)), |
| 125 | | 127 | |
| 126 | .Defer => return mod.failNode(scope, node, "TODO implement astgen.expr for .Defer", .{}), | 128 | .Defer => return mod.failNode(scope, node, "TODO implement astgen.expr for .Defer", .{}), |
| 127 | .Catch => return mod.failNode(scope, node, "TODO implement astgen.expr for .Catch", .{}), | 129 | .Catch => return mod.failNode(scope, node, "TODO implement astgen.expr for .Catch", .{}), |
| ... | @@ -131,7 +133,6 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr | ... | @@ -131,7 +133,6 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr |
| 131 | .MergeErrorSets => return mod.failNode(scope, node, "TODO implement astgen.expr for .MergeErrorSets", .{}), | 133 | .MergeErrorSets => return mod.failNode(scope, node, "TODO implement astgen.expr for .MergeErrorSets", .{}), |
| 132 | .Range => return mod.failNode(scope, node, "TODO implement astgen.expr for .Range", .{}), | 134 | .Range => return mod.failNode(scope, node, "TODO implement astgen.expr for .Range", .{}), |
| 133 | .OrElse => return mod.failNode(scope, node, "TODO implement astgen.expr for .OrElse", .{}), | 135 | .OrElse => return mod.failNode(scope, node, "TODO implement astgen.expr for .OrElse", .{}), |
| 134 | .AddressOf => return mod.failNode(scope, node, "TODO implement astgen.expr for .AddressOf", .{}), | | |
| 135 | .Await => return mod.failNode(scope, node, "TODO implement astgen.expr for .Await", .{}), | 136 | .Await => return mod.failNode(scope, node, "TODO implement astgen.expr for .Await", .{}), |
| 136 | .BitNot => return mod.failNode(scope, node, "TODO implement astgen.expr for .BitNot", .{}), | 137 | .BitNot => return mod.failNode(scope, node, "TODO implement astgen.expr for .BitNot", .{}), |
| 137 | .Negation => return mod.failNode(scope, node, "TODO implement astgen.expr for .Negation", .{}), | 138 | .Negation => return mod.failNode(scope, node, "TODO implement astgen.expr for .Negation", .{}), |
| ... | @@ -140,7 +141,6 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr | ... | @@ -140,7 +141,6 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node) InnerEr |
| 140 | .Try => return mod.failNode(scope, node, "TODO implement astgen.expr for .Try", .{}), | 141 | .Try => return mod.failNode(scope, node, "TODO implement astgen.expr for .Try", .{}), |
| 141 | .ArrayType => return mod.failNode(scope, node, "TODO implement astgen.expr for .ArrayType", .{}), | 142 | .ArrayType => return mod.failNode(scope, node, "TODO implement astgen.expr for .ArrayType", .{}), |
| 142 | .ArrayTypeSentinel => return mod.failNode(scope, node, "TODO implement astgen.expr for .ArrayTypeSentinel", .{}), | 143 | .ArrayTypeSentinel => return mod.failNode(scope, node, "TODO implement astgen.expr for .ArrayTypeSentinel", .{}), |
| 143 | .PtrType => return mod.failNode(scope, node, "TODO implement astgen.expr for .PtrType", .{}), | | |
| 144 | .SliceType => return mod.failNode(scope, node, "TODO implement astgen.expr for .SliceType", .{}), | 144 | .SliceType => return mod.failNode(scope, node, "TODO implement astgen.expr for .SliceType", .{}), |
| 145 | .Slice => return mod.failNode(scope, node, "TODO implement astgen.expr for .Slice", .{}), | 145 | .Slice => return mod.failNode(scope, node, "TODO implement astgen.expr for .Slice", .{}), |
| 146 | .ArrayAccess => return mod.failNode(scope, node, "TODO implement astgen.expr for .ArrayAccess", .{}), | 146 | .ArrayAccess => return mod.failNode(scope, node, "TODO implement astgen.expr for .ArrayAccess", .{}), |
| ... | @@ -452,6 +452,12 @@ fn boolNot(mod: *Module, scope: *Scope, node: *ast.Node.SimplePrefixOp) InnerErr | ... | @@ -452,6 +452,12 @@ fn boolNot(mod: *Module, scope: *Scope, node: *ast.Node.SimplePrefixOp) InnerErr |
| 452 | return addZIRUnOp(mod, scope, src, .boolnot, operand); | 452 | return addZIRUnOp(mod, scope, src, .boolnot, operand); |
| 453 | } | 453 | } |
| 454 | | 454 | |
| | 455 | fn addressOf(mod: *Module, scope: *Scope, node: *ast.Node.SimplePrefixOp) InnerError!*zir.Inst { |
| | 456 | const tree = scope.tree(); |
| | 457 | const src = tree.token_locs[node.op_token].start; |
| | 458 | return expr(mod, scope, .lvalue, node.rhs); |
| | 459 | } |
| | 460 | |
| 455 | fn optionalType(mod: *Module, scope: *Scope, node: *ast.Node.SimplePrefixOp) InnerError!*zir.Inst { | 461 | fn optionalType(mod: *Module, scope: *Scope, node: *ast.Node.SimplePrefixOp) InnerError!*zir.Inst { |
| 456 | const tree = scope.tree(); | 462 | const tree = scope.tree(); |
| 457 | const src = tree.token_locs[node.op_token].start; | 463 | const src = tree.token_locs[node.op_token].start; |
| ... | @@ -463,6 +469,47 @@ fn optionalType(mod: *Module, scope: *Scope, node: *ast.Node.SimplePrefixOp) Inn | ... | @@ -463,6 +469,47 @@ fn optionalType(mod: *Module, scope: *Scope, node: *ast.Node.SimplePrefixOp) Inn |
| 463 | return addZIRUnOp(mod, scope, src, .optional_type, operand); | 469 | return addZIRUnOp(mod, scope, src, .optional_type, operand); |
| 464 | } | 470 | } |
| 465 | | 471 | |
| | 472 | fn ptrType(mod: *Module, scope: *Scope, node: *ast.Node.PtrType) InnerError!*zir.Inst { |
| | 473 | const tree = scope.tree(); |
| | 474 | const src = tree.token_locs[node.op_token].start; |
| | 475 | const meta_type = try addZIRInstConst(mod, scope, src, .{ |
| | 476 | .ty = Type.initTag(.type), |
| | 477 | .val = Value.initTag(.type_type), |
| | 478 | }); |
| | 479 | |
| | 480 | const simple = node.ptr_info.allowzero_token == null and |
| | 481 | node.ptr_info.align_info == null and |
| | 482 | node.ptr_info.volatile_token == null and |
| | 483 | node.ptr_info.sentinel == null; |
| | 484 | |
| | 485 | if (simple) { |
| | 486 | const child_type = try expr(mod, scope, .{ .ty = meta_type }, node.rhs); |
| | 487 | return addZIRUnOp(mod, scope, src, if (node.ptr_info.const_token == null) |
| | 488 | .single_mut_ptr_type |
| | 489 | else |
| | 490 | .single_const_ptr_type, child_type); |
| | 491 | } |
| | 492 | |
| | 493 | const child_type = try expr(mod, scope, .{ .ty = meta_type }, node.rhs); |
| | 494 | |
| | 495 | var kw_args: std.meta.fieldInfo(zir.Inst.PtrType, "kw_args").field_type = .{}; |
| | 496 | kw_args.@"allowzero" = node.ptr_info.allowzero_token != null; |
| | 497 | if (node.ptr_info.align_info) |some| { |
| | 498 | kw_args.@"align" = try expr(mod, scope, .none, some.node); |
| | 499 | if (some.bit_range) |bit_range| { |
| | 500 | kw_args.align_bit_start = try expr(mod, scope, .none, bit_range.start); |
| | 501 | kw_args.align_bit_end = try expr(mod, scope, .none, bit_range.end); |
| | 502 | } |
| | 503 | } |
| | 504 | kw_args.@"const" = node.ptr_info.const_token != null; |
| | 505 | kw_args.@"volatile" = node.ptr_info.volatile_token != null; |
| | 506 | if (node.ptr_info.sentinel) |some| { |
| | 507 | kw_args.sentinel = try expr(mod, scope, .{ .ty = child_type }, some); |
| | 508 | } |
| | 509 | |
| | 510 | return addZIRInst(mod, scope, src, zir.Inst.PtrType, .{ .child_type = child_type }, kw_args); |
| | 511 | } |
| | 512 | |
| 466 | fn unwrapOptional(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node.SimpleSuffixOp) InnerError!*zir.Inst { | 513 | fn unwrapOptional(mod: *Module, scope: *Scope, rl: ResultLoc, node: *ast.Node.SimpleSuffixOp) InnerError!*zir.Inst { |
| 467 | const tree = scope.tree(); | 514 | const tree = scope.tree(); |
| 468 | const src = tree.token_locs[node.rtoken].start; | 515 | const src = tree.token_locs[node.rtoken].start; |