Commit 6be0f50b authored by Russ Cox's avatar Russ Cox

bug159

R=ken
OCL=32902
CL=32914
parent c12ccabb
...@@ -1868,6 +1868,7 @@ reorder1(NodeList *all) ...@@ -1868,6 +1868,7 @@ reorder1(NodeList *all)
* simultaneous assignment. there cannot * simultaneous assignment. there cannot
* be later use of an earlier lvalue. * be later use of an earlier lvalue.
*/ */
int int
vmatch2(Node *l, Node *r) vmatch2(Node *l, Node *r)
{ {
...@@ -1908,7 +1909,18 @@ vmatch1(Node *l, Node *r) ...@@ -1908,7 +1909,18 @@ vmatch1(Node *l, Node *r)
return 0; return 0;
switch(l->op) { switch(l->op) {
case ONAME: case ONAME:
// match each left with all rights switch(l->class) {
case PPARAM:
case PPARAMREF:
case PAUTO:
break;
default:
// assignment to non-stack variable
// must be delayed if right has function calls.
if(r->ullman >= UINF)
return 1;
break;
}
return vmatch2(l, r); return vmatch2(l, r);
case OLITERAL: case OLITERAL:
return 0; return 0;
...@@ -1937,6 +1949,7 @@ reorder3(NodeList *all) ...@@ -1937,6 +1949,7 @@ reorder3(NodeList *all)
n2 = l2->n; n2 = l2->n;
if(c2 > c1) { if(c2 > c1) {
if(vmatch1(n1->left, n2->right)) { if(vmatch1(n1->left, n2->right)) {
// delay assignment to n1->left
q = nod(OXXX, N, N); q = nod(OXXX, N, N);
tempname(q, n1->right->type); tempname(q, n1->right->type);
q = nod(OAS, n1->left, q); q = nod(OAS, n1->left, q);
......
...@@ -147,10 +147,6 @@ BUG: compilation succeeds incorrectly ...@@ -147,10 +147,6 @@ BUG: compilation succeeds incorrectly
=========== bugs/bug136.go =========== bugs/bug136.go
BUG: errchk: command succeeded unexpectedly BUG: errchk: command succeeded unexpectedly
=========== bugs/bug159.go
abc: expected 4 5 6 got 4 4 -4
BUG: bug159
=========== bugs/bug162.go =========== bugs/bug162.go
123 123
BUG: should fail BUG: should fail
......
...@@ -11,18 +11,19 @@ var a,b,c,d,e,f,g,h,i int; ...@@ -11,18 +11,19 @@ var a,b,c,d,e,f,g,h,i int;
func func
printit() printit()
{ {
print(a,b,c,d,e,f,g,h,i,"\n"); println(a,b,c,d,e,f,g,h,i);
} }
func func
testit() bool testit(permuteok bool) bool
{ {
if a+b+c+d+e+f+g+h+i != 45 { if a+b+c+d+e+f+g+h+i != 45 {
print("sum does not add to 45\n"); print("sum does not add to 45\n");
printit(); printit();
panic(); return false;
} }
return a == 1 && return permuteok ||
a == 1 &&
b == 2 && b == 2 &&
c == 3 && c == 3 &&
d == 4 && d == 4 &&
...@@ -51,22 +52,19 @@ main() ...@@ -51,22 +52,19 @@ main()
h = 8; h = 8;
i = 9; i = 9;
if !testit() { panic("init val\n"); } if !testit(false) { panic("init val\n"); }
for z:=0; z<100; z++ { for z:=0; z<100; z++ {
a,b,c,d, e,f,g,h,i = b,c,d,a, i,e,f,g,h; a,b,c,d, e,f,g,h,i = b,c,d,a, i,e,f,g,h;
if testit() { if !testit(z%20 != 19) {
if z == 19 {
break;
}
print("on ", z, "th iteration\n"); print("on ", z, "th iteration\n");
printit(); printit();
panic(); panic();
} }
} }
if !testit() { if !testit(false) {
print("final val\n"); print("final val\n");
printit(); printit();
panic(); panic();
...@@ -76,8 +74,9 @@ main() ...@@ -76,8 +74,9 @@ main()
if a != 2 || b != 1 { if a != 2 || b != 1 {
panic("bad swap"); panic("bad swap");
} }
//BUG a, b = swap(swap(a, b));
// if a != 2 || b != 1 { a, b = swap(swap(a, b));
// panic("bad swap"); if a != 2 || b != 1 {
// } panic("bad swap");
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment