From: Russ Cox Date: Sat, 22 Dec 2012 15:01:15 +0000 (-0500) Subject: cmd/gc: fix error line in switch expr eval X-Git-Tag: go1.1rc2~1562 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=407d0c5ab732c8a5ac003c41c294590d824b1eff;p=gostls13.git cmd/gc: fix error line in switch expr eval Fixes #4562. R=ken2 CC=golang-dev https://golang.org/cl/7008044 --- diff --git a/src/cmd/gc/swt.c b/src/cmd/gc/swt.c index 860fed84a9..6112b0426f 100644 --- a/src/cmd/gc/swt.c +++ b/src/cmd/gc/swt.c @@ -259,10 +259,11 @@ casebody(Node *sw, Node *typeswvar) Node *go, *br; int32 lno, needvar; - lno = setlineno(sw); if(sw->list == nil) return; + lno = setlineno(sw); + cas = nil; // cases stat = nil; // statements def = N; // defaults @@ -270,7 +271,7 @@ casebody(Node *sw, Node *typeswvar) for(l=sw->list; l; l=l->next) { n = l->n; - lno = setlineno(n); + setlineno(n); if(n->op != OXCASE) fatal("casebody %O", n->op); n->op = OCASE; @@ -793,7 +794,6 @@ typeswitch(Node *sw) void walkswitch(Node *sw) { - /* * reorder the body into (OLIST, cases, statements) * cases have OGOTO into statements. diff --git a/test/fixedbugs/issue4562.go b/test/fixedbugs/issue4562.go new file mode 100644 index 0000000000..29d98b0283 --- /dev/null +++ b/test/fixedbugs/issue4562.go @@ -0,0 +1,49 @@ +// run + +// Copyright 2012 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. + +package main + +import ( + "fmt" + "runtime" + "strings" +) + +type T struct { + val int +} + +func main() { + defer expectError(22) + var pT *T + switch pT.val { // error should be here - line 22 + case 0: + fmt.Println("0") + case 1: // used to show up here instead + fmt.Println("1") + case 2: + fmt.Println("2") + } + fmt.Println("finished") +} + +func expectError(expectLine int) { + if recover() == nil { + panic("did not crash") + } + for i := 1;; i++ { + _, file, line, ok := runtime.Caller(i) + if !ok { + panic("cannot find issue4562.go on stack") + } + if strings.HasSuffix(file, "issue4562.go") { + if line != expectLine { + panic(fmt.Sprintf("crashed at line %d, wanted line %d", line, expectLine)) + } + break + } + } +}