зеркало из https://github.com/CryptoPro/go.git
cmd/gc: fix error line in switch expr eval
Fixes #4562. R=ken2 CC=golang-dev https://golang.org/cl/7008044
This commit is contained in:
Родитель
a9121a19f0
Коммит
407d0c5ab7
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче