diff options
-rw-r--r-- | qbe.c | 9 | ||||
-rw-r--r-- | tests/struct-return-2.c | 6 | ||||
-rw-r--r-- | tests/struct-return-2.qbe | 14 |
3 files changed, 20 insertions, 9 deletions
@@ -463,8 +463,13 @@ objectaddr(struct function *f, struct expression *e) funcinit(f, d, e->compound.init); return d->value; case EXPRUNARY: - if (e->unary.op == TMUL) - return funcexpr(f, e->unary.base); + if (e->unary.op != TMUL) + break; + return funcexpr(f, e->unary.base); + default: + if (e->type->kind != TYPESTRUCT && e->type->kind != TYPEUNION) + break; + return funcinst(f, ICOPY, &iptr, (struct value *[]){funcexpr(f, e)}); } error(&tok.loc, "expression is not an object"); } diff --git a/tests/struct-return-2.c b/tests/struct-return-2.c index 9fa50f5..726e667 100644 --- a/tests/struct-return-2.c +++ b/tests/struct-return-2.c @@ -1,4 +1,4 @@ -struct s {int x;} g(void); -void f(void) { - g(); +struct {int x, y;} g(void); +int f(void) { + return g().y; } diff --git a/tests/struct-return-2.qbe b/tests/struct-return-2.qbe index 2f1d3da..415ec2f 100644 --- a/tests/struct-return-2.qbe +++ b/tests/struct-return-2.qbe @@ -1,8 +1,14 @@ -type :s.1 = { w, } +type :.1 = { w, w, } export -function $f() { +function w $f() { @start.1 @body.2 - %.1 =:s.1 call $g() - ret + %.1 =:.1 call $g() + %.2 =l copy %.1 + %.3 =l copy %.2 + %.4 =l mul 4, 1 + %.5 =l add %.3, %.4 + %.6 =l copy %.5 + %.7 =w loadsw %.6 + ret %.7 } |