If n.Type==nil after typechecking, then we should have already
reported a more useful error somewhere else. Just return 0 in
evalunsafe without trying to do anything else that's likely to cause
problems.
Also, further split out issue7525.go into more test files, because
cmd/compile reports at most one typechecking loop per compilation
unit.
Fixes #22351.
Change-Id: I3ebf505f72c48fcbfef5ec915606224406026597
Reviewed-on: https://go-review.googlesource.com/72251
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Daniel Martà <mvdan@mvdan.cc>
Reviewed-by: Robert Griesemer <gri@golang.org>
n.Left = defaultlit(n.Left, nil)
tr := n.Left.Type
if tr == nil {
- yyerror("invalid expression %v", n)
return 0
}
dowidth(tr)
base := n.Left.Left
n.Left = typecheck(n.Left, Erv)
+ if n.Left.Type == nil {
+ return 0
+ }
switch n.Left.Op {
case ODOT, ODOTPTR:
break
--- /dev/null
+// 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 main
+
+import "unsafe"
+
+const _ = uint64(unsafe.Offsetof(T{}.F)) // ERROR "undefined"
import "unsafe"
var x struct {
- 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"
+ a [unsafe.Sizeof(x.a)]int // ERROR "array bound|typechecking loop|invalid expression"
}
--- /dev/null
+// 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
+
+import "unsafe"
+
+var x struct {
+ b [unsafe.Offsetof(x.b)]int // ERROR "array bound|typechecking loop|invalid array"
+}
--- /dev/null
+// 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
+
+import "unsafe"
+
+var x struct {
+ c [unsafe.Alignof(x.c)]int // ERROR "array bound|typechecking loop|invalid array"
+}