From 6b8bd3556ad77141729d836999d93fdd1923e3b2 Mon Sep 17 00:00:00 2001
From: Ken Thompson <ken@golang.org>
Date: Fri, 6 Jun 2008 16:49:35 -0700
Subject: [PATCH] nonaddressable = functioncall code gen error

SVN=121541
---
 src/cmd/6g/cgen.c | 15 +++++++++++++++
 src/cmd/6g/gen.c  | 13 +++++++++++--
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/cmd/6g/cgen.c b/src/cmd/6g/cgen.c
index 7a00688392..531f0614b1 100644
--- a/src/cmd/6g/cgen.c
+++ b/src/cmd/6g/cgen.c
@@ -22,6 +22,13 @@ cgen(Node *n, Node *res)
 	if(res == N || res->type == T)
 		fatal("cgen: res nil");
 
+	if(n->ullman >= UINF) {
+		if(n->op == OINDREG)
+			fatal("cgen: this is going to misscompile");
+		if(res->ullman >= UINF)
+			fatal("cgen: fun both sides");
+	}
+
 	lno = dynlineno;
 	if(n->op != ONAME)
 		dynlineno = n->lineno;	// for diagnostics
@@ -32,6 +39,14 @@ cgen(Node *n, Node *res)
 	}
 
 	if(!res->addable) {
+		if(n->ullman > res->ullman) {
+			regalloc(&n1, nr->type, res);
+			cgen(n, &n1);
+			cgen(&n1, res);
+			regfree(&n1);
+			return;
+		}
+
 		igen(res, &n1, N);
 		cgen(n, &n1);
 		regfree(&n1);
diff --git a/src/cmd/6g/gen.c b/src/cmd/6g/gen.c
index 4f4c4d122c..47e5037640 100644
--- a/src/cmd/6g/gen.c
+++ b/src/cmd/6g/gen.c
@@ -688,10 +688,15 @@ cgen_asop(Node *nl, Node *nr, int op)
 	Node n1, n2;
 	int a;
 
-	// botch compare ullman numbers
-	// and use temp for functions
+	if(nr->ullman >= UINF && nl->ullman >= UINF) {
+		fatal("cgen_asop both sides call");
+	}
 
 	a = optoas(op, nl->type);
+	if(nr->ullman > nl->ullman) {
+		fatal("gcgen_asopen");
+	}
+
 	regalloc(&n1, nl->type, N);
 	if(nl->addable) {
 		cgen(nr, &n1);
@@ -815,5 +820,9 @@ cgen_as(Node *nl, Node *nr, int op)
 		nr->addable = 1;
 		ullmancalc(nr);
 	}
+
+	if(nr->ullman >= UINF && nl->ullman >= UINF) {
+		fatal("cgen_as both sides call");
+	}
 	cgen(nr, nl);
 }
-- 
2.30.9