"Fossies" - the Fresh Open Source Software Archive

Member "go/test/typeparam/mdempsky/15.go" (26 Apr 2023, 1243 Bytes) of package /linux/misc/go1.20.4.src.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Go source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 // run -goexperiment fieldtrack
    2 
    3 // Copyright 2021 The Go Authors. All rights reserved.
    4 // Use of this source code is governed by a BSD-style
    5 // license that can be found in the LICENSE file.
    6 
    7 // Test that generics, promoted methods, and //go:nointerface
    8 // interoperate as expected.
    9 
   10 package main
   11 
   12 import (
   13     "reflect"
   14 )
   15 
   16 func TypeString[T any]() string {
   17     return reflect.TypeOf(new(T)).Elem().String()
   18 }
   19 
   20 func Test[T, Bad, Good any]() {
   21     switch interface{}(new(T)).(type) {
   22     case Bad:
   23         println("FAIL:", TypeString[T](), "matched", TypeString[Bad]())
   24     case Good:
   25         // ok
   26     default:
   27         println("FAIL:", TypeString[T](), "did not match", TypeString[Good]())
   28     }
   29 }
   30 
   31 func TestE[T any]() { Test[T, interface{ EBad() }, interface{ EGood() }]() }
   32 func TestX[T any]() { Test[T, interface{ XBad() }, interface{ XGood() }]() }
   33 
   34 type E struct{}
   35 
   36 //go:nointerface
   37 func (E) EBad()  {}
   38 func (E) EGood() {}
   39 
   40 type X[T any] struct{ E }
   41 
   42 //go:nointerface
   43 func (X[T]) XBad()  {}
   44 func (X[T]) XGood() {}
   45 
   46 type W struct{ X[int] }
   47 
   48 func main() {
   49     _ = E.EGood
   50     _ = E.EBad
   51 
   52     TestE[E]()
   53 
   54     _ = X[int].EGood
   55     _ = X[int].EBad
   56     _ = X[int].XGood
   57     _ = X[int].XBad
   58 
   59     TestE[X[int]]()
   60     TestX[X[int]]()
   61 
   62     _ = W.EGood
   63     _ = W.EBad
   64     _ = W.XGood
   65     _ = W.XBad
   66 
   67     TestE[W]()
   68     TestX[W]()
   69 }