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