// Copyright 2018 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.

// This file contains tests for the unmarshal checker.

package testdata

import (
	"encoding/gob"
	"encoding/json"
	"encoding/xml"
	"io"
)

func _() {
	type t struct {
		a int
	}
	var v t
	var r io.Reader

	json.Unmarshal([]byte{}, v) // want "call of Unmarshal passes non-pointer as second argument"
	json.Unmarshal([]byte{}, &v)
	json.NewDecoder(r).Decode(v) // want "call of Decode passes non-pointer"
	json.NewDecoder(r).Decode(&v)
	gob.NewDecoder(r).Decode(v) // want "call of Decode passes non-pointer"
	gob.NewDecoder(r).Decode(&v)
	xml.Unmarshal([]byte{}, v) // want "call of Unmarshal passes non-pointer as second argument"
	xml.Unmarshal([]byte{}, &v)
	xml.NewDecoder(r).Decode(v) // want "call of Decode passes non-pointer"
	xml.NewDecoder(r).Decode(&v)

	var p *t
	json.Unmarshal([]byte{}, p)
	json.Unmarshal([]byte{}, *p) // want "call of Unmarshal passes non-pointer as second argument"
	json.NewDecoder(r).Decode(p)
	json.NewDecoder(r).Decode(*p) // want "call of Decode passes non-pointer"
	gob.NewDecoder(r).Decode(p)
	gob.NewDecoder(r).Decode(*p) // want "call of Decode passes non-pointer"
	xml.Unmarshal([]byte{}, p)
	xml.Unmarshal([]byte{}, *p) // want "call of Unmarshal passes non-pointer as second argument"
	xml.NewDecoder(r).Decode(p)
	xml.NewDecoder(r).Decode(*p) // want "call of Decode passes non-pointer"

	var i interface{}
	json.Unmarshal([]byte{}, i)
	json.NewDecoder(r).Decode(i)

	json.Unmarshal([]byte{}, nil)               // want "call of Unmarshal passes non-pointer as second argument"
	json.Unmarshal([]byte{}, []t{})             // want "call of Unmarshal passes non-pointer as second argument"
	json.Unmarshal([]byte{}, map[string]int{})  // want "call of Unmarshal passes non-pointer as second argument"
	json.NewDecoder(r).Decode(nil)              // want "call of Decode passes non-pointer"
	json.NewDecoder(r).Decode([]t{})            // want "call of Decode passes non-pointer"
	json.NewDecoder(r).Decode(map[string]int{}) // want "call of Decode passes non-pointer"

	json.Unmarshal(func() ([]byte, interface{}) { return []byte{}, v }())
}
