From 662338f116c3b87c78ddb113e8e63f6329fe307f Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Thu, 14 Jul 2016 04:09:49 +0200 Subject: Fix function to pointer conversion This snippet is valid: void foo(void); ... foo + 42 ... the function designator is converted to pointer to function implicitely. gen_op didn't do that and bailed out. --- tccgen.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'tccgen.c') diff --git a/tccgen.c b/tccgen.c index 6d72ab9..f49caa6 100644 --- a/tccgen.c +++ b/tccgen.c @@ -1926,6 +1926,7 @@ ST_FUNC void gen_op(int op) int u, t1, t2, bt1, bt2, t; CType type1; +redo: t1 = vtop[-1].type.t; t2 = vtop[0].type.t; bt1 = t1 & VT_BTYPE; @@ -1933,6 +1934,18 @@ ST_FUNC void gen_op(int op) if (bt1 == VT_STRUCT || bt2 == VT_STRUCT) { tcc_error("operation on a struct"); + } else if (bt1 == VT_FUNC || bt2 == VT_FUNC) { + if (bt2 == VT_FUNC) { + mk_pointer(&vtop->type); + gaddrof(); + } + if (bt1 == VT_FUNC) { + vswap(); + mk_pointer(&vtop->type); + gaddrof(); + vswap(); + } + goto redo; } else if (bt1 == VT_PTR || bt2 == VT_PTR) { /* at least one operand is a pointer */ /* relationnal op: must be both pointers */ -- cgit v1.3.1