aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index baedca6e5..acfa40b78 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -3197,6 +3197,9 @@ bool check_index_value(CheckerContext *c, bool open_range, Ast *index_value, i64
return true;
}
+ } else {
+ if (value) *value = exact_value_to_i64(operand.value);
+ return true;
}
}
@@ -3298,8 +3301,9 @@ ExactValue get_constant_field_single(CheckerContext *c, ExactValue value, i32 in
i64 field_index = exact_value_to_i64(index_value);
if (index == field_index) {
TypeAndValue tav = fv->value->tav;
- value = tav.value;
- break;
+ if (success_) *success_ = true;
+ if (finish_) *finish_ = false;
+ return tav.value;;
}
}
@@ -3312,6 +3316,12 @@ ExactValue get_constant_field_single(CheckerContext *c, ExactValue value, i32 in
if (finish_) *finish_ = true;
return empty_exact_value;
}
+ if (cl->elems.count <= index) {
+ if (success_) *success_ = false;
+ if (finish_) *finish_ = false;
+ return value;
+ }
+
TypeAndValue tav = cl->elems[index]->tav;
if (tav.mode == Addressing_Constant) {
if (success_) *success_ = true;
@@ -9377,6 +9387,8 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
if (is_const) {
if (is_type_array(t)) {
+ // OKay
+ } else if (is_type_slice(t)) {
// Okay
} else if (is_type_enumerated_array(t)) {
// Okay
@@ -9424,6 +9436,10 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
bool ok = check_index_value(c, false, ie->index, max_count, &index, index_type_hint);
if (is_const) {
if (index < 0) {
+ if (max_count < 0) {
+
+ }
+
gbString str = expr_to_string(o->expr);
error(o->expr, "Cannot index a constant '%s'", str);
error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n");
@@ -9434,7 +9450,18 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type
} else if (ok) {
ExactValue value = type_and_value_of_expr(ie->expr).value;
o->mode = Addressing_Constant;
- o->value = get_constant_field_single(c, value, cast(i32)index, nullptr, nullptr);
+ bool success = false;
+ bool finish = false;
+ o->value = get_constant_field_single(c, value, cast(i32)index, &success, &finish);
+ if (!success) {
+ gbString str = expr_to_string(o->expr);
+ error(o->expr, "Cannot index a constant '%s' with index %lld", str, cast(long long)index);
+ error_line("\tSuggestion: store the constant into a variable in order to index it with a variable index\n");
+ gb_string_free(str);
+ o->mode = Addressing_Invalid;
+ o->expr = node;
+ return kind;
+ }
}
}
case_end;