Skip to content

Commit

Permalink
go/types, cmd/compile/internal/types2: use regular type printing for …
Browse files Browse the repository at this point in the history
…unsafe.Pointer

Type string printing special-cased printing of unsafe.Pointer because
it's a built-in type; yet it's declared in a package like any other
imported or used-defined type (unlike built-in types such as int).

Use the same mechanism for printing unsafe.Pointer like any other
(non-basic) type. This will make it possible to use the package
Qualifier if so desired.

Fixes #44515.

Change-Id: I0dd1026f850737ecfc4bb99135cfb8e3c18be9e7
Reviewed-on: https://go-review.googlesource.com/c/go/+/295271
Trust: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
  • Loading branch information
griesemer committed Feb 23, 2021
1 parent 5a0e4fc commit a2e150c
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 4 deletions.
22 changes: 22 additions & 0 deletions src/cmd/compile/internal/types2/issues_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -546,3 +546,25 @@ func TestIssue43088(t *testing.T) {
Comparable(T1)
Comparable(T2)
}

func TestIssue44515(t *testing.T) {
typ := Unsafe.Scope().Lookup("Pointer").Type()

got := TypeString(typ, nil)
want := "unsafe.Pointer"
if got != want {
t.Errorf("got %q; want %q", got, want)
}

qf := func(pkg *Package) string {
if pkg == Unsafe {
return "foo"
}
return ""
}
got = TypeString(typ, qf)
want = "foo.Pointer"
if got != want {
t.Errorf("got %q; want %q", got, want)
}
}
10 changes: 8 additions & 2 deletions src/cmd/compile/internal/types2/typestring.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,15 @@ func writeType(buf *bytes.Buffer, typ Type, qf Qualifier, visited []Type) {
buf.WriteString("<nil>")

case *Basic:
if t.kind == UnsafePointer {
buf.WriteString("unsafe.")
// exported basic types go into package unsafe
// (currently this is just unsafe.Pointer)
if isExported(t.name) {
if obj, _ := Unsafe.scope.Lookup(t.name).(*TypeName); obj != nil {
writeTypeName(buf, obj, qf)
break
}
}

if gcCompatibilityMode {
// forget the alias names
switch t.kind {
Expand Down
22 changes: 22 additions & 0 deletions src/go/types/issues_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -549,3 +549,25 @@ func TestIssue43088(t *testing.T) {
Comparable(T1)
Comparable(T2)
}

func TestIssue44515(t *testing.T) {
typ := Unsafe.Scope().Lookup("Pointer").Type()

got := TypeString(typ, nil)
want := "unsafe.Pointer"
if got != want {
t.Errorf("got %q; want %q", got, want)
}

qf := func(pkg *Package) string {
if pkg == Unsafe {
return "foo"
}
return ""
}
got = TypeString(typ, qf)
want = "foo.Pointer"
if got != want {
t.Errorf("got %q; want %q", got, want)
}
}
11 changes: 9 additions & 2 deletions src/go/types/typestring.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package types
import (
"bytes"
"fmt"
"go/token"
"unicode/utf8"
)

Expand Down Expand Up @@ -98,9 +99,15 @@ func writeType(buf *bytes.Buffer, typ Type, qf Qualifier, visited []Type) {
buf.WriteString("<nil>")

case *Basic:
if t.kind == UnsafePointer {
buf.WriteString("unsafe.")
// exported basic types go into package unsafe
// (currently this is just unsafe.Pointer)
if token.IsExported(t.name) {
if obj, _ := Unsafe.scope.Lookup(t.name).(*TypeName); obj != nil {
writeTypeName(buf, obj, qf)
break
}
}

if gcCompatibilityMode {
// forget the alias names
switch t.kind {
Expand Down

0 comments on commit a2e150c

Please sign in to comment.