  // At returns the i'th variable of tuple t.
 diff -r 1d462abd2860 go/types/universe.go
 --- a/go/types/universe.go	Wed Oct 09 16:35:59 2013 -0400
-+++ b/go/types/universe.go	Wed Oct 09 22:56:42 2013 +0200
++++ b/go/types/universe.go	Wed Oct 09 23:04:18 2013 +0200
 @@ -65,7 +65,7 @@
  
  	// Error has a nil package in its qualified name since it is in no package

 // for unsafe.Sizeof. It is used if Config.Sizeof == nil.
diff -r 1d462abd2860 go/types/typemap/typemap.go
--- a/go/types/typemap/typemap.go	Wed Oct 09 16:35:59 2013 -0400
+++ b/go/types/typemap/typemap.go	Wed Oct 09 22:56:42 2013 +0200
@@ -130,10 +130,7 @@
 
 // Len returns the number of map entries.

diff -r 1d462abd2860 go/types/call.go
--- a/go/types/call.go	Wed Oct 09 16:35:59 2013 -0400
+++ b/go/types/call.go	Wed Oct 09 23:04:18 2013 +0200
@@ -241,7 +241,6 @@
 }
 
 func (check *checker) selector(x *operand, e *ast.SelectorExpr) {
-	// these must be declared before the "goto Error" statements
 	var (
 		obj      Object
 		index    []int
@@ -262,7 +261,9 @@
 				if !pkg.pkg.fake {
 					check.errorf(e.Pos(), "%s not declared by package %s", sel, ident)
 				}
-				goto Error
+				x.mode = invalid
+				x.expr = e
+				return
 			}
 			if !exp.IsExported() {
 				check.errorf(e.Pos(), "%s not exported by package %s", sel, ident)
@@ -301,7 +302,9 @@
 
 	check.exprOrType(x, e.X)
 	if x.mode == invalid {
-		goto Error
+		x.mode = invalid
+		x.expr = e
+		return
 	}
 
 	obj, index, indirect = LookupFieldOrMethod(x.typ, check.pkg, sel)
@@ -312,7 +315,9 @@
 		} else {
 			check.invalidOp(e.Pos(), "%s has no field or method %s", x, sel)
 		}
-		goto Error
+		x.mode = invalid
+		x.expr = e
+		return
 	}
 
 	if x.mode == typexpr {
@@ -320,13 +325,17 @@
 		m, _ := obj.(*Func)
 		if m == nil {
 			check.invalidOp(e.Pos(), "%s has no method %s", x, sel)
-			goto Error
+			x.mode = invalid
+			x.expr = e
+			return
 		}
 
 		// verify that m is in the method set of x.typ
 		if !indirect && ptrRecv(m) {
 			check.invalidOp(e.Pos(), "%s is not in method set of %s", sel, x.typ)
-			goto Error
+			x.mode = invalid
+			x.expr = e
+			return
 		}
 
 		check.recordSelection(e, MethodExpr, x.typ, m, index, indirect)
@@ -367,7 +376,9 @@
 			//        is shorthand for (&x).m()".
 			if !indirect && x.mode != variable && ptrRecv(obj) {
 				check.invalidOp(e.Pos(), "%s is not in method set of %s", sel, x)
-				goto Error
+				x.mode = invalid
+				x.expr = e
+				return
 			}
 
 			check.recordSelection(e, MethodVal, x.typ, obj, index, indirect)
@@ -417,9 +428,4 @@
 
 	// everything went well
 	x.expr = e
-	return
-
-Error:
-	x.mode = invalid
-	x.expr = e
 }
diff -r 1d462abd2860 go/types/expr.go
--- a/go/types/expr.go	Wed Oct 09 16:35:59 2013 -0400
+++ b/go/types/expr.go	Wed Oct 09 23:04:18 2013 +0200
@@ -89,7 +89,8 @@
 		}
 		if x.mode != variable {
 			check.invalidOp(x.pos(), "cannot take address of %s", x)
-			goto Error
+			x.mode = invalid
+			return
 		}
 		x.typ = &Pointer{base: x.typ}
 		return
@@ -98,11 +99,13 @@
 		typ, ok := x.typ.Underlying().(*Chan)
 		if !ok {
 			check.invalidOp(x.pos(), "cannot receive from non-channel %s", x)
-			goto Error
+			x.mode = invalid
+			return
 		}
 		if typ.dir&ast.RECV == 0 {
 			check.invalidOp(x.pos(), "cannot receive from send-only channel %s", x)
-			goto Error
+			x.mode = invalid
+			return
 		}
 		x.mode = valueok
 		x.typ = typ.elt
@@ -110,7 +113,8 @@
 	}
 
 	if !check.op(unaryOpPredicates, x, op) {
-		goto Error
+		x.mode = invalid
+		return
 	}
 
 	if x.mode == constant {
@@ -128,10 +132,6 @@
 
 	x.mode = value
 	// x.typ remains unchanged
-	return
-
-Error:
-	x.mode = invalid
 }
 
 func isShift(op token.Token) bool {
@@ -474,7 +474,9 @@
 				check.updateExprType(x.expr, target, false)
 			}
 		} else if xkind != tkind {
-			goto Error
+			check.errorf(x.pos(), "cannot convert %s to %s", x, target)
+			x.mode = invalid
+			return
 		}
 		return
 	}
@@ -493,7 +495,9 @@
 		}
 	case *Interface:
 		if !x.isNil() && t.NumMethods() > 0 /* empty interfaces are ok */ {
-			goto Error
+			check.errorf(x.pos(), "cannot convert %s to %s", x, target)
+			x.mode = invalid
+			return
 		}
 		// Update operand types to the default type rather then
 		// the target (interface) type: values must have concrete
@@ -506,27 +510,28 @@
 		} else {
 			// cannot assign untyped values to non-empty interfaces
 			if t.NumMethods() > 0 {
-				goto Error
+				check.errorf(x.pos(), "cannot convert %s to %s", x, target)
+				x.mode = invalid
+				return
 			}
 			target = defaultType(x.typ)
 		}
 	case *Pointer, *Signature, *Slice, *Map, *Chan:
 		if !x.isNil() {
-			goto Error
+			check.errorf(x.pos(), "cannot convert %s to %s", x, target)
+			x.mode = invalid
+			return
 		}
 		// keep nil untyped - see comment for interfaces, above
 		target = Typ[UntypedNil]
 	default:
-		goto Error
+		check.errorf(x.pos(), "cannot convert %s to %s", x, target)
+		x.mode = invalid
+		return
 	}
 
 	x.typ = target
 	check.updateExprType(x.expr, target, true) // UntypedNils are final
-	return
-
-Error:
-	check.errorf(x.pos(), "cannot convert %s to %s", x, target)
-	x.mode = invalid
 }
 
 func (check *checker) comparison(x, y *operand, op token.Token) {
@@ -723,9 +728,12 @@
 	}
 
 	if (op == token.QUO || op == token.REM) && y.mode == constant && exact.Sign(y.val) == 0 {
