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;

	...
}
This commit is contained in:
cinap_lenrek 2016-07-15 21:13:35 +02:00
parent de1e74abd2
commit 95524b1cdd

View file

@ -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);