aboutsummaryrefslogtreecommitdiff
path: root/src/check_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-08-09 17:58:11 +0100
committergingerBill <bill@gingerbill.org>2018-08-09 17:58:11 +0100
commit70586b1cf81dcf7940bd39ce7b2c18ed8f0d2aa5 (patch)
treed05b2342675da410c5ffde5e5e36247e4a2cf3d1 /src/check_expr.cpp
parent877a78d6ba2f31ac22278a780f6996eac18f02a4 (diff)
`auto_cast` prefix for procedure parameters
Diffstat (limited to 'src/check_expr.cpp')
-rw-r--r--src/check_expr.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/check_expr.cpp b/src/check_expr.cpp
index c3f252cf7..5427fcd65 100644
--- a/src/check_expr.cpp
+++ b/src/check_expr.cpp
@@ -3879,10 +3879,18 @@ CALL_ARGUMENT_CHECKER(check_call_arguments_internal) {
i64 s = 0;
if (!check_is_assignable_to_with_score(c, &o, t, &s)) {
- if (show_error) {
- check_assignment(c, &o, t, str_lit("argument"));
+ bool ok = false;
+ if (e->flags & EntityFlag_AutoCast) {
+ ok = check_is_castable_to(c, &o, t);
+ }
+ if (ok) {
+ s = assign_score_function(10);
+ } else {
+ if (show_error) {
+ check_assignment(c, &o, t, str_lit("argument"));
+ }
+ err = CallArgumentError_WrongTypes;
}
- err = CallArgumentError_WrongTypes;
}
score += s;
}
@@ -6107,6 +6115,9 @@ gbString write_expr_to_string(gbString str, Ast *node) {
if (f->flags&FieldFlag_c_vararg) {
str = gb_string_appendc(str, "#c_vararg ");
}
+ if (f->flags&FieldFlag_auto_cast) {
+ str = gb_string_appendc(str, "auto_cast ");
+ }
for_array(i, f->names) {
Ast *name = f->names[i];