// Copyright 2020 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package fillreturns import ( "errors" "go/ast" ast2 "go/ast" "io" "net/http" . "net/http" "net/url" "strconv" ) type T struct{} type T1 = T type I interface{} type I1 = I type z func(string, http.Handler) error func x() error { return errors.New("foo") } func b() (string, int, error) { return "", errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)" } func c() (string, int, error) { return 7, errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)" } func d() (string, int, error) { return "", 7 // want "wrong number of return values \\(want 3, got 2\\)" } func e() (T, error, *bool) { return (z(http.ListenAndServe))("", nil) // want "wrong number of return values \\(want 3, got 1\\)" } func preserveLeft() (int, int, error) { return 1, errors.New("foo") // want "wrong number of return values \\(want 3, got 2\\)" } func matchValues() (int, error, string) { return errors.New("foo"), 3 // want "wrong number of return values \\(want 3, got 2\\)" } func preventDataOverwrite() (int, string) { return errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)" } func closure() (string, error) { _ = func() (int, error) { return // want "wrong number of return values \\(want 2, got 0\\)" } return // want "wrong number of return values \\(want 2, got 0\\)" } func basic() (uint8, uint16, uint32, uint64, int8, int16, int32, int64, float32, float64, complex64, complex128, byte, rune, uint, int, uintptr, string, bool, error) { return // want "wrong number of return values \\(want 20, got 0\\)" } func complex() (*int, []int, [2]int, map[int]int) { return // want "wrong number of return values \\(want 4, got 0\\)" } func structsAndInterfaces() (T, url.URL, T1, I, I1, io.Reader, Client, ast2.Stmt) { return // want "wrong number of return values \\(want 8, got 0\\)" } func m() (int, error) { if 1 == 2 { return // want "wrong number of return values \\(want 2, got 0\\)" } else if 1 == 3 { return errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)" } else { return 1 // want "wrong number of return values \\(want 2, got 1\\)" } return // want "wrong number of return values \\(want 2, got 0\\)" } func convertibleTypes() (ast2.Expr, int) { return &ast2.ArrayType{} // want "wrong number of return values \\(want 2, got 1\\)" } func assignableTypes() (map[string]int, int) { type X map[string]int var x X return x // want "wrong number of return values \\(want 2, got 1\\)" } func interfaceAndError() (I, int) { return errors.New("foo") // want "wrong number of return values \\(want 2, got 1\\)" } func funcOneReturn() (string, error) { return strconv.Itoa(1) // want "wrong number of return values \\(want 2, got 1\\)" } func funcMultipleReturn() (int, error, string) { return strconv.Atoi("1") } func localFuncMultipleReturn() (string, int, error, string) { return b() } func multipleUnused() (int, string, string, string) { return 3, 4, 5 // want "wrong number of return values \\(want 4, got 3\\)" } func gotTooMany() int { if true { return 0, "" // want "wrong number of return values \\(want 1, got 2\\)" } else { return 1, 0, nil // want "wrong number of return values \\(want 1, got 3\\)" } return 0, 5, false // want "wrong number of return values \\(want 1, got 3\\)" } func fillVars() (int, string, ast.Node, bool, error) { eint := 0 s := "a" var t bool if true { err := errors.New("fail") return // want "wrong number of return values \\(want 5, got 0\\)" } n := ast.NewIdent("ident") int := 3 var b bool return "" // want "wrong number of return values \\(want 5, got 1\\)" }