As I was trying to allude to, the _ can come from any instantiation of a generic function, type, or trait impl. So to clarify, you mean that any type parameter in an enum should be forbidden?
impl<A> Trait for enum(A) { ... } // forbidden
impl<A, B> Trait for enum(A, B) { ... } // forbidden
impl<A> Trait for enum(A, i32) { ... } // forbidden
impl<A> Trait for enum(Vec<A>, i32) { ... } // forbidden
// similarly
fn function(x: enum(A, i32)) { ... } // forbidden
fn function<A>(x: enum(Vec<A>, i32)) { ... } // forbidden
or any bare type parameter?
impl<A> Trait for enum(A) { ... } // forbidden
impl<A, B> Trait for enum(A, B) { ... } // forbidden
impl<A> Trait for enum(A, i32) { ... } // forbidden
impl<A> Trait for enum(Vec<A>, i32) { ... } // ok
// similarly
fn function<A>(x: enum(A, i32)) { ... } // forbidden
fn function<A>(x: enum(Vec<A>, i32)) { ... } // ok
In either case, I’m not sure why you would bother even having the enum(enum(A)) = enum(A) rule.
My gut instinct, which I’m currently trying to work out an example for, is that an idempotent type constructor like enum (i.e. one that satisfies enum(enum(A)) = enum(A) is incompatible with type inference, unless you do something outlandish like forbidding the above examples.