| // run | |
| // Copyright 2023 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. | |
| // The gofrontend used to mishandle this code due to a pass ordering issue. | |
| // It was inconsistent as to whether unsafe.Sizeof(byte(0)) was a constant, | |
| // and therefore as to whether it was a direct-iface type. | |
| package main | |
| import "unsafe" | |
| type A [unsafe.Sizeof(byte(0))]*byte | |
| func (r A) V() byte { | |
| return *r[0] | |
| } | |
| func F() byte { | |
| panic("F") // should never be called | |
| } | |
| type B [unsafe.Sizeof(F())]*byte | |
| func (r B) V() byte { | |
| return *r[0] | |
| } | |
| func main() { | |
| b := byte(1) | |
| v := A{&b}.V() + B{&b}.V() | |
| if v != 2 { | |
| panic(v) | |
| } | |
| } |