Commit efa9efe8 authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: silence unnecessary unsafe error

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: 's avatarDaniel Martí <mvdan@mvdan.cc>
Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
parent 54fa10a9
......@@ -12,7 +12,6 @@ func evalunsafe(n *Node) int64 {
n.Left = defaultlit(n.Left, nil)
tr := n.Left.Type
if tr == nil {
yyerror("invalid expression %v", n)
return 0
}
dowidth(tr)
......@@ -35,6 +34,9 @@ func evalunsafe(n *Node) int64 {
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
......
// 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"
......@@ -11,7 +11,5 @@ package main
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"
}
// 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"
}
// 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"
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment