From f2f0fe4e68b4eb1692d5d9515b135efbe8a001ff Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Sat, 17 Nov 2007 19:27:50 +0000 Subject: [PATCH] Allow calling function pointers. [r18457] --- parser.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/parser.c b/parser.c index dbc6630..61b2774 100644 --- a/parser.c +++ b/parser.c @@ -2643,20 +2643,24 @@ static expression_t *parse_call_expression(unsigned precedence, function_type_t *function_type; type_t *type = expression->datatype; - if(type->type != TYPE_FUNCTION) { - /* TODO calling pointers to functions is ok */ + if (type->type == TYPE_FUNCTION) { + function_type = (function_type_t*) type; + call->expression.datatype = function_type->result_type; + } else if (type->type == TYPE_POINTER && + ((pointer_type_t*)type)->points_to->type == TYPE_FUNCTION) { + pointer_type_t *const ptr_type = (pointer_type_t*)type; + function_type = (function_type_t*)ptr_type->points_to; + call->expression.datatype = function_type->result_type; + } else { parser_print_error_prefix(); fputs("called object '", stderr); print_expression(expression); fputs("' (type ", stderr); print_type_quoted(type); - fputs("is not a function\n", stderr); + fputs(") is not a function\n", stderr); function_type = NULL; call->expression.datatype = NULL; - } else { - function_type = (function_type_t*) type; - call->expression.datatype = function_type->result_type; } /* parse arguments */ -- 2.20.1