return stmt
 
        case LCOLAS:
-               line := lineno
+               lno := lineno
                p.next()
 
                if rangeOk && p.got(LRANGE) {
                        } // it's a colas, so must not re-use an oldname
                        return ts
                }
-               return colas(lhs, rhs, int32(line))
+               return colas(lhs, rhs, int32(lno))
 
        default:
                p.syntax_error("expecting := or = or comma")
 
                case LCOLAS:
                        // LCASE expr_or_type_list LCOLAS expr ':'
+                       lno := lineno
                        p.next()
                        rhs := p.expr()
 
                        // done in casebody()
                        markdcl() // matching popdcl in caseblock
                        stmt := Nod(OXCASE, nil, nil)
-                       stmt.List = list1(colas(cases, list1(rhs), int32(p.op)))
+                       stmt.List = list1(colas(cases, list1(rhs), int32(lno)))
 
                        p.want(':') // consume ':' after declaring select cases for correct lineno
                        return stmt
 
--- /dev/null
+// errorcheck
+
+// Copyright 2015 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.
+
+// Verify that error message regarding := appears on
+// correct line (and not on the line of the 2nd :=).
+
+package p
+
+func f() {
+    select {
+    case x, x := <-func() chan int { // ERROR "x repeated on left side of :="
+            c := make(chan int)
+            return c
+    }():
+    }
+}