-
Notifications
You must be signed in to change notification settings - Fork 17.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd/compile: distinguish bound calls/field access in getInstInfo
Given we have support for field access to type params with a single structural type, we need to distinguish between methods calls and field access when we have an OXDOT node on an expression which is a typeparam (or correspondingly a shape). We were missing checks in getInstInfo, which figures out the dictionary format, which then caused problems when we generate the dictionaries. We don't need/want dictionary entries for field access, only for bound method calls. Added a new function isBoundMethod() to distinguish OXDOT nodes which are bound calls vs. field accesses on a shape. Removed isShapeDeref() - we can't have field access or method call on a pointer to variable of type param type. Fixes #50690 Change-Id: Id692f65e6f427f28cd2cfe474dd30e53c71877a7 Reviewed-on: https://go-review.googlesource.com/c/go/+/379674 Trust: Dan Scales <[email protected]> Reviewed-by: Keith Randall <[email protected]>
- Loading branch information
Showing
7 changed files
with
173 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
// run -gcflags=-G=3 | ||
|
||
// Copyright 2022 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. | ||
|
||
package main | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
// Numeric expresses a type constraint satisfied by any numeric type. | ||
type Numeric interface { | ||
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | | ||
~int | ~int8 | ~int16 | ~int32 | ~int64 | | ||
~float32 | ~float64 | | ||
~complex64 | ~complex128 | ||
} | ||
|
||
// Sum returns the sum of the provided arguments. | ||
func Sum[T Numeric](args ...T) T { | ||
var sum T | ||
for i := 0; i < len(args); i++ { | ||
sum += args[i] | ||
} | ||
return sum | ||
} | ||
|
||
// Ledger is an identifiable, financial record. | ||
type Ledger[T ~string, K Numeric] struct { | ||
|
||
// ID identifies the ledger. | ||
ID T | ||
|
||
// Amounts is a list of monies associated with this ledger. | ||
Amounts []K | ||
|
||
// SumFn is a function that can be used to sum the amounts | ||
// in this ledger. | ||
SumFn func(...K) K | ||
} | ||
|
||
func PrintLedger[ | ||
T ~string, | ||
K Numeric, | ||
L ~struct { | ||
ID T | ||
Amounts []K | ||
SumFn func(...K) K | ||
}, | ||
](l L) { | ||
fmt.Printf("%s has a sum of %v\n", l.ID, l.SumFn(l.Amounts...)) | ||
} | ||
|
||
func main() { | ||
PrintLedger(Ledger[string, int]{ | ||
ID: "fake", | ||
Amounts: []int{1, 2, 3}, | ||
SumFn: Sum[int], | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
fake has a sum of 6 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// run -gcflags=-G=3 | ||
|
||
// Copyright 2022 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. | ||
|
||
package main | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
type Printer[T ~string] struct { | ||
PrintFn func(T) | ||
} | ||
|
||
func Print[T ~string](s T) { | ||
fmt.Println(s) | ||
} | ||
|
||
func PrintWithPrinter[T ~string, S ~struct { | ||
ID T | ||
PrintFn func(T) | ||
}](message T, obj S) { | ||
obj.PrintFn(message) | ||
} | ||
|
||
type PrintShop[T ~string] struct { | ||
ID T | ||
PrintFn func(T) | ||
} | ||
|
||
func main() { | ||
PrintWithPrinter( | ||
"Hello, world.", | ||
PrintShop[string]{ | ||
ID: "fake", | ||
PrintFn: Print[string], | ||
}, | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Hello, world. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// run -gcflags=-G=3 | ||
|
||
// Copyright 2022 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. | ||
|
||
package main | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
type Printer[T ~string] struct { | ||
PrintFn func(T) | ||
} | ||
|
||
func Print[T ~string](s T) { | ||
fmt.Println(s) | ||
} | ||
|
||
func PrintWithPrinter[T ~string, S struct { | ||
ID T | ||
PrintFn func(T) | ||
}](message T, obj S) { | ||
obj.PrintFn(message) | ||
} | ||
|
||
func main() { | ||
PrintWithPrinter( | ||
"Hello, world.", | ||
struct { | ||
ID string | ||
PrintFn func(string) | ||
}{ID: "fake", PrintFn: Print[string]}, | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Hello, world. |