mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +00:00
Support returning vector expressions.
Currently fails due to a scheduling problem when the vector expression contains functions.
This commit is contained in:
parent
0f5f2a125a
commit
6c53be928b
5 changed files with 39 additions and 4 deletions
|
@ -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 *break_label, expr_t *continue_label);
|
||||||
expr_t *build_state_expr (expr_t *e);
|
expr_t *build_state_expr (expr_t *e);
|
||||||
expr_t *think_expr (struct symbol_s *think_sym);
|
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);
|
expr_t *cast_expr (struct type_s *t, expr_t *e);
|
||||||
|
|
||||||
const char *get_op_string (int op) __attribute__((const));
|
const char *get_op_string (int op) __attribute__((const));
|
||||||
|
|
|
@ -1999,8 +1999,13 @@ return_expr (function_t *f, expr_t *e)
|
||||||
warning (e, "type mismatch for return value of %s",
|
warning (e, "type mismatch for return value of %s",
|
||||||
f->sym->name);
|
f->sym->name);
|
||||||
} else {
|
} 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);
|
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);
|
return new_unary_expr ('r', e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -258,8 +258,6 @@ is_indirect (expr_t *e)
|
||||||
return is_const_ptr (e->e.expr.e1);
|
return is_const_ptr (e->e.expr.e1);
|
||||||
}
|
}
|
||||||
|
|
||||||
expr_t *
|
|
||||||
aassign_expr (expr_t *dst, expr_t *src);
|
|
||||||
expr_t *
|
expr_t *
|
||||||
assign_expr (expr_t *dst, expr_t *src)
|
assign_expr (expr_t *dst, expr_t *src)
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,6 +45,7 @@ test_progs_dat=\
|
||||||
structptr.dat \
|
structptr.dat \
|
||||||
swap.dat \
|
swap.dat \
|
||||||
triangle.dat \
|
triangle.dat \
|
||||||
|
vecexpr.dat \
|
||||||
vecinit.dat \
|
vecinit.dat \
|
||||||
while.dat \
|
while.dat \
|
||||||
voidfor.dat
|
voidfor.dat
|
||||||
|
@ -195,6 +196,14 @@ triangle.run: Makefile build-run
|
||||||
$(srcdir)/build-run $@ 100000 100000 1.00005 50002.4961
|
$(srcdir)/build-run $@ 100000 100000 1.00005 50002.4961
|
||||||
include ./$(DEPDIR)/triangle.Qo
|
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_dat_SOURCES=vecinit.r
|
||||||
vecinit_obj=$(vecinit_dat_SOURCES:.r=.qfo)
|
vecinit_obj=$(vecinit_dat_SOURCES:.r=.qfo)
|
||||||
vecinit.dat$(EXEEXT): $(vecinit_obj) $(QFCC_DEP)
|
vecinit.dat$(EXEEXT): $(vecinit_obj) $(QFCC_DEP)
|
||||||
|
|
23
tools/qfcc/test/vecexpr.r
Normal file
23
tools/qfcc/test/vecexpr.r
Normal file
|
@ -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;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue