]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: silence unnecessary unsafe error
authorMatthew Dempsky <mdempsky@google.com>
Fri, 20 Oct 2017 18:01:43 +0000 (11:01 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 24 Oct 2017 02:28:02 +0000 (02:28 +0000)
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>
src/cmd/compile/internal/gc/unsafe.go
test/fixedbugs/issue22351.go [new file with mode: 0644]
test/fixedbugs/issue7525.go
test/fixedbugs/issue7525d.go [new file with mode: 0644]
test/fixedbugs/issue7525e.go [new file with mode: 0644]

index 0ae97b454c196d7a2c5874b62f133e14b770a917..14ab33b0b6c9b4253280a3bb9f9f7ce032b224b7 100644 (file)
@@ -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
diff --git a/test/fixedbugs/issue22351.go b/test/fixedbugs/issue22351.go
new file mode 100644 (file)
index 0000000..e46a0fb
--- /dev/null
@@ -0,0 +1,11 @@
+// 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"
index 6e6959312e500938e6ea65ac31e42c67156893bb..fcfab7236a5edc09150534c9091e796fe3e73b9f 100644 (file)
@@ -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"
 }
diff --git a/test/fixedbugs/issue7525d.go b/test/fixedbugs/issue7525d.go
new file mode 100644 (file)
index 0000000..141d675
--- /dev/null
@@ -0,0 +1,15 @@
+// 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"
+}
diff --git a/test/fixedbugs/issue7525e.go b/test/fixedbugs/issue7525e.go
new file mode 100644 (file)
index 0000000..c13194c
--- /dev/null
@@ -0,0 +1,15 @@
+// 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"
+}