// Copyright 2017 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! A simple test for testing many permutations of allowedness of //! impl Trait #![feature(conservative_impl_trait, universal_impl_trait, dyn_trait)] 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) { panic!() } // Allowed fn in_adt_in_return() -> Vec { panic!() } // Disallowed fn in_fn_parameter_in_parameters(_: fn(impl Debug)) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_fn_return_in_parameters(_: fn() -> impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_fn_parameter_in_return() -> fn(impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_fn_return_in_return() -> fn() -> impl Debug { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_dyn_Fn_parameter_in_parameters(_: &dyn Fn(impl Debug)) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_dyn_Fn_return_in_parameters(_: &dyn Fn() -> impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // FIXME -- no error currently // Disallowed fn in_dyn_Fn_parameter_in_return() -> &'static dyn Fn(impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_dyn_Fn_return_in_return() -> &'static dyn Fn() -> impl Debug { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // FIXME -- no error currently // Disallowed fn in_impl_Fn_parameter_in_parameters(_: &impl Fn(impl Debug)) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_impl_Fn_return_in_parameters(_: &impl Fn() -> impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // FIXME -- no error currently // Disallowed fn in_impl_Fn_parameter_in_return() -> &'static impl Fn(impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed fn in_impl_Fn_return_in_return() -> &'static impl Fn() -> impl Debug { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // FIXME -- no error currently // Allowed fn in_impl_Trait_in_parameters(_: impl Iterator) { panic!() } // Allowed fn in_impl_Trait_in_return() -> impl IntoIterator { vec![vec![0; 10], vec![12; 7], vec![8; 3]] } // Disallowed struct InBraceStructField { x: impl Debug } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed struct InAdtInBraceStructField { x: Vec } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed struct InTupleStructField(impl Debug); //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed enum InEnum { InBraceVariant { x: impl Debug }, //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types InTupleVariant(impl Debug), //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // Allowed trait InTraitDefnParameters { fn in_parameters(_: impl Debug); } // Disallowed trait InTraitDefnReturn { fn in_return() -> impl Debug; //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // 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` not allowed outside of function and inherent method return types fn in_trait_impl_parameter(_: impl Debug) { } // Allowed fn in_trait_impl_return() -> impl Debug { () } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // 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` not allowed outside of function and inherent method return types fn in_foreign_return() -> impl Debug; //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // Allowed extern "C" fn in_extern_fn_parameters(_: impl Debug) { } // Allowed extern "C" fn in_extern_fn_return() -> impl Debug { 22 } type InTypeAlias = impl Debug; //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types type InReturnInTypeAlias = fn() -> impl Debug; //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed in impl headers impl PartialEq for () { //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // Disallowed in impl headers impl PartialEq<()> for impl Debug { //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // Disallowed in inherent impls impl impl Debug { //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // Disallowed in inherent impls struct InInherentImplAdt { t: T } impl InInherentImplAdt { //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types } // Disallowed in where clauses fn in_fn_where_clause() where impl Debug: Debug //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types { } // Disallowed in where clauses fn in_adt_in_fn_where_clause() where Vec: Debug //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types { } // Disallowed fn in_trait_parameter_in_fn_where_clause() where T: PartialEq //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types { } // Disallowed fn in_Fn_parameter_in_fn_where_clause() where T: Fn(impl Debug) //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types { } // Disallowed fn in_Fn_return_in_fn_where_clause() where T: Fn() -> impl Debug //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types { } fn main() { let _in_local_variable: impl Fn() = || {}; //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types let _in_return_in_local_variable = || -> impl Fn() { || {} }; //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types }