Browse Source

Add relative slice to type checks for built in len

Joakim Hentula 3 years ago
parent
commit
a5dde78f08
3 changed files with 4 additions and 4 deletions
  1. 1 1
      src/check_builtin.cpp
  2. 2 2
      src/llvm_backend_proc.cpp
  3. 1 1
      src/llvm_backend_utility.cpp

+ 1 - 1
src/check_builtin.cpp

@@ -952,7 +952,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
 			mode = Addressing_Constant;
 			mode = Addressing_Constant;
 			value = exact_value_i64(at->EnumeratedArray.count);
 			value = exact_value_i64(at->EnumeratedArray.count);
 			type = t_untyped_integer;
 			type = t_untyped_integer;
-		} else if (is_type_slice(op_type) && id == BuiltinProc_len) {
+		} else if ((is_type_slice(op_type) || is_type_relative_slice(op_type)) && id == BuiltinProc_len) {
 			mode = Addressing_Value;
 			mode = Addressing_Value;
 		} else if (is_type_dynamic_array(op_type)) {
 		} else if (is_type_dynamic_array(op_type)) {
 			mode = Addressing_Value;
 			mode = Addressing_Value;

+ 2 - 2
src/llvm_backend_proc.cpp

@@ -1042,7 +1042,7 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv,
 			return lb_string_len(p, v);
 			return lb_string_len(p, v);
 		} else if (is_type_array(t)) {
 		} else if (is_type_array(t)) {
 			GB_PANIC("Array lengths are constant");
 			GB_PANIC("Array lengths are constant");
-		} else if (is_type_slice(t)) {
+		} else if (is_type_slice(t) || is_type_relative_slice(t)) {
 			return lb_slice_len(p, v);
 			return lb_slice_len(p, v);
 		} else if (is_type_dynamic_array(t)) {
 		} else if (is_type_dynamic_array(t)) {
 			return lb_dynamic_array_len(p, v);
 			return lb_dynamic_array_len(p, v);
@@ -1068,7 +1068,7 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv,
 			GB_PANIC("Unreachable");
 			GB_PANIC("Unreachable");
 		} else if (is_type_array(t)) {
 		} else if (is_type_array(t)) {
 			GB_PANIC("Array lengths are constant");
 			GB_PANIC("Array lengths are constant");
-		} else if (is_type_slice(t)) {
+		} else if (is_type_slice(t) || is_type_relative_slice(t)) {
 			return lb_slice_len(p, v);
 			return lb_slice_len(p, v);
 		} else if (is_type_dynamic_array(t)) {
 		} else if (is_type_dynamic_array(t)) {
 			return lb_dynamic_array_cap(p, v);
 			return lb_dynamic_array_cap(p, v);

+ 1 - 1
src/llvm_backend_utility.cpp

@@ -1373,7 +1373,7 @@ lbValue lb_slice_elem(lbProcedure *p, lbValue slice) {
 	return lb_emit_struct_ev(p, slice, 0);
 	return lb_emit_struct_ev(p, slice, 0);
 }
 }
 lbValue lb_slice_len(lbProcedure *p, lbValue slice) {
 lbValue lb_slice_len(lbProcedure *p, lbValue slice) {
-	GB_ASSERT(is_type_slice(slice.type));
+	GB_ASSERT(is_type_slice(slice.type) || is_type_relative_slice(slice.type));
 	return lb_emit_struct_ev(p, slice, 1);
 	return lb_emit_struct_ev(p, slice, 1);
 }
 }
 lbValue lb_dynamic_array_elem(lbProcedure *p, lbValue da) {
 lbValue lb_dynamic_array_elem(lbProcedure *p, lbValue da) {