For gosh sakes, don't make us read code with the scrutiny of a compiler :-) A type declaration after a function name is confusingly similar to an argument list.
Which witch is which?
func Stuff(type T Something)(input T) error { ... }
func Stuffed(input Somethingelse) error { ... }
C++ style is fine; variations on paren placement can be considered
(type T, U) Something // line break or semicolon
(type V) // more on next line
func Stuff(input T, more U, other V) error { ... }
And consider simple function aliases for callers
func TypedStuff Stuff(TypeA, TypeB, TypeC)
const TypedStuff = Stuff(TypeA, TypeB, TypeC) // alternatively
err = TypedStuff(x, y, z)
I initially had the same issue after reading the proposal. However, there is a certain appeal in reusing the function call syntax.
If I had to change it, I'd votre for square brackets, same in the older drafts (placement notwithstanding):
func Stuff[type T Something](input T) error { ... }
func Stuffed(input Somethingelse) error { ... }