| //go:build ignore |
| // +build ignore |
| |
| package main |
| |
| import ( |
| "fmt" |
| "os" |
| ) |
| |
| type S[T any] struct{ t T } |
| |
| var theSint S[int] |
| var theSbool S[bool] |
| |
| func (s *S[T]) String() string { |
| print(s) // @pointsto command-line-arguments.theSbool | command-line-arguments.theSint |
| return "" |
| } |
| |
| func Type[T any]() { |
| var x *T |
| print(x) // @types *int | *bool |
| } |
| |
| func Caller[T any]() { |
| var s *S[T] |
| _ = s.String() |
| } |
| |
| var a int |
| var b bool |
| |
| type t[T any] struct { |
| a *map[string]chan *T |
| } |
| |
| func fn[T any](a *T) { |
| m := make(map[string]chan *T) |
| m[""] = make(chan *T, 1) |
| m[""] <- a |
| x := []t[T]{t[T]{a: &m}} |
| print(x) // @pointstoquery <-(*x[i].a)[key] command-line-arguments.a | command-line-arguments.b |
| } |
| |
| func main() { |
| // os.Args is considered intrinsically allocated, |
| // but may also be set explicitly (e.g. on Windows), hence '...'. |
| print(os.Args) // @pointsto <command-line args> | ... |
| fmt.Println("Hello!", &theSint) |
| fmt.Println("World!", &theSbool) |
| |
| Type[int]() // call |
| f := Type[bool] // call through a variable |
| _ = Type[string] // not called so will not appear in Type's print. |
| f() |
| |
| Caller[int]() |
| Caller[bool]() |
| |
| fn(&a) |
| fn(&b) |
| } |
| |
| // @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[int]).String[int] |
| // @calls (*fmt.pp).handleMethods -> (*command-line-arguments.S[bool]).String[bool] |
| // @calls command-line-arguments.Caller[int] -> (*command-line-arguments.S[int]).String[int] |
| // @calls command-line-arguments.Caller[bool] -> (*command-line-arguments.S[bool]).String[bool] |