blob: 27ae29438fbada6b5b674d0192a520981dbe19f8 [file] [log] [blame]
Rémy Oudompheng2d3216f2013-04-05 21:24:07 +02001// errorcheck
2
Emmanuel Odeke53fd5222016-04-10 14:32:26 -07003// Copyright 2013 The Go Authors. All rights reserved.
Rémy Oudompheng2d3216f2013-04-05 21:24:07 +02004// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Issue 4909: compiler incorrectly accepts unsafe.Offsetof(t.x)
8// where x is a field of an embedded pointer field.
9
10package p
11
12import (
13 "unsafe"
14)
15
16type T struct {
17 A int
18 *B
19}
20
21func (t T) Method() {}
22
23type B struct {
24 X, Y int
25}
26
27var t T
28var p *T
29
Robert Griesemeredf80c42020-12-09 12:28:15 -080030const N1 = unsafe.Offsetof(t.X) // ERROR "indirection|field X is embedded via a pointer in T"
31const N2 = unsafe.Offsetof(p.X) // ERROR "indirection|field X is embedded via a pointer in T"
Rémy Oudompheng2d3216f2013-04-05 21:24:07 +020032const N3 = unsafe.Offsetof(t.B.X) // valid
33const N4 = unsafe.Offsetof(p.B.X) // valid
34const N5 = unsafe.Offsetof(t.Method) // ERROR "method value"
35const N6 = unsafe.Offsetof(p.Method) // ERROR "method value"