git: 9front

Download patch

ref: cacd1d6d6a921ca53ac54f9ed7246c95cbfaa566
parent: 1ccf9cda6efb37e9d858f49674fb32c747fc2083
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri Jul 15 17:13:35 EDT 2016

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;

	...
}

--- a/sys/src/cmd/5c/cgen.c
+++ b/sys/src/cmd/5c/cgen.c
@@ -961,7 +961,7 @@
 			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);
--