1// Copyright 2020 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package fillreturns
6
7import (
8	"errors"
9	"go/ast"
10	ast2 "go/ast"
11	"io"
12	"net/http"
13	. "net/http"
14	"net/url"
15	"strconv"
16)
17
18type T struct{}
19type T1 = T
20type I interface{}
21type I1 = I
22type z func(string, http.Handler) error
23
24func x() error {
25	return errors.New("foo")
26}
27
28func b() (string, int, error) {
29	return "", 0, errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)"
30}
31
32func c() (string, int, error) {
33	return "", 7, errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)"
34}
35
36func d() (string, int, error) {
37	return "", 7, nil // want "wrong number of return values \\(want 3, got 2\\)"
38}
39
40func e() (T, error, *bool) {
41	return T{}, (z(http.ListenAndServe))("", nil), nil // want "wrong number of return values \\(want 3, got 1\\)"
42}
43
44func preserveLeft() (int, int, error) {
45	return 1, 0, errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)"
46}
47
48func matchValues() (int, error, string) {
49	return 3, errors.New("foo"), "" // want "wrong number of return values \\(want 3, got 2\\)"
50}
51
52func preventDataOverwrite() (int, string) {
53	return 0, "", errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)"
54}
55
56func closure() (string, error) {
57	_ = func() (int, error) {
58		return 0, nil // want "wrong number of return values \\(want 2, got 0\\)"
59	}
60	return "", nil // want "wrong number of return values \\(want 2, got 0\\)"
61}
62
63func basic() (uint8, uint16, uint32, uint64, int8, int16, int32, int64, float32, float64, complex64, complex128, byte, rune, uint, int, uintptr, string, bool, error) {
64	return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", false, nil // want "wrong number of return values \\(want 20, got 0\\)"
65}
66
67func complex() (*int, []int, [2]int, map[int]int) {
68	return nil, nil, nil, nil // want "wrong number of return values \\(want 4, got 0\\)"
69}
70
71func structsAndInterfaces() (T, url.URL, T1, I, I1, io.Reader, Client, ast2.Stmt) {
72	return T{}, url.URL{}, T{}, nil, nil, nil, Client{}, nil // want "wrong number of return values \\(want 8, got 0\\)"
73}
74
75func m() (int, error) {
76	if 1 == 2 {
77		return 0, nil // want "wrong number of return values \\(want 2, got 0\\)"
78	} else if 1 == 3 {
79		return 0, errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)"
80	} else {
81		return 1, nil // want "wrong number of return values \\(want 2, got 1\\)"
82	}
83	return 0, nil // want "wrong number of return values \\(want 2, got 0\\)"
84}
85
86func convertibleTypes() (ast2.Expr, int) {
87	return &ast2.ArrayType{}, 0 // want "wrong number of return values \\(want 2, got 1\\)"
88}
89
90func assignableTypes() (map[string]int, int) {
91	type X map[string]int
92	var x X
93	return x, 0 // want "wrong number of return values \\(want 2, got 1\\)"
94}
95
96func interfaceAndError() (I, int) {
97	return errors.New("foo"), 0 // want "wrong number of return values \\(want 2, got 1\\)"
98}
99
100func funcOneReturn() (string, error) {
101	return strconv.Itoa(1), nil // want "wrong number of return values \\(want 2, got 1\\)"
102}
103
104func funcMultipleReturn() (int, error, string) {
105	return strconv.Atoi("1")
106}
107
108func localFuncMultipleReturn() (string, int, error, string) {
109	return b()
110}
111
112func multipleUnused() (int, string, string, string) {
113	return 3, "", "", "", 4, 5 // want "wrong number of return values \\(want 4, got 3\\)"
114}
115
116func gotTooMany() int {
117	if true {
118		return 0 // want "wrong number of return values \\(want 1, got 2\\)"
119	} else {
120		return 1 // want "wrong number of return values \\(want 1, got 3\\)"
121	}
122	return 5 // want "wrong number of return values \\(want 1, got 3\\)"
123}
124
125func fillVars() (int, string, ast.Node, bool, error) {
126	eint := 0
127	s := "a"
128	var t bool
129	if true {
130		err := errors.New("fail")
131		return eint, s, nil, false, err // want "wrong number of return values \\(want 5, got 0\\)"
132	}
133	n := ast.NewIdent("ident")
134	int := 3
135	var b bool
136	return int, "", n, b, nil // want "wrong number of return values \\(want 5, got 1\\)"
137}
138