For #59338.
Change-Id: I8141d421cdc60e47ee5794fc1ca81246bd8a8a25
Reviewed-on: https://go-review.googlesource.com/c/go/+/491475
Reviewed-by: Robert Findley <rfindley@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
}
base.ErrorfAt(m.makeXPos(terr.Pos), terr.Code, "%s", msg)
},
- Importer: &importer,
- Sizes: &gcSizes{},
+ Importer: &importer,
+ Sizes: &gcSizes{},
+ EnableReverseTypeInference: true,
}
info := &types2.Info{
StoreTypesInSyntax: true,
}
file, err := syntax.ParseFile(filename, nil, nil, 0)
if err == nil {
- conf := Config{GoVersion: goVersion, Importer: stdLibImporter}
+ conf := Config{
+ GoVersion: goVersion,
+ Importer: stdLibImporter,
+ EnableReverseTypeInference: true,
+ }
_, err = conf.Check(filename, []*syntax.File{file}, nil)
}
// typecheck package files
conf := Config{
- Error: func(err error) { t.Error(err) },
- Importer: stdLibImporter,
+ Error: func(err error) { t.Error(err) },
+ Importer: stdLibImporter,
+ EnableReverseTypeInference: true,
}
info := Info{Uses: make(map[*syntax.Name]Object)}
conf.Check(path, files, &info)
// parse and type-check file
file, err := parser.ParseFile(fset, filename, nil, 0)
if err == nil {
- conf := Config{GoVersion: goVersion, Importer: stdLibImporter}
+ conf := Config{
+ GoVersion: goVersion,
+ Importer: stdLibImporter,
+ }
+ *boolFieldAddr(&conf, "_EnableReverseTypeInference") = true
_, err = conf.Check(filename, fset, []*ast.File{file}, nil)
}
},
Importer: stdLibImporter,
}
+ *boolFieldAddr(&conf, "_EnableReverseTypeInference") = true
info := Info{Uses: make(map[*ast.Ident]Object)}
conf.Check(path, fset, files, &info)
--- /dev/null
+// 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.
+
+// Smoke test for reverse type inference.
+// The type checker has more expansive tests.
+
+package main
+
+func main() {
+ var f1 func(int) int
+ f1 = g1
+ if f1(1) != g1(1) {
+ panic(1)
+ }
+
+ var f2 func(int) string = g2
+ if f2(2) != "" {
+ panic(2)
+ }
+
+ // Disabled for now - requires some noder work
+ // TODO fix this
+ // if g3(g1, 3) != g1(3) {
+ // panic(3)
+ // }
+
+ // if g4(g2, 4) != "" {
+ // panic(4)
+ // }
+}
+
+func g1[P any](x P) P { return x }
+func g2[P, Q any](x P) Q { var q Q; return q }
+
+func g3(f1 func(int) int, x int) int { return f1(x) }
+func g4(f2 func(int) string, x int) string { return f2(x) }