From 5e9d7d3567df041a298321c80ae3b2e5cd6c135c Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 30 Nov 2012 20:47:36 +0900 Subject: [PATCH] Don't use the expr type for assignments. Instead, the type is taken from the source operand (this means the computed type of .return for that var). ctf now builds :) --- tools/qfcc/source/dags.c | 5 ++++- tools/qfcc/test/Makefile.am | 8 ++++++++ tools/qfcc/test/chewed-return.r | 19 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tools/qfcc/test/chewed-return.r diff --git a/tools/qfcc/source/dags.c b/tools/qfcc/source/dags.c index eefd15257..ca68ceb5d 100644 --- a/tools/qfcc/source/dags.c +++ b/tools/qfcc/source/dags.c @@ -675,7 +675,10 @@ dag_gencode (dag_t *dag, sblock_t *block, dagnode_t *dagnode) internal_error (0, "non-leaf label in leaf node"); dst = dagnode->label->op; if ((var_iter = set_first (dagnode->identifiers))) { - type = low_level_type (get_type (dagnode->label->expr)); + type = dst->type; + if (dst->op_type == op_symbol + && !strcmp (dst->o.symbol->name, ".return")) + type = dag->flownode->return_type.in; dst = generate_assignments (dag, block, dst, var_iter, type); } break; diff --git a/tools/qfcc/test/Makefile.am b/tools/qfcc/test/Makefile.am index a3fcee705..39a2ed991 100644 --- a/tools/qfcc/test/Makefile.am +++ b/tools/qfcc/test/Makefile.am @@ -20,6 +20,7 @@ QFCC_TEST_INCS=@QFCC_TEST_INCS@ test_progs_dat=\ chewed-alias.dat \ + chewed-return.dat \ deadbool.dat \ infloop.dat \ modulo.dat \ @@ -41,6 +42,13 @@ chewed-alias.dat: $(chewed_alias_obj) $(QFCC_DEP) chewed-alias.run: Makefile build-run $(srcdir)/build-run $@ +chewed_return_dat_SOURCES=chewed-return.r +chewed_return_obj=$(chewed_return_dat_SOURCES:.r=.qfo) +chewed-return.dat: $(chewed_return_obj) $(QFCC_DEP) + $(QFCC) $(QCFLAGS) -o $@ $(chewed_return_obj) +chewed-return.run: Makefile build-run + TEST_HARNESS_OPTS=--float $(srcdir)/build-run $@ + deadbool_dat_SOURCES=deadbool.r deadbool_obj=$(deadbool_dat_SOURCES:.r=.qfo) deadbool.dat: $(deadbool_obj) $(QFCC_DEP) diff --git a/tools/qfcc/test/chewed-return.r b/tools/qfcc/test/chewed-return.r new file mode 100644 index 000000000..c0142b76b --- /dev/null +++ b/tools/qfcc/test/chewed-return.r @@ -0,0 +1,19 @@ +#pragma traditional + +entity spawn (void) {return @nil;} +float time; +.void () think; +.float nextthink; +void rthink(){} +void foo (void) +{ + entity rspawn; + + rspawn = spawn(); + rspawn.nextthink = time + 0.1; + rspawn.think = rthink; +}; +float main () +{ + return 0; // compile test +}