| ... | ... | @@ -2462,7 +2462,7 @@ static IrInstruction *ir_build_type_info(IrBuilder *irb, Scope *scope, AstNode * |
| 2462 | 2462 | |
| 2463 | 2463 | ir_ref_instruction(type_value, irb->current_basic_block); |
| 2464 | 2464 | |
| 2465 | | return &instruction->base; |
| 2465 | return &instruction->base; |
| 2466 | 2466 | } |
| 2467 | 2467 | |
| 2468 | 2468 | static IrInstruction *ir_build_type_id(IrBuilder *irb, Scope *scope, AstNode *source_node, |
| ... | ... | @@ -6739,7 +6739,7 @@ static IrInstruction *ir_gen_cancel_target(IrBuilder *irb, Scope *scope, AstNode |
| 6739 | 6739 | atomic_state_field_name); |
| 6740 | 6740 | |
| 6741 | 6741 | // set the is_canceled bit |
| 6742 | | IrInstruction *prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6742 | IrInstruction *prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6743 | 6743 | usize_type_val, atomic_state_ptr, nullptr, is_canceled_mask, nullptr, |
| 6744 | 6744 | AtomicRmwOp_or, AtomicOrderSeqCst); |
| 6745 | 6745 | |
| ... | ... | @@ -6817,7 +6817,7 @@ static IrInstruction *ir_gen_resume_target(IrBuilder *irb, Scope *scope, AstNode |
| 6817 | 6817 | atomic_state_field_name); |
| 6818 | 6818 | |
| 6819 | 6819 | // clear the is_suspended bit |
| 6820 | | IrInstruction *prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6820 | IrInstruction *prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6821 | 6821 | usize_type_val, atomic_state_ptr, nullptr, and_mask, nullptr, |
| 6822 | 6822 | AtomicRmwOp_and, AtomicOrderSeqCst); |
| 6823 | 6823 | |
| ... | ... | @@ -6933,7 +6933,7 @@ static IrInstruction *ir_gen_await_expr(IrBuilder *irb, Scope *scope, AstNode *n |
| 6933 | 6933 | |
| 6934 | 6934 | IrInstruction *coro_handle_addr = ir_build_ptr_to_int(irb, scope, node, irb->exec->coro_handle); |
| 6935 | 6935 | IrInstruction *mask_bits = ir_build_bin_op(irb, scope, node, IrBinOpBinOr, coro_handle_addr, await_mask, false); |
| 6936 | | IrInstruction *prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6936 | IrInstruction *prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6937 | 6937 | usize_type_val, atomic_state_ptr, nullptr, mask_bits, nullptr, |
| 6938 | 6938 | AtomicRmwOp_or, AtomicOrderSeqCst); |
| 6939 | 6939 | |
| ... | ... | @@ -6976,7 +6976,7 @@ static IrInstruction *ir_gen_await_expr(IrBuilder *irb, Scope *scope, AstNode *n |
| 6976 | 6976 | |
| 6977 | 6977 | |
| 6978 | 6978 | ir_set_cursor_at_end_and_append_block(irb, yes_suspend_block); |
| 6979 | | IrInstruction *my_prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6979 | IrInstruction *my_prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 6980 | 6980 | usize_type_val, irb->exec->atomic_state_field_ptr, nullptr, is_suspended_mask, nullptr, |
| 6981 | 6981 | AtomicRmwOp_or, AtomicOrderSeqCst); |
| 6982 | 6982 | IrInstruction *my_is_suspended_value = ir_build_bin_op(irb, scope, node, IrBinOpBinAnd, my_prev_atomic_value, is_suspended_mask, false); |
| ... | ... | @@ -7008,7 +7008,7 @@ static IrInstruction *ir_gen_await_expr(IrBuilder *irb, Scope *scope, AstNode *n |
| 7008 | 7008 | |
| 7009 | 7009 | ir_set_cursor_at_end_and_append_block(irb, cleanup_block); |
| 7010 | 7010 | IrInstruction *my_mask_bits = ir_build_bin_op(irb, scope, node, IrBinOpBinOr, ptr_mask, is_canceled_mask, false); |
| 7011 | | IrInstruction *b_my_prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 7011 | IrInstruction *b_my_prev_atomic_value = ir_build_atomic_rmw(irb, scope, node, |
| 7012 | 7012 | usize_type_val, irb->exec->atomic_state_field_ptr, nullptr, my_mask_bits, nullptr, |
| 7013 | 7013 | AtomicRmwOp_or, AtomicOrderSeqCst); |
| 7014 | 7014 | IrInstruction *my_await_handle_addr = ir_build_bin_op(irb, scope, node, IrBinOpBinAnd, b_my_prev_atomic_value, ptr_mask, false); |
| ... | ... | @@ -11279,12 +11279,21 @@ static IrInstruction *ir_analyze_cast(IrAnalyze *ira, IrInstruction *source_inst |
| 11279 | 11279 | return ir_analyze_array_to_vector(ira, source_instr, value, wanted_type); |
| 11280 | 11280 | } |
| 11281 | 11281 | |
| 11282 | | // casting to C pointers |
| 11283 | | if (wanted_type->id == ZigTypeIdPointer && wanted_type->data.pointer.ptr_len == PtrLenC) { |
| 11284 | | // cast from integer to C pointer |
| 11285 | | if (actual_type->id == ZigTypeIdInt || actual_type->id == ZigTypeIdComptimeInt) { |
| 11286 | | return ir_analyze_int_to_c_ptr(ira, source_instr, value, wanted_type); |
| 11287 | | } |
| 11282 | // casting between C pointers and normal pointers |
| 11283 | if (wanted_type->id == ZigTypeIdPointer && actual_type->id == ZigTypeIdPointer && |
| 11284 | (wanted_type->data.pointer.ptr_len == PtrLenC || actual_type->data.pointer.ptr_len == PtrLenC) && |
| 11285 | types_match_const_cast_only(ira, wanted_type->data.pointer.child_type, |
| 11286 | actual_type->data.pointer.child_type, source_node, |
| 11287 | !wanted_type->data.pointer.is_const).id == ConstCastResultIdOk) |
| 11288 | { |
| 11289 | return ir_analyze_ptr_cast(ira, source_instr, value, wanted_type, source_instr); |
| 11290 | } |
| 11291 | |
| 11292 | // cast from integer to C pointer |
| 11293 | if (wanted_type->id == ZigTypeIdPointer && wanted_type->data.pointer.ptr_len == PtrLenC && |
| 11294 | (actual_type->id == ZigTypeIdInt || actual_type->id == ZigTypeIdComptimeInt)) |
| 11295 | { |
| 11296 | return ir_analyze_int_to_c_ptr(ira, source_instr, value, wanted_type); |
| 11288 | 11297 | } |
| 11289 | 11298 | |
| 11290 | 11299 | // cast from undefined to anything |
| ... | ... | @@ -16436,7 +16445,7 @@ static IrInstruction *ir_analyze_instruction_switch_target(IrAnalyze *ira, |
| 16436 | 16445 | pointee_val = const_ptr_pointee(ira, ira->codegen, &target_value_ptr->value, target_value_ptr->source_node); |
| 16437 | 16446 | if (pointee_val == nullptr) |
| 16438 | 16447 | return ira->codegen->invalid_instruction; |
| 16439 | | |
| 16448 | |
| 16440 | 16449 | if (pointee_val->special == ConstValSpecialRuntime) |
| 16441 | 16450 | pointee_val = nullptr; |
| 16442 | 16451 | } |
| ... | ... | @@ -17186,7 +17195,7 @@ static IrInstruction *ir_analyze_instruction_field_parent_ptr(IrAnalyze *ira, |
| 17186 | 17195 | static TypeStructField *validate_byte_offset(IrAnalyze *ira, |
| 17187 | 17196 | IrInstruction *type_value, |
| 17188 | 17197 | IrInstruction *field_name_value, |
| 17189 | | size_t *byte_offset) |
| 17198 | size_t *byte_offset) |
| 17190 | 17199 | { |
| 17191 | 17200 | ZigType *container_type = ir_resolve_type(ira, type_value); |
| 17192 | 17201 | if (type_is_invalid(container_type)) |
| ... | ... | @@ -17360,7 +17369,7 @@ static Error ir_make_type_info_defs(IrAnalyze *ira, ConstExprValue *out_val, Sco |
| 17360 | 17369 | |
| 17361 | 17370 | // Loop through the definitions and generate info. |
| 17362 | 17371 | decl_it = decls_scope->decl_table.entry_iterator(); |
| 17363 | | curr_entry = nullptr; |
| 17372 | curr_entry = nullptr; |
| 17364 | 17373 | int definition_index = 0; |
| 17365 | 17374 | while ((curr_entry = decl_it.next()) != nullptr) { |
| 17366 | 17375 | // Skip comptime blocks and test functions. |
| ... | ... | @@ -20312,7 +20321,7 @@ static IrInstruction *ir_analyze_instruction_check_switch_prongs(IrAnalyze *ira, |
| 20312 | 20321 | } else { |
| 20313 | 20322 | seenFalse += 1; |
| 20314 | 20323 | } |
| 20315 | | |
| 20324 | |
| 20316 | 20325 | if ((seenTrue > 1) || (seenFalse > 1)) { |
| 20317 | 20326 | ir_add_error(ira, value, buf_sprintf("duplicate switch value")); |
| 20318 | 20327 | return ira->codegen->invalid_instruction; |