aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ir.cpp24
-rw-r--r--test/compile_errors.zig10
-rw-r--r--test/stage1/behavior/vector.zig8
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();