diff --git a/src/weak/pointer.go b/src/weak/pointer.go index 50af0c2fdc0a16..39c512e76d6fe4 100644 --- a/src/weak/pointer.go +++ b/src/weak/pointer.go @@ -78,6 +78,9 @@ func Make[T any](ptr *T) Pointer[T] { // If a weak pointer points to an object with a finalizer, then Value will // return nil as soon as the object's finalizer is queued for execution. func (p Pointer[T]) Value() *T { + if p.u == nil { + return nil + } return (*T)(runtime_makeStrongFromWeak(p.u)) } diff --git a/src/weak/pointer_test.go b/src/weak/pointer_test.go index 002b4130f0b553..e0ef30377e9e81 100644 --- a/src/weak/pointer_test.go +++ b/src/weak/pointer_test.go @@ -21,6 +21,15 @@ type T struct { } func TestPointer(t *testing.T) { + var zero weak.Pointer[T] + if zero.Value() != nil { + t.Error("Value of zero value of weak.Pointer is not nil") + } + zeroNil := weak.Make[T](nil) + if zeroNil.Value() != nil { + t.Error("Value of weak.Make[T](nil) is not nil") + } + bt := new(T) wt := weak.Make(bt) if st := wt.Value(); st != bt { @@ -41,6 +50,12 @@ func TestPointer(t *testing.T) { } func TestPointerEquality(t *testing.T) { + var zero weak.Pointer[T] + zeroNil := weak.Make[T](nil) + if zero != zeroNil { + t.Error("weak.Make[T](nil) != zero value of weak.Pointer[T]") + } + bt := make([]*T, 10) wt := make([]weak.Pointer[T], 10) wo := make([]weak.Pointer[int], 10)