On Mon, Dec 18, 2023 at 5:32 PM Ian Lance Taylor <i...@golang.org> wrote: > > This Go frontend patch moves the lowering pass after the type > determination and the type checking passes. This lets us simplify > some of the code that determines the type of an expression, which > previously had to work correctly both before and after type > determination. > > I'm doing this to help with future generic support. For example, with > generics, we can see code like > > func ident[T any](v T) T { return v } > > func F() int32 { > s := int32(1) > return ident(s) > } > > Before this change, we would type check return statements in the > lowering pass (see Return_statement::do_lower). With a generic > example like the above, that means we have to determine the type of s, > and use that to infer the type arguments passed to ident, and use that > to determine the result type of ident. That is too much to do at > lowering time. Of course we can change the way that return statements > work, but similar issues arise with index expressions, the types of > closures for function literals, and probably other cases as well. > > Rather than try to deal with all those cases, we move the lowering > pass after type checking. This requires a bunch of changes, notably > for determining constant types. We have to add type checking for > various constructs that formerly disappeared in the lowering pass. So > it's a lot of shuffling. Sorry for the size of the patch. > > Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu. Committed > to mainline.
Sorry, I forgot to commit the changes to some of the test files. I've committed this patch to fix them. This fixes PR 113447. Ian
3d7820c58f9466a80916dfa50dcdfde457b4c597 diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue20185.go b/gcc/testsuite/go.test/test/fixedbugs/issue20185.go index 9065868d7f2..24d74f09126 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/issue20185.go +++ b/gcc/testsuite/go.test/test/fixedbugs/issue20185.go @@ -10,7 +10,7 @@ package p func F() { - switch t := nil.(type) { // ERROR "cannot type switch on non-interface value" + switch t := nil.(type) { // ERROR "cannot type switch on non-interface value|defined to nil type" default: _ = t } diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue33386.go b/gcc/testsuite/go.test/test/fixedbugs/issue33386.go index 7b2f565285e..c5073910a4c 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/issue33386.go +++ b/gcc/testsuite/go.test/test/fixedbugs/issue33386.go @@ -18,7 +18,7 @@ func _() { func _() { defer func() { // no error here about deferred function - 1 + // GCCGO_ERROR "value computed is not used" + 1 + }() // ERROR "expecting expression|expected operand" } diff --git a/gcc/testsuite/go.test/test/fixedbugs/issue4085a.go b/gcc/testsuite/go.test/test/fixedbugs/issue4085a.go index 200290a081d..f457fcf2b12 100644 --- a/gcc/testsuite/go.test/test/fixedbugs/issue4085a.go +++ b/gcc/testsuite/go.test/test/fixedbugs/issue4085a.go @@ -10,9 +10,9 @@ type T []int func main() { _ = make(T, -1) // ERROR "negative" - _ = make(T, 0.5) // ERROR "constant 0.5 truncated to integer|non-integer len argument" + _ = make(T, 0.5) // ERROR "truncated to integer|non-integer len argument" _ = make(T, 1.0) // ok - _ = make(T, 1<<63) // ERROR "len argument too large" + _ = make(T, 1<<63) // ERROR "integer constant overflow|len argument too large" _ = make(T, 0, -1) // ERROR "negative cap" _ = make(T, 10, 0) // ERROR "len larger than cap" } diff --git a/gcc/testsuite/go.test/test/shift1.go b/gcc/testsuite/go.test/test/shift1.go index d6a6c38839f..3b1aa9e6900 100644 --- a/gcc/testsuite/go.test/test/shift1.go +++ b/gcc/testsuite/go.test/test/shift1.go @@ -189,12 +189,12 @@ func _() { var m1 map[int]string delete(m1, 1<<s) delete(m1, 1.<<s) - delete(m1, 1.1<<s) // ERROR "truncated|shift of type float64" + delete(m1, 1.1<<s) // ERROR "truncated|shift of type float64|incompatible|non-integer" var m2 map[float32]string - delete(m2, 1<<s) // ERROR "invalid|cannot use 1 << s as type float32" - delete(m2, 1.<<s) // ERROR "invalid|cannot use 1 << s as type float32" - delete(m2, 1.1<<s) // ERROR "invalid|cannot use 1.1 << s as type float32" + delete(m2, 1<<s) // ERROR "invalid|cannot use 1 << s as type float32|incompatible" + delete(m2, 1.<<s) // ERROR "invalid|cannot use 1 << s as type float32|incompatible" + delete(m2, 1.1<<s) // ERROR "invalid|cannot use 1.1 << s as type float32|incompatible" } // shifts of shifts