| //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] |