diff options
| -rw-r--r-- | src/ir.cpp | 24 | ||||
| -rw-r--r-- | test/compile_errors.zig | 10 | ||||
| -rw-r--r-- | test/stage1/behavior/vector.zig | 8 |
3 files changed, 31 insertions, 11 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 7d446c82a0..d8d7289dae 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -16715,16 +16715,12 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i } ZigType *dest_float_type = nullptr; uint32_t op1_bits; - if (instr_is_comptime(op1)) { + if (instr_is_comptime(op1) && result_type->id != ZigTypeIdVector) { ZigValue *op1_val = ir_resolve_const(ira, op1, UndefOk); if (op1_val == nullptr) return ira->codegen->invalid_inst_gen; if (op1_val->special == ConstValSpecialUndef) return ir_const_undef(ira, source_instr, ira->codegen->builtin_types.entry_bool); - if (result_type->id == ZigTypeIdVector) { - ir_add_error(ira, &op1->base, buf_sprintf("compiler bug: TODO: support comptime vector here")); - return ira->codegen->invalid_inst_gen; - } bool is_unsigned; if (op1_is_float) { BigInt bigint = {}; @@ -16750,6 +16746,7 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i op1_bits += 1; } } else if (op1_is_float) { + ir_assert(op1_scalar_type->id == ZigTypeIdFloat, source_instr); dest_float_type = op1_scalar_type; } else { ir_assert(op1_scalar_type->id == ZigTypeIdInt, source_instr); @@ -16759,16 +16756,12 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i } } uint32_t op2_bits; - if (instr_is_comptime(op2)) { + if (instr_is_comptime(op2) && result_type->id != ZigTypeIdVector) { ZigValue *op2_val = ir_resolve_const(ira, op2, UndefOk); if (op2_val == nullptr) return ira->codegen->invalid_inst_gen; if (op2_val->special == ConstValSpecialUndef) return ir_const_undef(ira, source_instr, ira->codegen->builtin_types.entry_bool); - if (result_type->id == ZigTypeIdVector) { - ir_add_error(ira, &op2->base, buf_sprintf("compiler bug: TODO: support comptime vector here")); - return ira->codegen->invalid_inst_gen; - } bool is_unsigned; if (op2_is_float) { BigInt bigint = {}; @@ -16794,6 +16787,7 @@ static IrInstGen *ir_analyze_bin_op_cmp_numeric(IrAnalyze *ira, IrInst *source_i op2_bits += 1; } } else if (op2_is_float) { + ir_assert(op2_scalar_type->id == ZigTypeIdFloat, source_instr); dest_float_type = op2_scalar_type; } else { ir_assert(op2_scalar_type->id == ZigTypeIdInt, source_instr); @@ -21934,7 +21928,17 @@ static IrInstGen *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstSrcElemP return ira->codegen->invalid_inst_gen; } safety_check_on = false; + } else if (array_type->id == ZigTypeIdVector) { + uint64_t vector_len = array_type->data.vector.len; + if (index >= vector_len) { + ir_add_error_node(ira, elem_ptr_instruction->base.base.source_node, + buf_sprintf("index %" ZIG_PRI_u64 " outside vector of size %" ZIG_PRI_u64, + index, vector_len)); + return ira->codegen->invalid_inst_gen; + } + safety_check_on = false; } + if (array_type->id == ZigTypeIdVector) { ZigType *elem_type = array_type->data.vector.elem_type; uint32_t host_vec_len = array_type->data.vector.len; diff --git a/test/compile_errors.zig b/test/compile_errors.zig index f457c74609..6ae857d1a8 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -4,6 +4,14 @@ const std = @import("std"); pub fn addCases(cases: *tests.CompileErrorContext) void { cases.add("slice sentinel mismatch", \\export fn entry() void { + \\ const x = @import("std").meta.Vector(3, f32){ 25, 75, 5, 0 }; + \\} + , &[_][]const u8{ + "tmp.zig:2:62: error: index 3 outside vector of size 3", + }); + + cases.add("slice sentinel mismatch", + \\export fn entry() void { \\ const y: [:1]const u8 = &[_:2]u8{ 1, 2 }; \\} , &[_][]const u8{ @@ -7548,7 +7556,7 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { }); cases.add( // fixed bug #2032 - "compile diagnostic string for top level decl type", + "compile diagnostic string for top level decl type", \\export fn entry() void { \\ var foo: u32 = @This(){}; \\} diff --git a/test/stage1/behavior/vector.zig b/test/stage1/behavior/vector.zig index 8bdffcd500..dc9e49da43 100644 --- a/test/stage1/behavior/vector.zig +++ b/test/stage1/behavior/vector.zig @@ -274,6 +274,14 @@ test "vector comparison operators" { expectEqual(@splat(4, true), v1 != v3); expectEqual(@splat(4, false), v1 != v2); } + { + // Comptime-known LHS/RHS + var v1: @Vector(4, u32) = [_]u32{ 2, 1, 2, 1 }; + const v2 = @splat(4, @as(u32, 2)); + const v3: @Vector(4, bool) = [_]bool{ true, false, true, false }; + expectEqual(v3, v1 == v2); + expectEqual(v3, v2 == v1); + } } }; S.doTheTest(); |
