]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix error line in switch expr eval
authorRuss Cox <rsc@golang.org>
Sat, 22 Dec 2012 15:01:15 +0000 (10:01 -0500)
committerRuss Cox <rsc@golang.org>
Sat, 22 Dec 2012 15:01:15 +0000 (10:01 -0500)
Fixes #4562.

R=ken2
CC=golang-dev
https://golang.org/cl/7008044

src/cmd/gc/swt.c
test/fixedbugs/issue4562.go [new file with mode: 0644]

index 860fed84a9626c2a45159018f26a967fd2914455..6112b0426f460af20b1e8124cac49d66a2198286 100644 (file)
@@ -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 (file)
index 0000000..29d98b0
--- /dev/null
@@ -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
+               }
+       }
+}