diff --git a/src/test/compile-fail/impl-trait/disallowed-2.rs b/src/test/compile-fail/impl-trait/disallowed-2.rs deleted file mode 100644 index 46b3106ab8d..00000000000 --- a/src/test/compile-fail/impl-trait/disallowed-2.rs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2016 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. - -#![feature(conservative_impl_trait)] - -fn main() { - let _: impl Fn() = || {}; - //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types - let _ = || -> impl Fn() { || {} }; - //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types -} diff --git a/src/test/compile-fail/impl-trait/disallowed.rs b/src/test/compile-fail/impl-trait/disallowed.rs deleted file mode 100644 index bf2e22aa8e6..00000000000 --- a/src/test/compile-fail/impl-trait/disallowed.rs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2016 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. - -#![feature(conservative_impl_trait)] - -type Factory = impl Fn() -> R; -//~^ ERROR `impl Trait` not allowed outside of function and inherent method return types - -type GlobalFactory = fn() -> impl FnOnce() -> R; -//~^ ERROR `impl Trait` not allowed outside of function and inherent method return types - -trait LazyToString { - fn lazy_to_string<'a>(&'a self) -> impl Fn() -> String; - //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types -} - -impl LazyToString for String { - fn lazy_to_string<'a>(&'a self) -> impl Fn() -> String { - //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types - || self.clone() - } -} - -#[derive(Copy, Clone)] -struct Lazy(T); - -impl std::ops::Add> for Lazy { - type Output = impl Fn() -> Lazy; - //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types - - fn add(self, other: Lazy) -> Self::Output { - move || Lazy(self.0 + other.0) - } -} - -impl std::ops::Add -for impl Fn() -> Lazy -//~^ ERROR `impl Trait` not allowed outside of function and inherent method return types -where F: Fn() -> impl FnOnce() -> i32 -//~^ ERROR `impl Trait` not allowed outside of function and inherent method return types -{ - type Output = Self; - - fn add(self, other: F) -> Self::Output { - move || Lazy(self().0 + other()()) - } -} - -fn main() {} diff --git a/src/test/compile-fail/impl-trait/where-allowed.rs b/src/test/compile-fail/impl-trait/where-allowed.rs index 5c2a8f89bf2..be990b0e15d 100644 --- a/src/test/compile-fail/impl-trait/where-allowed.rs +++ b/src/test/compile-fail/impl-trait/where-allowed.rs @@ -14,58 +14,218 @@ use std::fmt::Debug; // Allowed -fn simple_universal(_: impl Debug) { panic!() } +fn in_parameters(_: impl Debug) { panic!() } // Allowed -fn simple_existential() -> impl Debug { panic!() } +fn in_return() -> impl Debug { panic!() } // Allowed -fn collection_universal(_: Vec) { panic!() } +fn in_adt_in_parameters(_: Vec) { panic!() } // Allowed -fn collection_existential() -> Vec { panic!() } +fn in_adt_in_return() -> Vec { panic!() } // Disallowed -fn fn_type_universal(_: fn(impl Debug)) { panic!() } +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 fn_type_existential() -> fn(impl Debug) { panic!() } +fn in_fn_return_in_parameters(_: fn() -> impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types -// Allowed -fn dyn_universal(_: &dyn Iterator) { panic!() } - // Disallowed -fn dyn_fn_trait(_: &dyn Fn(impl Debug)) { panic!() } +fn in_fn_parameter_in_return() -> fn(impl Debug) { panic!() } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types -// Allowed -fn nested_universal(_: impl Iterator) { panic!() } +// 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 nested_existential() -> impl IntoIterator { +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 -fn universal_fn_trait(_: impl Fn(impl Debug)) { panic!() } +struct InBraceStructField { x: impl Debug } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed -struct ImplMember { x: impl Debug } +struct InAdtInBraceStructField { x: Vec } //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed -trait Universal { - // FIXME, should error? - fn universal(impl Debug); -} +struct InTupleStructField(impl Debug); +//~^ ERROR `impl Trait` not allowed outside of function and inherent method return types // Disallowed -trait Existential { - fn existential() -> impl Debug; +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 + // FIXME currently allowed + + fn in_foreign_return() -> impl Debug; + //~^ ERROR `impl Trait` not allowed outside of function and inherent method return types + // FIXME currently allowed +} + +// 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 } -fn main() {}