Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd/compile: fix noder.Addr() to not call typechecker
Simple change to avoid calling the old typechecker in noder.Addr(). This fixes cases where generic code calls a pointer method with a non-pointer receiver. Added test typeparam/lockable.go that now works with this change. For lockable.go to work, also fix incorrect check to decide whether to translate an OXDOT now or later. We should delay translating an OXDOT until instantiation (because we don't know how embedding, etc. will work) if the receiver has any typeparam, not just if the receiver type is a simple typeparam. We also have to handle OXDOT for now in IsAddressable(), until we can remove calls to the old typechecker in (*irgen).funcBody(). Change-Id: I77ee5efcef9a8f6c7133564106a32437e36ba4bb Reviewed-on: https://go-review.googlesource.com/c/go/+/300990 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Dan Scales <danscales@google.com> Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
- Loading branch information
Showing
4 changed files
with
64 additions
and
4 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
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,50 @@ | ||
// run -gcflags=-G=3 | ||
|
||
// Copyright 2021 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 "sync" | ||
|
||
// A _Lockable is a value that may be safely simultaneously accessed | ||
// from multiple goroutines via the Get and Set methods. | ||
type _Lockable[T any] struct { | ||
T | ||
mu sync.Mutex | ||
} | ||
|
||
// Get returns the value stored in a _Lockable. | ||
func (l *_Lockable[T]) get() T { | ||
l.mu.Lock() | ||
defer l.mu.Unlock() | ||
return l.T | ||
} | ||
|
||
// set sets the value in a _Lockable. | ||
func (l *_Lockable[T]) set(v T) { | ||
l.mu.Lock() | ||
defer l.mu.Unlock() | ||
l.T = v | ||
} | ||
|
||
func main() { | ||
sl := _Lockable[string]{T: "a"} | ||
if got := sl.get(); got != "a" { | ||
panic(got) | ||
} | ||
sl.set("b") | ||
if got := sl.get(); got != "b" { | ||
panic(got) | ||
} | ||
|
||
il := _Lockable[int]{T: 1} | ||
if got := il.get(); got != 1 { | ||
panic(got) | ||
} | ||
il.set(2) | ||
if got := il.get(); got != 2 { | ||
panic(got) | ||
} | ||
} |