diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 1b0206995..08614f2ce 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -625,7 +625,7 @@ expr_t *build_for_statement (expr_t *init, expr_t *test, expr_t *next, expr_t *break_label, expr_t *continue_label); expr_t *build_state_expr (expr_t *e); expr_t *think_expr (struct symbol_s *think_sym); -expr_t *assign_expr (expr_t *e1, expr_t *e2); +expr_t *assign_expr (expr_t *dst, expr_t *src); expr_t *cast_expr (struct type_s *t, expr_t *e); const char *get_op_string (int op) __attribute__((const)); diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 94fda5f37..30473cdea 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -1999,8 +1999,13 @@ return_expr (function_t *f, expr_t *e) warning (e, "type mismatch for return value of %s", f->sym->name); } else { - if (f->sym->type->t.func.type != t) + if (f->sym->type->t.func.type != t) { e = cast_expr (f->sym->type->t.func.type, e); + t = f->sym->type->t.func.type; + } + } + if (e->type == ex_vector) { + e = assign_expr (new_ret_expr (t), e); } return new_unary_expr ('r', e); } diff --git a/tools/qfcc/source/expr_assign.c b/tools/qfcc/source/expr_assign.c index 6ba4690e2..730396dfa 100644 --- a/tools/qfcc/source/expr_assign.c +++ b/tools/qfcc/source/expr_assign.c @@ -258,8 +258,6 @@ is_indirect (expr_t *e) return is_const_ptr (e->e.expr.e1); } -expr_t * -aassign_expr (expr_t *dst, expr_t *src); expr_t * assign_expr (expr_t *dst, expr_t *src) { diff --git a/tools/qfcc/test/Makefile.am b/tools/qfcc/test/Makefile.am index 1ecb95fb4..352254f9b 100644 --- a/tools/qfcc/test/Makefile.am +++ b/tools/qfcc/test/Makefile.am @@ -45,6 +45,7 @@ test_progs_dat=\ structptr.dat \ swap.dat \ triangle.dat \ + vecexpr.dat \ vecinit.dat \ while.dat \ voidfor.dat @@ -195,6 +196,14 @@ triangle.run: Makefile build-run $(srcdir)/build-run $@ 100000 100000 1.00005 50002.4961 include ./$(DEPDIR)/triangle.Qo +vecexpr_dat_SOURCES=vecexpr.r +vecexpr_obj=$(vecexpr_dat_SOURCES:.r=.qfo) +vecexpr.dat$(EXEEXT): $(vecexpr_obj) $(QFCC_DEP) + $(QFCC) $(QCFLAGS) -o $@ $(vecexpr_obj) +vecexpr.run: Makefile build-run + $(srcdir)/build-run $@ +include ./$(DEPDIR)/vecexpr.Qo + vecinit_dat_SOURCES=vecinit.r vecinit_obj=$(vecinit_dat_SOURCES:.r=.qfo) vecinit.dat$(EXEEXT): $(vecinit_obj) $(QFCC_DEP) diff --git a/tools/qfcc/test/vecexpr.r b/tools/qfcc/test/vecexpr.r new file mode 100644 index 000000000..74bf6e0b1 --- /dev/null +++ b/tools/qfcc/test/vecexpr.r @@ -0,0 +1,23 @@ +vector +t1() +{ + return [1, 2, 3]; +} + +vector +t2(float x) +{ + return [x, x, x]; +} + +vector +t3(float x) +{ + return [x, t2(9).z, x]; +} + +int +main () +{ + return t3(5) == '5 9 5' ? 0 : 1; +}