internal/lsp/analysis/fillstruct: correct pointer to builtin values

The current implementation correctly calls 'new' when filling a
pointer to a builtin type.

Fixes: golang/go#39854
Change-Id: I0c2b27bb57fd865c4376279059ad060608d48ba3
Reviewed-on: https://go-review.googlesource.com/c/tools/+/239978
Run-TryBot: Josh Baum <joshbaum@google.com>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/internal/lsp/analysis/fillstruct/fillstruct.go b/internal/lsp/analysis/fillstruct/fillstruct.go
index 8f13b8b..91d8963 100644
--- a/internal/lsp/analysis/fillstruct/fillstruct.go
+++ b/internal/lsp/analysis/fillstruct/fillstruct.go
@@ -346,9 +346,23 @@
 			Body: &ast.BlockStmt{},
 		}
 	case *types.Pointer:
-		return &ast.UnaryExpr{
-			Op: token.AND,
-			X:  populateValue(fset, f, pkg, u.Elem()),
+		switch u.Elem().(type) {
+		case *types.Basic:
+			return &ast.CallExpr{
+				Fun: &ast.Ident{
+					Name: "new",
+				},
+				Args: []ast.Expr{
+					&ast.Ident{
+						Name: u.Elem().String(),
+					},
+				},
+			}
+		default:
+			return &ast.UnaryExpr{
+				Op: token.AND,
+				X:  populateValue(fset, f, pkg, u.Elem()),
+			}
 		}
 	case *types.Interface:
 		return ast.NewIdent("nil")
diff --git a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go
index 8358383..bf62a2d 100644
--- a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go
+++ b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go
@@ -89,3 +89,11 @@
 }
 
 var _ = importedStruct{} // want ""
+
+type pointerBuiltinStruct struct {
+	b *bool
+	s *string
+	i *int
+}
+
+var _ = pointerBuiltinStruct{} // want ""
diff --git a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden
index 2f52bf5..8ef6b9a 100644
--- a/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden
+++ b/internal/lsp/analysis/fillstruct/testdata/src/a/a.go.golden
@@ -125,3 +125,15 @@
 	},
 	st: ast.CompositeLit{},
 } // want ""
+
+type pointerBuiltinStruct struct {
+	b *bool
+	s *string
+	i *int
+}
+
+var _ = pointerBuiltinStruct{
+	b: new(bool),
+	s: new(string),
+	i: new(int),
+} // want ""