gc: five bug fixes, one better error.

* check for struct literal assignment to private fields.
* record, fix crash involving parallel map assignment.
* avoid infinite recursion in exportassignok.
* make floating point bounds check precise.
* avoid crash on invalid receiver.

* add context to error about implicit assignment.

Fixes #86.
Fixes #88.
Fixes #158.
Fixes #174.
Fixes #201.
Fixes #204.

R=ken2
https://golang.org/cl/154144
diff --git a/test/assign.go b/test/assign.go
index ba80c8d..842bd62 100644
--- a/test/assign.go
+++ b/test/assign.go
@@ -1,4 +1,4 @@
-// errchk $G $D/$F.go
+// errchk $G -e $D/$F.go
 
 // Copyright 2009 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
@@ -34,4 +34,12 @@
 		x = y;	// ERROR "assignment.*Mutex"
 		_ = x;
 	}
+	{
+		x := sync.Mutex{0, 0};	// ERROR "assignment.*Mutex"
+		_ = x;
+	}
+	{
+		x := sync.Mutex{key: 0};	// ERROR "(unknown|assignment).*Mutex"
+		_ = x;
+	}
 }
diff --git a/test/fixedbugs/bug214.go b/test/fixedbugs/bug214.go
new file mode 100644
index 0000000..502e698
--- /dev/null
+++ b/test/fixedbugs/bug214.go
@@ -0,0 +1,15 @@
+// $G $D/$F.go || echo BUG: bug214
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Used to crash the compiler.
+// http://code.google.com/p/go/issues/detail?id=88
+
+package main
+
+func main() {
+	x := make(map[int]int, 10);
+	x[0], x[1] = 2, 6;
+}
diff --git a/test/fixedbugs/bug215.go b/test/fixedbugs/bug215.go
new file mode 100644
index 0000000..d58786c
--- /dev/null
+++ b/test/fixedbugs/bug215.go
@@ -0,0 +1,16 @@
+// errchk $G $D/$F.go
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Used to crash the compiler.
+// http://code.google.com/p/go/issues/detail?id=158
+
+package main
+
+type A struct {
+	a A;
+}			// ERROR "recursive"
+func foo()		{ new(A).bar() }
+func (a A) bar()	{}
diff --git a/test/fixedbugs/bug216.go b/test/fixedbugs/bug216.go
new file mode 100644
index 0000000..76f8546
--- /dev/null
+++ b/test/fixedbugs/bug216.go
@@ -0,0 +1,20 @@
+// $G $D/$F.go || echo BUG: bug216
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Used to be rejected
+// http://code.google.com/p/go/issues/detail?id=188
+
+package main
+
+func complexSqrt(i int) (int, int)	{ return 0, 1 }
+
+var re, im = complexSqrt(-1)
+
+func main() {
+	if re != 0 || im != 1 {
+		println("BUG: bug216: want 0,-1 have ", re, im)
+	}
+}
diff --git a/test/fixedbugs/bug217.go b/test/fixedbugs/bug217.go
new file mode 100644
index 0000000..98334c4
--- /dev/null
+++ b/test/fixedbugs/bug217.go
@@ -0,0 +1,15 @@
+// errchk $G $D/$F.go
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Used to crash
+// http://code.google.com/p/go/issues/detail?id=204
+
+package main
+
+func () x()	// ERROR "no receiver"
+
+func (a b, c d) x()	// ERROR "multiple receiver"
+