From 6ff2644ab56981d6e0ecf44141034e1570cb69d9 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 3 Nov 2012 20:10:20 +0900 Subject: [PATCH] Fix simple pointer dereferences. It turns out no code was being generated for x = *y. Ouch. I suspect I need to take a better look at expr_deref at some time in the not too distant future. Conflicts: tools/qfcc/source/statements.c --- tools/qfcc/source/statements.c | 12 ++++++++++++ tools/qfcc/test/ptrderef.r | 14 ++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 tools/qfcc/test/ptrderef.r diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index 80d9c518c..5a42ef078 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -662,6 +662,18 @@ expr_deref (sblock_t *sblock, expr_t *deref, operand_t **op) *op = new_operand (op_pointer); (*op)->type = low_level_type (e->e.value.v.pointer.type); (*op)->o.pointer = &e->e.value.v.pointer; + } else { + statement_t *s; + operand_t *ptr = 0; + + sblock = statement_subexpr (sblock, e, &ptr); + if (!*op) + *op = temp_operand (type); + s = new_statement (".", deref); + s->opa = ptr; + s->opb = short_operand (0); + s->opc = *op; + sblock_add_statement (sblock, s); } return sblock; } diff --git a/tools/qfcc/test/ptrderef.r b/tools/qfcc/test/ptrderef.r new file mode 100644 index 000000000..79b85e629 --- /dev/null +++ b/tools/qfcc/test/ptrderef.r @@ -0,0 +1,14 @@ +void +ptrderef (int *to, int *from) +{ + int x; + + x = *from; + x = *from++; + x = *++from; + //x = ++*from; FIXME syntax error (valid C) + to = from++; + to = ++from; + *to = *from++; + *to = *++from; +}