mirror of
https://github.com/golang/go
synced 2024-09-05 16:04:50 +00:00
cmd/compile: skip array bounds errors when type is broken
This avoids false positives like those found in #19880. Fixes #19880 Change-Id: I583c16cc3c71e7462a72500db9ea2547c468f8c1 Reviewed-on: https://go-review.googlesource.com/40255 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
97b89dc055
commit
423e7e6037
|
@ -369,9 +369,12 @@ OpSwitch:
|
|||
n.Left = indexlit(typecheck(n.Left, Erv))
|
||||
l := n.Left
|
||||
if consttype(l) != CTINT {
|
||||
if l.Type != nil && l.Type.IsInteger() && l.Op != OLITERAL {
|
||||
switch {
|
||||
case l.Type == nil:
|
||||
// Error already reported elsewhere.
|
||||
case l.Type.IsInteger() && l.Op != OLITERAL:
|
||||
yyerror("non-constant array bound %v", l)
|
||||
} else {
|
||||
default:
|
||||
yyerror("invalid array bound %v", l)
|
||||
}
|
||||
n.Type = nil
|
||||
|
|
|
@ -11,7 +11,7 @@ var b [1e1]int // ok
|
|||
var c [1.5]int // ERROR "truncated"
|
||||
var d ["abc"]int // ERROR "invalid array bound|not numeric"
|
||||
var e [nil]int // ERROR "use of untyped nil|invalid array bound|not numeric"
|
||||
var f [e]int // ERROR "invalid array bound|not constant"
|
||||
var f [e]int // ok: error already reported for e
|
||||
var g [1 << 65]int // ERROR "array bound is too large|overflows"
|
||||
var h [len(a)]int // ok
|
||||
|
||||
|
|
20
test/fixedbugs/issue19880.go
Normal file
20
test/fixedbugs/issue19880.go
Normal file
|
@ -0,0 +1,20 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2017 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
|
||||
|
||||
type T struct {
|
||||
f [1]int
|
||||
}
|
||||
|
||||
func a() {
|
||||
_ = T // ERROR "type T is not an expression"
|
||||
}
|
||||
|
||||
func b() {
|
||||
var v [len(T{}.f)]int // ok
|
||||
_ = v
|
||||
}
|
|
@ -11,9 +11,7 @@ package main
|
|||
import "unsafe"
|
||||
|
||||
var x struct {
|
||||
a [unsafe.Sizeof(x.a)]int // ERROR "array bound|typechecking loop|invalid expression"
|
||||
a [unsafe.Sizeof(x.a)]int // ERROR "array bound|typechecking loop|invalid expression"
|
||||
b [unsafe.Offsetof(x.b)]int // ERROR "array bound"
|
||||
c [unsafe.Alignof(x.c)]int // ERROR "array bound|invalid expression"
|
||||
d [len(x.d)]int // ERROR "array bound|invalid array"
|
||||
e [cap(x.e)]int // ERROR "array bound|invalid array"
|
||||
c [unsafe.Alignof(x.c)]int // ERROR "array bound|invalid expression"
|
||||
}
|
||||
|
|
13
test/fixedbugs/issue7525b.go
Normal file
13
test/fixedbugs/issue7525b.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2017 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.
|
||||
|
||||
// Issue 7525: self-referential array types.
|
||||
|
||||
package main
|
||||
|
||||
var y struct {
|
||||
d [len(y.d)]int // ERROR "array bound|typechecking loop|invalid array"
|
||||
}
|
13
test/fixedbugs/issue7525c.go
Normal file
13
test/fixedbugs/issue7525c.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
// errorcheck
|
||||
|
||||
// Copyright 2017 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.
|
||||
|
||||
// Issue 7525: self-referential array types.
|
||||
|
||||
package main
|
||||
|
||||
var z struct {
|
||||
e [cap(z.e)]int // ERROR "array bound|typechecking loop|invalid array"
|
||||
}
|
Loading…
Reference in a new issue