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
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;
void
walkswitch(Node *sw)
{
-
/*
* reorder the body into (OLIST, cases, statements)
* cases have OGOTO into statements.
--- /dev/null
+// 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
+ }
+ }
+}