function literals

go/test: passes 86% (297/343)

R=rsc
APPROVED=rsc
DELTA=14  (10 added, 1 deleted, 3 changed)
OCL=35881
CL=35884
diff --git a/src/cmd/5g/gsubr.c b/src/cmd/5g/gsubr.c
index ae85798..4a4c21b 100644
--- a/src/cmd/5g/gsubr.c
+++ b/src/cmd/5g/gsubr.c
@@ -189,7 +189,7 @@
 void
 afunclit(Addr *a)
 {
-	if(a->type == D_ADDR && a->name == D_EXTERN || a->type == D_REG) {
+	if(a->type == D_CONST && a->name == D_EXTERN || a->type == D_REG) {
 		a->type = D_OREG;
 	}
 }
@@ -1099,6 +1099,7 @@
 			break;
 		case PFUNC:
 			a->name = D_EXTERN;
+			a->type = D_CONST;
 			break;
 		}
 		break;
@@ -1147,13 +1148,18 @@
 
 	case OADDR:
 		naddr(n->left, a);
-		if(a->type == D_OREG) {
+		switch(a->type) {
+		case D_OREG:
 			a->type = D_CONST;
 			break;
-		} else if (a->type == D_REG) {
+
+		case D_REG:
+		case D_CONST:
 			break;
+		
+		default:
+			fatal("naddr: OADDR %d\n", a->type);
 		}
-		fatal("naddr: OADDR %d\n", a->type);
 	}
 }
 
diff --git a/test/arm-pass.txt b/test/arm-pass.txt
index 4953c32..6260510 100644
--- a/test/arm-pass.txt
+++ b/test/arm-pass.txt
@@ -72,6 +72,7 @@
 fixedbugs/bug052.go
 fixedbugs/bug053.go
 fixedbugs/bug054.go
+fixedbugs/bug055.go
 fixedbugs/bug056.go
 fixedbugs/bug057.go
 fixedbugs/bug058.go
@@ -253,6 +254,7 @@
 ken/intervar.go
 ken/label.go
 ken/mfunc.go
+ken/ptrfun.go
 ken/ptrvar.go
 ken/range.go
 ken/rob1.go
@@ -281,6 +283,7 @@
 printbig.go
 rename.go
 rename1.go
+runtime.go
 sieve.go
 sigchld.go
 simassign.go