// run -gcflags=-G=3

// Copyright 2021 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 main

import (
	"fmt"
	"reflect"
)

type Number interface {
	type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64
}

type MySlice []int
type MyFloatSlice []float64

type _SliceOf[E any] interface {
	type []E
}

func _DoubleElems[S _SliceOf[E], E Number](s S) S {
	r := make(S, len(s))
	for i, v := range s {
		r[i] = v + v
	}
	return r
}

// Test use of untyped constant in an expression with a generically-typed parameter
func _DoubleElems2[S _SliceOf[E], E Number](s S) S {
	r := make(S, len(s))
	for i, v := range s {
		r[i] = v * 2
	}
	return r
}

func main() {
	arg := MySlice{1, 2, 3}
	want := MySlice{2, 4, 6}
	got := _DoubleElems[MySlice, int](arg)
	if !reflect.DeepEqual(got, want) {
                panic(fmt.Sprintf("got %s, want %s", got, want))
	}

	// constraint type inference
	got = _DoubleElems[MySlice](arg)
	if !reflect.DeepEqual(got, want) {
                panic(fmt.Sprintf("got %s, want %s", got, want))
	}

	got = _DoubleElems(arg)
	if !reflect.DeepEqual(got, want) {
                panic(fmt.Sprintf("got %s, want %s", got, want))
	}

	farg := MyFloatSlice{1.2, 2.0, 3.5}
	fwant := MyFloatSlice{2.4, 4.0, 7.0}
	fgot := _DoubleElems(farg)
	if !reflect.DeepEqual(fgot, fwant) {
                panic(fmt.Sprintf("got %s, want %s", fgot, fwant))
	}

	fgot = _DoubleElems2(farg)
	if !reflect.DeepEqual(fgot, fwant) {
                panic(fmt.Sprintf("got %s, want %s", fgot, fwant))
	}
}
