From 904197c70e11c928502dfa033f864af4e48f040d Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Mon, 11 Dec 2006 09:26:45 +0000 Subject: [PATCH] allow assignment of arrays to poitners --- tools/qfcc/source/expr.c | 6 +++++- tools/qfcc/source/method.c | 2 ++ tools/qfcc/source/type.c | 5 +++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 752953d58..4ae2feca4 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -2477,7 +2477,8 @@ cast_expr (type_t *type, expr_t *e) if (!(type->type == ev_pointer && (e_type->type == ev_pointer - || e_type == &type_integer || e_type == &type_uinteger)) + || e_type == &type_integer || e_type == &type_uinteger + || e_type->type == ev_array)) && !(type->type == ev_func && e_type->type == ev_func) && !(((type == &type_integer || type == &type_uinteger) && (e_type == &type_float || e_type == &type_integer @@ -2488,6 +2489,9 @@ cast_expr (type_t *type, expr_t *e) pr_type_name[extract_type (e)], pr_type_name[type->type]); } + if (e_type ->type == ev_array) { + return address_expr (e, 0, 0); + } if (e->type == ex_uexpr && e->e.expr.op == '.') { e->e.expr.type = type; c = e; diff --git a/tools/qfcc/source/method.c b/tools/qfcc/source/method.c index b8586dbdf..bb21b09b5 100644 --- a/tools/qfcc/source/method.c +++ b/tools/qfcc/source/method.c @@ -528,6 +528,8 @@ method_check_params (method_t *method, expr_t *args) if (i < parm_count) { if (e->type != ex_nil) if (!type_assignable (mtype->parm_types[i], t)) { + print_type (mtype->parm_types[i]); puts (""); + print_type (t); puts (""); err = error (e, "type mismatch for parameter %d of %s", i - 1, method->name); } diff --git a/tools/qfcc/source/type.c b/tools/qfcc/source/type.c index 7f44506f1..e13bd115a 100644 --- a/tools/qfcc/source/type.c +++ b/tools/qfcc/source/type.c @@ -565,6 +565,11 @@ type_assignable (type_t *dst, type_t *src) if (dst == src) return 1; + if (dst->type == ev_pointer && src->type == ev_array) { + if (dst->aux_type == src->aux_type) + return 1; + return 0; + } if (dst->type != ev_pointer || src->type != ev_pointer) return is_scalar (dst) && is_scalar (src); dst = dst->aux_type;