|  | //! A simple test for testing many permutations of allowedness of | 
|  | //! impl Trait | 
|  | #![feature(impl_trait_in_fn_trait_return)] | 
|  | #![feature(custom_inner_attributes)] | 
|  | #![rustfmt::skip] | 
|  | use std::fmt::Debug; | 
|  |  | 
|  | // Allowed | 
|  | fn in_parameters(_: impl Debug) { panic!() } | 
|  |  | 
|  | // Allowed | 
|  | fn in_return() -> impl Debug { panic!() } | 
|  |  | 
|  | // Allowed | 
|  | fn in_adt_in_parameters(_: Vec<impl Debug>) { panic!() } | 
|  |  | 
|  | // Disallowed | 
|  | fn in_fn_parameter_in_parameters(_: fn(impl Debug)) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in `fn` pointer | 
|  |  | 
|  | // Disallowed | 
|  | fn in_fn_return_in_parameters(_: fn() -> impl Debug) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in `fn` pointer | 
|  |  | 
|  | // Disallowed | 
|  | fn in_fn_parameter_in_return() -> fn(impl Debug) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in `fn` pointer | 
|  |  | 
|  | // Disallowed | 
|  | fn in_fn_return_in_return() -> fn() -> impl Debug { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in `fn` pointer | 
|  |  | 
|  | // Disallowed | 
|  | fn in_dyn_Fn_parameter_in_parameters(_: &dyn Fn(impl Debug)) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the parameters of `Fn` trait bounds | 
|  |  | 
|  | // Disallowed | 
|  | fn in_dyn_Fn_return_in_parameters(_: &dyn Fn() -> impl Debug) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the return type of `Fn` trait bounds | 
|  |  | 
|  | // Disallowed | 
|  | fn in_dyn_Fn_parameter_in_return() -> &'static dyn Fn(impl Debug) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the parameters of `Fn` trait bounds | 
|  |  | 
|  | // Allowed (but it's still ambiguous; nothing constrains the RPIT in this body). | 
|  | fn in_dyn_Fn_return_in_return() -> &'static dyn Fn() -> impl Debug { panic!() } | 
|  | //~^ ERROR: type annotations needed | 
|  |  | 
|  | // Disallowed | 
|  | fn in_impl_Fn_parameter_in_parameters(_: &impl Fn(impl Debug)) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the parameters of `Fn` trait bounds | 
|  | //~^^ ERROR nested `impl Trait` is not allowed | 
|  |  | 
|  | // Disallowed | 
|  | fn in_impl_Fn_return_in_parameters(_: &impl Fn() -> impl Debug) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the return type of `Fn` trait bounds | 
|  |  | 
|  | // Disallowed | 
|  | fn in_impl_Fn_parameter_in_return() -> &'static impl Fn(impl Debug) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the parameters of `Fn` trait bounds | 
|  | //~| ERROR nested `impl Trait` is not allowed | 
|  |  | 
|  | // Allowed | 
|  | fn in_impl_Fn_return_in_return() -> &'static impl Fn() -> impl Debug { panic!() } | 
|  | //~^ ERROR: type annotations needed | 
|  |  | 
|  | // Disallowed | 
|  | fn in_Fn_parameter_in_generics<F: Fn(impl Debug)> (_: F) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the parameters of `Fn` trait bounds | 
|  |  | 
|  | // Disallowed | 
|  | fn in_Fn_return_in_generics<F: Fn() -> impl Debug> (_: F) { panic!() } | 
|  | //~^ ERROR `impl Trait` is not allowed in the return type of `Fn` trait bounds | 
|  |  | 
|  |  | 
|  | // Allowed | 
|  | fn in_impl_Trait_in_parameters(_: impl Iterator<Item = impl Iterator>) { panic!() } | 
|  |  | 
|  | // Allowed | 
|  | fn in_impl_Trait_in_return() -> impl IntoIterator<Item = impl IntoIterator> { | 
|  | vec![vec![0; 10], vec![12; 7], vec![8; 3]] | 
|  | } | 
|  |  | 
|  | // Disallowed | 
|  | struct InBraceStructField { x: impl Debug } | 
|  | //~^ ERROR `impl Trait` is not allowed in field types | 
|  |  | 
|  | // Disallowed | 
|  | struct InAdtInBraceStructField { x: Vec<impl Debug> } | 
|  | //~^ ERROR `impl Trait` is not allowed in field types | 
|  |  | 
|  | // Disallowed | 
|  | struct InTupleStructField(impl Debug); | 
|  | //~^ ERROR `impl Trait` is not allowed in field types | 
|  |  | 
|  | // Disallowed | 
|  | enum InEnum { | 
|  | InBraceVariant { x: impl Debug }, | 
|  | //~^ ERROR `impl Trait` is not allowed in field types | 
|  | InTupleVariant(impl Debug), | 
|  | //~^ ERROR `impl Trait` is not allowed in field types | 
|  | } | 
|  |  | 
|  | // Allowed | 
|  | trait InTraitDefnParameters { | 
|  | fn in_parameters(_: impl Debug); | 
|  | } | 
|  |  | 
|  | // Allowed | 
|  | trait InTraitDefnReturn { | 
|  | fn in_return() -> impl Debug; | 
|  | } | 
|  |  | 
|  | // Allowed and disallowed in trait impls | 
|  | trait DummyTrait { | 
|  | type Out; | 
|  | fn in_trait_impl_parameter(_: impl Debug); | 
|  | fn in_trait_impl_return() -> Self::Out; | 
|  | } | 
|  | impl DummyTrait for () { | 
|  | type Out = impl Debug; | 
|  | //~^ ERROR `impl Trait` in associated types is unstable | 
|  | //~| ERROR unconstrained opaque type | 
|  |  | 
|  | fn in_trait_impl_parameter(_: impl Debug) { } | 
|  | // Allowed | 
|  |  | 
|  | fn in_trait_impl_return() -> impl Debug { () } | 
|  | //~^ ERROR `in_trait_impl_return` has an incompatible type for trait | 
|  | // Allowed | 
|  | } | 
|  |  | 
|  | // Allowed | 
|  | struct DummyType; | 
|  | impl DummyType { | 
|  | fn in_inherent_impl_parameters(_: impl Debug) { } | 
|  | fn in_inherent_impl_return() -> impl Debug { () } | 
|  | } | 
|  |  | 
|  | // Disallowed | 
|  | extern "C" { | 
|  | fn in_foreign_parameters(_: impl Debug); | 
|  | //~^ ERROR `impl Trait` is not allowed in `extern fn` | 
|  |  | 
|  | fn in_foreign_return() -> impl Debug; | 
|  | //~^ ERROR `impl Trait` is not allowed in `extern fn` | 
|  | } | 
|  |  | 
|  | // Allowed | 
|  | extern "C" fn in_extern_fn_parameters(_: impl Debug) { | 
|  | } | 
|  |  | 
|  | // Allowed | 
|  | extern "C" fn in_extern_fn_return() -> impl Debug { | 
|  | 22 | 
|  | } | 
|  |  | 
|  | type InTypeAlias<R> = impl Debug; | 
|  | //~^ ERROR `impl Trait` in type aliases is unstable | 
|  | //~| ERROR unconstrained opaque type | 
|  |  | 
|  | type InReturnInTypeAlias<R> = fn() -> impl Debug; | 
|  | //~^ ERROR `impl Trait` is not allowed in `fn` pointer | 
|  | //~| ERROR `impl Trait` in type aliases is unstable | 
|  |  | 
|  | // Disallowed in impl headers | 
|  | impl PartialEq<impl Debug> for () { | 
|  | //~^ ERROR `impl Trait` is not allowed in traits | 
|  | } | 
|  |  | 
|  | // Disallowed in impl headers | 
|  | impl PartialEq<()> for impl Debug { | 
|  | //~^ ERROR `impl Trait` is not allowed in impl headers | 
|  | } | 
|  |  | 
|  | // Disallowed in inherent impls | 
|  | impl impl Debug { | 
|  | //~^ ERROR `impl Trait` is not allowed in impl headers | 
|  | } | 
|  |  | 
|  | // Disallowed in inherent impls | 
|  | struct InInherentImplAdt<T> { t: T } | 
|  | impl InInherentImplAdt<impl Debug> { | 
|  | //~^ ERROR `impl Trait` is not allowed in impl headers | 
|  | } | 
|  |  | 
|  | // Disallowed in where clauses | 
|  | fn in_fn_where_clause() | 
|  | where impl Debug: Debug | 
|  | //~^ ERROR `impl Trait` is not allowed in bounds | 
|  | { | 
|  | } | 
|  |  | 
|  | // Disallowed in where clauses | 
|  | fn in_adt_in_fn_where_clause() | 
|  | where Vec<impl Debug>: Debug | 
|  | //~^ ERROR `impl Trait` is not allowed in bounds | 
|  | { | 
|  | } | 
|  |  | 
|  | // Disallowed | 
|  | fn in_trait_parameter_in_fn_where_clause<T>() | 
|  | where T: PartialEq<impl Debug> | 
|  | //~^ ERROR `impl Trait` is not allowed in bounds | 
|  | { | 
|  | } | 
|  |  | 
|  | // Disallowed | 
|  | fn in_Fn_parameter_in_fn_where_clause<T>() | 
|  | where T: Fn(impl Debug) | 
|  | //~^ ERROR `impl Trait` is not allowed in the parameters of `Fn` trait bounds | 
|  | { | 
|  | } | 
|  |  | 
|  | // Disallowed | 
|  | fn in_Fn_return_in_fn_where_clause<T>() | 
|  | where T: Fn() -> impl Debug | 
|  | //~^ ERROR `impl Trait` is not allowed in the return type of `Fn` trait bounds | 
|  | { | 
|  | } | 
|  |  | 
|  | // Disallowed | 
|  | struct InStructGenericParamDefault<T = impl Debug>(T); | 
|  | //~^ ERROR `impl Trait` is not allowed in generic parameter defaults | 
|  |  | 
|  | // Disallowed | 
|  | enum InEnumGenericParamDefault<T = impl Debug> { Variant(T) } | 
|  | //~^ ERROR `impl Trait` is not allowed in generic parameter defaults | 
|  |  | 
|  | // Disallowed | 
|  | trait InTraitGenericParamDefault<T = impl Debug> {} | 
|  | //~^ ERROR `impl Trait` is not allowed in generic parameter defaults | 
|  |  | 
|  | // Disallowed | 
|  | type InTypeAliasGenericParamDefault<T = impl Debug> = T; | 
|  | //~^ ERROR `impl Trait` is not allowed in generic parameter defaults | 
|  |  | 
|  | // Disallowed | 
|  | #[expect(invalid_type_param_default)] | 
|  | impl<T = impl Debug> T {} | 
|  | //~^ ERROR `impl Trait` is not allowed in generic parameter defaults | 
|  | //~| ERROR no nominal type found | 
|  |  | 
|  | // Disallowed | 
|  | #[expect(invalid_type_param_default)] | 
|  | fn in_method_generic_param_default<T = impl Debug>(_: T) {} | 
|  | //~^ ERROR `impl Trait` is not allowed in generic parameter defaults | 
|  |  | 
|  | fn main() { | 
|  | let _in_local_variable: impl Fn() = || {}; | 
|  | //~^ ERROR `impl Trait` is not allowed in the type of variable bindings | 
|  | let _in_return_in_local_variable = || -> impl Fn() { || {} }; | 
|  | //~^ ERROR `impl Trait` is not allowed in closure return types | 
|  | } |