mirror of https://github.com/golang/go.git
cmd/compile: use type position for error message in align.go
This helps the compiler reports the right place where the type declared, instead of relying on global lineno, which maybe set to wrong value at the time the error is reported. Fixes #42058 Change-Id: I06d34aa9b0236d122f4a0d72e66675ded022baac Reviewed-on: https://go-review.googlesource.com/c/go/+/263597 Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
a505312c89
commit
bccdd31252
|
|
@ -86,7 +86,7 @@ func expandiface(t *types.Type) {
|
|||
sort.Sort(methcmp(methods))
|
||||
|
||||
if int64(len(methods)) >= thearch.MAXWIDTH/int64(Widthptr) {
|
||||
yyerror("interface too large")
|
||||
yyerrorl(typePos(t), "interface too large")
|
||||
}
|
||||
for i, m := range methods {
|
||||
m.Offset = int64(i) * int64(Widthptr)
|
||||
|
|
@ -150,7 +150,7 @@ func widstruct(errtype *types.Type, t *types.Type, o int64, flag int) int64 {
|
|||
maxwidth = 1<<31 - 1
|
||||
}
|
||||
if o >= maxwidth {
|
||||
yyerror("type %L too large", errtype)
|
||||
yyerrorl(typePos(errtype), "type %L too large", errtype)
|
||||
o = 8 // small but nonzero
|
||||
}
|
||||
}
|
||||
|
|
@ -381,7 +381,7 @@ func dowidth(t *types.Type) {
|
|||
t1 := t.ChanArgs()
|
||||
dowidth(t1) // just in case
|
||||
if t1.Elem().Width >= 1<<16 {
|
||||
yyerror("channel element type too large (>64kB)")
|
||||
yyerrorl(typePos(t1), "channel element type too large (>64kB)")
|
||||
}
|
||||
w = 1 // anything will do
|
||||
|
||||
|
|
@ -414,7 +414,7 @@ func dowidth(t *types.Type) {
|
|||
if t.Elem().Width != 0 {
|
||||
cap := (uint64(thearch.MAXWIDTH) - 1) / uint64(t.Elem().Width)
|
||||
if uint64(t.NumElem()) > cap {
|
||||
yyerror("type %L larger than address space", t)
|
||||
yyerrorl(typePos(t), "type %L larger than address space", t)
|
||||
}
|
||||
}
|
||||
w = t.NumElem() * t.Elem().Width
|
||||
|
|
@ -456,7 +456,7 @@ func dowidth(t *types.Type) {
|
|||
}
|
||||
|
||||
if Widthptr == 4 && w != int64(int32(w)) {
|
||||
yyerror("type %v too large", t)
|
||||
yyerrorl(typePos(t), "type %v too large", t)
|
||||
}
|
||||
|
||||
t.Width = w
|
||||
|
|
|
|||
|
|
@ -183,6 +183,8 @@ func TestStdFixed(t *testing.T) {
|
|||
"issue31747.go", // go/types does not have constraints on language level (-lang=go1.12) (see #31793)
|
||||
"issue34329.go", // go/types does not have constraints on language level (-lang=go1.13) (see #31793)
|
||||
"bug251.go", // issue #34333 which was exposed with fix for #34151
|
||||
"issue42058a.go", // go/types does not have constraints on channel element size
|
||||
"issue42058b.go", // go/types does not have constraints on channel element size
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2020 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 p
|
||||
|
||||
var c chan [2 << 16]byte // ERROR "channel element type too large"
|
||||
|
||||
type T [1 << 17]byte
|
||||
|
||||
var x chan T // ERROR "channel element type too large"
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2020 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 p
|
||||
|
||||
var c chan [2 << 16]byte // ERROR "channel element type too large"
|
||||
|
||||
func f() {
|
||||
_ = 42
|
||||
}
|
||||
Loading…
Reference in New Issue