aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2022-03-04 11:48:29 +0000
committerGitHub <noreply@github.com>2022-03-04 11:48:29 +0000
commit07062324d71787e60c616ffb5d90ea18baa2fda5 (patch)
tree0ebe6f8df9a2c375adcf9c3f9936a0a7a39e8247 /src
parent2e8f2e6dbc0bd558d52668f778ad5c95772fddfd (diff)
parenta5dde78f0882cc6db0b329f356dc7345d47798ca (diff)
Merge pull request #1575 from jockus/fix_relative_slice_len
Add relative slice to type checks for built in len
Diffstat (limited to 'src')
-rw-r--r--src/check_builtin.cpp2
-rw-r--r--src/llvm_backend_proc.cpp4
-rw-r--r--src/llvm_backend_utility.cpp2
3 files changed, 4 insertions, 4 deletions
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp
index aeeeb9e4d..365d3434f 100644
--- a/src/check_builtin.cpp
+++ b/src/check_builtin.cpp
@@ -952,7 +952,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32
mode = Addressing_Constant;
value = exact_value_i64(at->EnumeratedArray.count);
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;
} else if (is_type_dynamic_array(op_type)) {
mode = Addressing_Value;
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 7ead77c2c..eb6c89b85 100644
--- a/src/llvm_backend_proc.cpp
+++ b/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);
} else if (is_type_array(t)) {
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);
} else if (is_type_dynamic_array(t)) {
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");
} else if (is_type_array(t)) {
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);
} else if (is_type_dynamic_array(t)) {
return lb_dynamic_array_cap(p, v);
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 98b7e07f0..431cfea9b 100644
--- a/src/llvm_backend_utility.cpp
+++ b/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);
}
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);
}
lbValue lb_dynamic_array_elem(lbProcedure *p, lbValue da) {