aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--expr.c2
-rw-r--r--tests/add-int-pointer.c4
-rw-r--r--tests/add-int-pointer.qbe10
3 files changed, 15 insertions, 1 deletions
diff --git a/expr.c b/expr.c
index 97b2fd5..a68f5d8 100644
--- a/expr.c
+++ b/expr.c
@@ -165,7 +165,7 @@ mkbinaryexpr(struct location *loc, enum tokenkind op, struct expression *l, stru
break;
}
if (r->type->kind == TYPEPOINTER)
- e = l, l = r, r = e;
+ e = l, l = r, r = e, rp = lp;
if (l->type->kind != TYPEPOINTER || !(rp & PROPINT))
error(loc, "invalid operands to '+' operator");
t = l->type;
diff --git a/tests/add-int-pointer.c b/tests/add-int-pointer.c
new file mode 100644
index 0000000..be1a60f
--- /dev/null
+++ b/tests/add-int-pointer.c
@@ -0,0 +1,4 @@
+int x[2];
+void f(void) {
+ 1 + x;
+}
diff --git a/tests/add-int-pointer.qbe b/tests/add-int-pointer.qbe
new file mode 100644
index 0000000..22825ee
--- /dev/null
+++ b/tests/add-int-pointer.qbe
@@ -0,0 +1,10 @@
+export
+function $f() {
+@start.1
+@body.2
+ %.1 =l extsw 1
+ %.2 =l mul %.1, 4
+ %.3 =l add $x, %.2
+ ret
+}
+export data $x = align 4 { z 8 }