From 95524b1cdd24091d8d677d4c7a0bb8492f1a7961 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 15 Jul 2016 21:13:35 +0200 Subject: 5c: fix int -> uvlong cast bug (thanks to qwx on his patience on a the trouble session to narrowing it down) we used to not sign extend if the destination was unsigned uvlong, which is wrong. we have to sign extend only based on the signedness of the source (it gets propagated to vlong) this bug hit in hjfs in the newentry() function, causing file creation to fail with "create -- phase error": newentry(...) { uvlong sj; int si; ... sj = si = -1; ... } --- sys/src/cmd/5c/cgen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sys/src/cmd/5c') diff --git a/sys/src/cmd/5c/cgen.c b/sys/src/cmd/5c/cgen.c index a85271565..42421f6cc 100644 --- a/sys/src/cmd/5c/cgen.c +++ b/sys/src/cmd/5c/cgen.c @@ -961,7 +961,7 @@ cgen64(Node *n, Node *nn) reg[nn->right->reg] = 0; cgen(l, &nod1); reg[nn->right->reg] = a; - if(typeu[n->type->etype] || typeu[l->type->etype]) + if(typeu[l->type->etype]) gmove(nodconst(0), nn->right); else gopcode(OASHR, nodconst(31), &nod1, nn->right); -- cgit v1.2.3