mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 12:59:04 +00:00
Module: add .node_offset_un_op
This commit is contained in:
parent
89cef9f5f7
commit
2ca752ea1a
@ -812,7 +812,7 @@ fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: Ast.Node.Index) InnerEr
|
||||
|
||||
.deref => {
|
||||
const lhs = try expr(gz, scope, .none, node_datas[node].lhs);
|
||||
_ = try gz.addUnTok(.validate_deref, lhs, main_tokens[node]);
|
||||
_ = try gz.addUnNode(.validate_deref, lhs, node);
|
||||
switch (rl) {
|
||||
.ref => return lhs,
|
||||
else => {
|
||||
|
||||
@ -2501,6 +2501,16 @@ pub const SrcLoc = struct {
|
||||
const token_starts = tree.tokens.items(.start);
|
||||
return token_starts[tok_index];
|
||||
},
|
||||
.node_offset_un_op => |node_off| {
|
||||
const tree = try src_loc.file_scope.getTree(gpa);
|
||||
const node_datas = tree.nodes.items(.data);
|
||||
const node = src_loc.declRelativeToNodeIndex(node_off);
|
||||
|
||||
const main_tokens = tree.nodes.items(.main_token);
|
||||
const tok_index = main_tokens[node_datas[node].lhs];
|
||||
const token_starts = tree.tokens.items(.start);
|
||||
return token_starts[tok_index];
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@ -2728,6 +2738,9 @@ pub const LazySrcLoc = union(enum) {
|
||||
/// to the elem expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_type_elem: i32,
|
||||
/// The source location points to the operand of an unary expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_un_op: i32,
|
||||
|
||||
pub const nodeOffset = if (TracedOffset.want_tracing) nodeOffsetDebug else nodeOffsetRelease;
|
||||
|
||||
@ -2788,6 +2801,7 @@ pub const LazySrcLoc = union(enum) {
|
||||
.node_offset_array_type_len,
|
||||
.node_offset_array_type_sentinel,
|
||||
.node_offset_array_type_elem,
|
||||
.node_offset_un_op,
|
||||
=> .{
|
||||
.file_scope = decl.getFileScope(),
|
||||
.parent_decl_node = decl.src_node,
|
||||
|
||||
12
src/Sema.zig
12
src/Sema.zig
@ -3867,9 +3867,9 @@ fn zirValidateArrayInit(
|
||||
}
|
||||
|
||||
fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!void {
|
||||
const inst_data = sema.code.instructions.items(.data)[inst].un_tok;
|
||||
const inst_data = sema.code.instructions.items(.data)[inst].un_node;
|
||||
const src = inst_data.src();
|
||||
const operand_src: LazySrcLoc = .{ .token_offset = inst_data.src_tok + 1 };
|
||||
const operand_src: LazySrcLoc = .{ .node_offset_un_op = inst_data.src_node };
|
||||
const operand = try sema.resolveInst(inst_data.operand);
|
||||
const operand_ty = sema.typeOf(operand);
|
||||
|
||||
@ -9758,7 +9758,7 @@ fn zirBitNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
|
||||
|
||||
const inst_data = sema.code.instructions.items(.data)[inst].un_node;
|
||||
const src = inst_data.src();
|
||||
const operand_src = src; // TODO put this on the operand, not the '~'
|
||||
const operand_src: LazySrcLoc = .{ .node_offset_un_op = inst_data.src_node };
|
||||
|
||||
const operand = try sema.resolveInst(inst_data.operand);
|
||||
const operand_type = sema.typeOf(operand);
|
||||
@ -10257,7 +10257,7 @@ fn zirNegate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.
|
||||
const inst_data = sema.code.instructions.items(.data)[inst].un_node;
|
||||
const src = inst_data.src();
|
||||
const lhs_src = src;
|
||||
const rhs_src = src; // TODO better source location
|
||||
const rhs_src: LazySrcLoc = .{ .node_offset_un_op = inst_data.src_node };
|
||||
|
||||
const rhs = try sema.resolveInst(inst_data.operand);
|
||||
const rhs_ty = sema.typeOf(rhs);
|
||||
@ -10293,7 +10293,7 @@ fn zirNegateWrap(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!
|
||||
const inst_data = sema.code.instructions.items(.data)[inst].un_node;
|
||||
const src = inst_data.src();
|
||||
const lhs_src = src;
|
||||
const rhs_src = src; // TODO better source location
|
||||
const rhs_src: LazySrcLoc = .{ .node_offset_un_op = inst_data.src_node };
|
||||
|
||||
const rhs = try sema.resolveInst(inst_data.operand);
|
||||
const rhs_ty = sema.typeOf(rhs);
|
||||
@ -13159,7 +13159,7 @@ fn zirBoolNot(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
|
||||
|
||||
const inst_data = sema.code.instructions.items(.data)[inst].un_node;
|
||||
const src = inst_data.src();
|
||||
const operand_src = src; // TODO put this on the operand, not the `!`
|
||||
const operand_src: LazySrcLoc = .{ .node_offset_un_op = inst_data.src_node };
|
||||
const uncasted_operand = try sema.resolveInst(inst_data.operand);
|
||||
|
||||
const operand = try sema.coerce(block, Type.bool, uncasted_operand, operand_src);
|
||||
|
||||
@ -244,7 +244,7 @@ pub const Inst = struct {
|
||||
/// Uses the pl_node field with payload `Bin`.
|
||||
bitcast,
|
||||
/// Bitwise NOT. `~`
|
||||
/// Uses `un_node`.
|
||||
/// Uses `un_tok`.
|
||||
bit_not,
|
||||
/// Bitwise OR. `|`
|
||||
bit_or,
|
||||
@ -260,7 +260,7 @@ pub const Inst = struct {
|
||||
/// Uses the `pl_node` union field. Payload is `Block`.
|
||||
suspend_block,
|
||||
/// Boolean NOT. See also `bit_not`.
|
||||
/// Uses the `un_node` field.
|
||||
/// Uses the `un_tok` field.
|
||||
bool_not,
|
||||
/// Short-circuiting boolean `and`. `lhs` is a boolean `Ref` and the other operand
|
||||
/// is a block, which is evaluated if `lhs` is `true`.
|
||||
@ -729,7 +729,7 @@ pub const Inst = struct {
|
||||
/// resulting array initialization value is within a comptime scope.
|
||||
validate_array_init_comptime,
|
||||
/// Check that operand type supports the dereference operand (.*).
|
||||
/// Uses the `un_tok` field.
|
||||
/// Uses the `un_node` field.
|
||||
validate_deref,
|
||||
/// A struct literal with a specified type, with no fields.
|
||||
/// Uses the `un_node` field.
|
||||
@ -1704,7 +1704,7 @@ pub const Inst = struct {
|
||||
.validate_struct_init_comptime = .pl_node,
|
||||
.validate_array_init = .pl_node,
|
||||
.validate_array_init_comptime = .pl_node,
|
||||
.validate_deref = .un_tok,
|
||||
.validate_deref = .un_node,
|
||||
.struct_init_empty = .un_node,
|
||||
.field_type = .pl_node,
|
||||
.field_type_ref = .pl_node,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user