diff --git a/src/doc/unstable-book/src/language-features/infer-outlives-requirements.md b/src/doc/unstable-book/src/language-features/infer-outlives-requirements.md new file mode 100644 index 0000000000000..fe82f8555da32 --- /dev/null +++ b/src/doc/unstable-book/src/language-features/infer-outlives-requirements.md @@ -0,0 +1,67 @@ +# `infer_outlives_requirements` + +The tracking issue for this feature is: [#44493] + +[#44493]: https://github.com/rust-lang/rust/issues/44493 + +------------------------ +The `infer_outlives_requirements` feature indicates that certain +outlives requirements can be inferred by the compiler rather than +stating them explicitly. + +For example, currently generic struct definitions that contain +references, require where-clauses of the form T: 'a. By using +this feature the outlives predicates will be inferred, although +they may still be written explicitly. + +```rust,ignore (pseudo-Rust) +struct Foo<'a, T> + where T: 'a // <-- currently required + { + bar: &'a T, + } +``` + + +## Examples: + + +```rust,ignore (pseudo-Rust) +#![feature(infer_outlives_requirements)] + +// Implicitly infer T: 'a +struct Foo<'a, T> { + bar: &'a T, +} +``` + +```rust,ignore (pseudo-Rust) +#![feature(infer_outlives_requirements)] + +// Implicitly infer `U: 'b` +struct Foo<'b, U> { + bar: Bar<'b, U> +} + +struct Bar<'a, T> where T: 'a { + x: &'a (), + y: T, +} +``` + +```rust,ignore (pseudo-Rust) +#![feature(infer_outlives_requirements)] + +// Implicitly infer `b': 'a` +struct Foo<'a, 'b, T> { + x: &'a &'b T +} +``` + +```rust,ignore (pseudo-Rust) +#![feature(infer_outlives_requirements)] + +// Implicitly infer `::Item : 'a` +struct Foo<'a, T: Iterator> { + bar: &'a T::Item +``` diff --git a/src/liballoc/lib.rs b/src/liballoc/lib.rs index 2d271fd0dca8d..452d2b1472ff4 100644 --- a/src/liballoc/lib.rs +++ b/src/liballoc/lib.rs @@ -77,6 +77,7 @@ #![cfg_attr(not(test), feature(fn_traits))] #![cfg_attr(not(test), feature(generator_trait))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![cfg_attr(test, feature(test))] #![feature(allocator_api)] diff --git a/src/liballoc_jemalloc/lib.rs b/src/liballoc_jemalloc/lib.rs index bdf0e37a2e672..3d2348f3e4546 100644 --- a/src/liballoc_jemalloc/lib.rs +++ b/src/liballoc_jemalloc/lib.rs @@ -17,6 +17,7 @@ #![feature(libc)] #![feature(linkage)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(staged_api)] #![feature(rustc_attrs)] #![cfg_attr(dummy_jemalloc, allow(dead_code, unused_extern_crates))] diff --git a/src/liballoc_system/lib.rs b/src/liballoc_system/lib.rs index 65204ebf71413..8848be5903810 100644 --- a/src/liballoc_system/lib.rs +++ b/src/liballoc_system/lib.rs @@ -18,6 +18,7 @@ #![feature(allocator_api)] #![feature(core_intrinsics)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(staged_api)] #![feature(rustc_attrs)] #![cfg_attr(any(unix, target_os = "cloudabi", target_os = "redox"), feature(libc))] diff --git a/src/libarena/lib.rs b/src/libarena/lib.rs index 6ad703180c224..5cb8975e9ce97 100644 --- a/src/libarena/lib.rs +++ b/src/libarena/lib.rs @@ -27,6 +27,7 @@ #![feature(core_intrinsics)] #![feature(dropck_eyepatch)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(raw_vec_internals)] #![cfg_attr(test, feature(test))] diff --git a/src/libcore/lib.rs b/src/libcore/lib.rs index 675e73e952cc2..1c803f896aa17 100644 --- a/src/libcore/lib.rs +++ b/src/libcore/lib.rs @@ -92,6 +92,7 @@ #![feature(link_llvm_intrinsics)] #![feature(never_type)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(exhaustive_patterns)] #![feature(macro_at_most_once_rep)] #![feature(no_core)] diff --git a/src/libfmt_macros/lib.rs b/src/libfmt_macros/lib.rs index 1bac6d22d3744..3720100700c9c 100644 --- a/src/libfmt_macros/lib.rs +++ b/src/libfmt_macros/lib.rs @@ -21,6 +21,7 @@ test(attr(deny(warnings))))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] pub use self::Piece::*; pub use self::Position::*; diff --git a/src/libgraphviz/lib.rs b/src/libgraphviz/lib.rs index 9fa48adebdf07..5a0c983b521a5 100644 --- a/src/libgraphviz/lib.rs +++ b/src/libgraphviz/lib.rs @@ -289,6 +289,7 @@ test(attr(allow(unused_variables), deny(warnings))))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(str_escape)] use self::LabelText::*; diff --git a/src/libpanic_abort/lib.rs b/src/libpanic_abort/lib.rs index 14221f3d79e84..4da88d8522196 100644 --- a/src/libpanic_abort/lib.rs +++ b/src/libpanic_abort/lib.rs @@ -25,6 +25,7 @@ #![feature(core_intrinsics)] #![feature(libc)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(panic_runtime)] #![feature(staged_api)] #![feature(rustc_attrs)] diff --git a/src/libpanic_unwind/lib.rs b/src/libpanic_unwind/lib.rs index 9c3fc76c307a6..3368790b3f76f 100644 --- a/src/libpanic_unwind/lib.rs +++ b/src/libpanic_unwind/lib.rs @@ -35,6 +35,7 @@ #![feature(lang_items)] #![feature(libc)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(panic_unwind)] #![feature(raw)] #![feature(staged_api)] diff --git a/src/libproc_macro/lib.rs b/src/libproc_macro/lib.rs index 1a0dde3ccd7c3..31c4e79211494 100644 --- a/src/libproc_macro/lib.rs +++ b/src/libproc_macro/lib.rs @@ -28,6 +28,7 @@ test(attr(allow(dead_code, deprecated, unused_variables, unused_mut))))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(rustc_private)] #![feature(staged_api)] #![feature(lang_items)] diff --git a/src/libprofiler_builtins/lib.rs b/src/libprofiler_builtins/lib.rs index a85593253b100..00dd87022c268 100644 --- a/src/libprofiler_builtins/lib.rs +++ b/src/libprofiler_builtins/lib.rs @@ -16,4 +16,5 @@ issue = "0")] #![allow(unused_features)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(staged_api)] diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index 3318bbd8c870e..a3c0688dcc8ed 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -1232,54 +1232,41 @@ let x: i32 = "I am not a number!"; "##, E0309: r##" -The type definition contains some field whose type -requires an outlives annotation. Outlives annotations -(e.g., `T: 'a`) are used to guarantee that all the data in T is valid -for at least the lifetime `'a`. This scenario most commonly -arises when the type contains an associated type reference -like `>::Output`, as shown in this example: +Types in type definitions have lifetimes associated with them that represent +how long the data stored within them is guaranteed to be live. This lifetime +must be as long as the data needs to be alive, and missing the constraint that +denotes this will cause this error. ```compile_fail,E0309 -// This won't compile because the applicable impl of -// `SomeTrait` (below) requires that `T: 'a`, but the struct does -// not have a matching where-clause. +// This won't compile because T is not constrained, meaning the data +// stored in it is not guaranteed to last as long as the reference struct Foo<'a, T> { - foo: >::Output, -} - -trait SomeTrait<'a> { - type Output; -} - -impl<'a, T> SomeTrait<'a> for T -where - T: 'a, -{ - type Output = u32; + foo: &'a T } ``` -Here, the where clause `T: 'a` that appears on the impl is not known to be -satisfied on the struct. To make this example compile, you have to add -a where-clause like `T: 'a` to the struct definition: +This will compile, because it has the constraint on the type parameter: ``` -struct Foo<'a, T> -where - T: 'a, -{ - foo: >::Output +struct Foo<'a, T: 'a> { + foo: &'a T } +``` -trait SomeTrait<'a> { - type Output; +To see why this is important, consider the case where `T` is itself a reference +(e.g., `T = &str`). If we don't include the restriction that `T: 'a`, the +following code would be perfectly legal: + +```compile_fail,E0309 +struct Foo<'a, T> { + foo: &'a T } -impl<'a, T> SomeTrait<'a> for T -where - T: 'a, -{ - type Output = u32; +fn main() { + let v = "42".to_string(); + let f = Foo{foo: &v}; + drop(v); + println!("{}", f.foo); // but we've already dropped v! } ``` "##, @@ -1478,31 +1465,30 @@ A reference has a longer lifetime than the data it references. Erroneous code example: ```compile_fail,E0491 -trait SomeTrait<'a> { - type Output; +// struct containing a reference requires a lifetime parameter, +// because the data the reference points to must outlive the struct (see E0106) +struct Struct<'a> { + ref_i32: &'a i32, } -impl<'a, T> SomeTrait<'a> for T { - type Output = &'a T; // compile error E0491 +// However, a nested struct like this, the signature itself does not tell +// whether 'a outlives 'b or the other way around. +// So it could be possible that 'b of reference outlives 'a of the data. +struct Nested<'a, 'b> { + ref_struct: &'b Struct<'a>, // compile error E0491 } ``` -Here, the problem is that a reference type like `&'a T` is only valid -if all the data in T outlives the lifetime `'a`. But this impl as written -is applicable to any lifetime `'a` and any type `T` -- we have no guarantee -that `T` outlives `'a`. To fix this, you can add a where clause like -`where T: 'a`. +To fix this issue, you can specify a bound to the lifetime like below: ``` -trait SomeTrait<'a> { - type Output; +struct Struct<'a> { + ref_i32: &'a i32, } -impl<'a, T> SomeTrait<'a> for T -where - T: 'a, -{ - type Output = &'a T; // compile error E0491 +// 'a: 'b means 'a outlives 'b +struct Nested<'a: 'b, 'b> { + ref_struct: &'b Struct<'a>, } ``` "##, diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 2eaf1eebb394c..3570e65584e8d 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -52,6 +52,7 @@ #![feature(exhaustive_patterns)] #![feature(extern_types)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(non_exhaustive)] #![feature(proc_macro_internals)] #![feature(quote)] diff --git a/src/librustc_allocator/lib.rs b/src/librustc_allocator/lib.rs index 2a3404ee83034..44fbcade6bc06 100644 --- a/src/librustc_allocator/lib.rs +++ b/src/librustc_allocator/lib.rs @@ -9,6 +9,7 @@ // except according to those terms. #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(rustc_private)] #[macro_use] extern crate log; diff --git a/src/librustc_apfloat/lib.rs b/src/librustc_apfloat/lib.rs index d6e821d427d05..c3c32ba7d5b6c 100644 --- a/src/librustc_apfloat/lib.rs +++ b/src/librustc_apfloat/lib.rs @@ -46,6 +46,7 @@ #![forbid(unsafe_code)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(try_from)] // See librustc_cratesio_shim/Cargo.toml for a comment explaining this. #[allow(unused_extern_crates)] diff --git a/src/librustc_asan/lib.rs b/src/librustc_asan/lib.rs index b3ba86ad8a4b3..ed8fd305977e5 100644 --- a/src/librustc_asan/lib.rs +++ b/src/librustc_asan/lib.rs @@ -11,6 +11,7 @@ #![sanitizer_runtime] #![feature(alloc_system)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(sanitizer_runtime)] #![feature(staged_api)] #![no_std] diff --git a/src/librustc_borrowck/lib.rs b/src/librustc_borrowck/lib.rs index 16da8c8a3b8bf..edd837e9401a7 100644 --- a/src/librustc_borrowck/lib.rs +++ b/src/librustc_borrowck/lib.rs @@ -15,6 +15,7 @@ #![allow(non_camel_case_types)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(quote)] #![recursion_limit="256"] diff --git a/src/librustc_codegen_llvm/lib.rs b/src/librustc_codegen_llvm/lib.rs index 9cb233122c3d0..dcdd8c1f6e9f9 100644 --- a/src/librustc_codegen_llvm/lib.rs +++ b/src/librustc_codegen_llvm/lib.rs @@ -27,6 +27,7 @@ #![allow(unused_attributes)] #![feature(libc)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(quote)] #![feature(range_contains)] #![feature(rustc_diagnostic_macros)] diff --git a/src/librustc_codegen_utils/lib.rs b/src/librustc_codegen_utils/lib.rs index 635819e94e867..45db22ec6dabc 100644 --- a/src/librustc_codegen_utils/lib.rs +++ b/src/librustc_codegen_utils/lib.rs @@ -20,6 +20,7 @@ #![feature(box_syntax)] #![feature(custom_attribute)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![allow(unused_attributes)] #![feature(quote)] #![feature(rustc_diagnostic_macros)] diff --git a/src/librustc_cratesio_shim/src/lib.rs b/src/librustc_cratesio_shim/src/lib.rs index 55dec45a09824..ebceb00cca8b0 100644 --- a/src/librustc_cratesio_shim/src/lib.rs +++ b/src/librustc_cratesio_shim/src/lib.rs @@ -12,6 +12,7 @@ #![allow(unused_extern_crates)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] extern crate bitflags; extern crate log; diff --git a/src/librustc_data_structures/lib.rs b/src/librustc_data_structures/lib.rs index 9435cb3184293..1fdcab5f7a215 100644 --- a/src/librustc_data_structures/lib.rs +++ b/src/librustc_data_structures/lib.rs @@ -29,6 +29,7 @@ #![feature(optin_builtin_traits)] #![cfg_attr(stage0, feature(macro_vis_matcher))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(allow_internal_unstable)] #![feature(vec_resize_with)] diff --git a/src/librustc_driver/lib.rs b/src/librustc_driver/lib.rs index a96c277d4b555..13e1df6e53888 100644 --- a/src/librustc_driver/lib.rs +++ b/src/librustc_driver/lib.rs @@ -21,6 +21,7 @@ #![feature(box_syntax)] #![cfg_attr(unix, feature(libc))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(option_replace)] #![feature(quote)] #![feature(rustc_diagnostic_macros)] diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs index 3582c2359c8b9..d31db4b2d00ac 100644 --- a/src/librustc_errors/lib.rs +++ b/src/librustc_errors/lib.rs @@ -17,6 +17,7 @@ #![feature(range_contains)] #![cfg_attr(unix, feature(libc))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(optin_builtin_traits)] extern crate atty; diff --git a/src/librustc_incremental/lib.rs b/src/librustc_incremental/lib.rs index acdcf2b459e92..4ffd726c1d47c 100644 --- a/src/librustc_incremental/lib.rs +++ b/src/librustc_incremental/lib.rs @@ -15,6 +15,7 @@ html_root_url = "https://doc.rust-lang.org/nightly/")] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(specialization)] #![recursion_limit="256"] diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index 9ed69a2dc9b8e..681cf0d5fc9de 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -28,6 +28,7 @@ #![feature(box_syntax)] #![cfg_attr(stage0, feature(macro_vis_matcher))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(quote)] #![feature(rustc_diagnostic_macros)] #![feature(macro_at_most_once_rep)] diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs index 387660473a887..13605e993a59c 100644 --- a/src/librustc_llvm/lib.rs +++ b/src/librustc_llvm/lib.rs @@ -9,6 +9,7 @@ // except according to those terms. #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(static_nobundle)] #![doc(html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png", diff --git a/src/librustc_lsan/lib.rs b/src/librustc_lsan/lib.rs index b3ba86ad8a4b3..ed8fd305977e5 100644 --- a/src/librustc_lsan/lib.rs +++ b/src/librustc_lsan/lib.rs @@ -11,6 +11,7 @@ #![sanitizer_runtime] #![feature(alloc_system)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(sanitizer_runtime)] #![feature(staged_api)] #![no_std] diff --git a/src/librustc_metadata/lib.rs b/src/librustc_metadata/lib.rs index 09a8bea0941b6..107245488acf3 100644 --- a/src/librustc_metadata/lib.rs +++ b/src/librustc_metadata/lib.rs @@ -16,6 +16,7 @@ #![feature(libc)] #![feature(macro_at_most_once_rep)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(proc_macro_internals)] #![feature(proc_macro_quote)] #![feature(quote)] diff --git a/src/librustc_mir/lib.rs b/src/librustc_mir/lib.rs index 1594755b4ab87..073e806fe028c 100644 --- a/src/librustc_mir/lib.rs +++ b/src/librustc_mir/lib.rs @@ -15,6 +15,7 @@ Rust MIR: a lowered representation of Rust. Also: an experiment! */ #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(in_band_lifetimes)] #![feature(impl_header_lifetime_elision)] #![feature(slice_patterns)] diff --git a/src/librustc_msan/lib.rs b/src/librustc_msan/lib.rs index b3ba86ad8a4b3..ed8fd305977e5 100644 --- a/src/librustc_msan/lib.rs +++ b/src/librustc_msan/lib.rs @@ -11,6 +11,7 @@ #![sanitizer_runtime] #![feature(alloc_system)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(sanitizer_runtime)] #![feature(staged_api)] #![no_std] diff --git a/src/librustc_passes/lib.rs b/src/librustc_passes/lib.rs index d62cb00923f70..94ea229cbd91b 100644 --- a/src/librustc_passes/lib.rs +++ b/src/librustc_passes/lib.rs @@ -19,6 +19,7 @@ html_root_url = "https://doc.rust-lang.org/nightly/")] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(rustc_diagnostic_macros)] #[macro_use] diff --git a/src/librustc_platform_intrinsics/lib.rs b/src/librustc_platform_intrinsics/lib.rs index fa7008be73a07..f093d672498ad 100644 --- a/src/librustc_platform_intrinsics/lib.rs +++ b/src/librustc_platform_intrinsics/lib.rs @@ -11,6 +11,7 @@ #![allow(nonstandard_style)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] pub struct Intrinsic { pub inputs: &'static [&'static Type], diff --git a/src/librustc_plugin/lib.rs b/src/librustc_plugin/lib.rs index 67f53a67313f7..5b56266638552 100644 --- a/src/librustc_plugin/lib.rs +++ b/src/librustc_plugin/lib.rs @@ -65,6 +65,7 @@ html_root_url = "https://doc.rust-lang.org/nightly/")] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(rustc_diagnostic_macros)] #[macro_use] extern crate syntax; diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 47e8588857d6a..fe66110120d40 100644 --- a/src/librustc_privacy/lib.rs +++ b/src/librustc_privacy/lib.rs @@ -13,6 +13,7 @@ html_root_url = "https://doc.rust-lang.org/nightly/")] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(rustc_diagnostic_macros)] #![recursion_limit="256"] @@ -1380,13 +1381,7 @@ impl<'a, 'tcx: 'a> SearchInterfaceForPrivateItemsVisitor<'a, 'tcx> { } fn predicates(&mut self) -> &mut Self { - // NB: We use `explicit_predicates_of` and not `predicates_of` - // because we don't want to report privacy errors due to where - // clauses that the compiler inferred. We only want to - // consider the ones that the user wrote. This is important - // for the inferred outlives rules; see - // `src/test/ui/rfc-2093-infer-outlives/privacy.rs`. - let predicates = self.tcx.explicit_predicates_of(self.item_def_id); + let predicates = self.tcx.predicates_of(self.item_def_id); for predicate in &predicates.predicates { predicate.visit_with(self); match predicate { diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs index a19bf6d89cb9d..de6602e680db5 100644 --- a/src/librustc_resolve/lib.rs +++ b/src/librustc_resolve/lib.rs @@ -14,6 +14,7 @@ #![feature(crate_visibility_modifier)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(rustc_diagnostic_macros)] #![feature(slice_sort_by_cached_key)] diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs index c9bae297031ff..30cf24d2ba9ec 100644 --- a/src/librustc_save_analysis/lib.rs +++ b/src/librustc_save_analysis/lib.rs @@ -13,6 +13,7 @@ html_root_url = "https://doc.rust-lang.org/nightly/")] #![feature(custom_attribute)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![allow(unused_attributes)] #![recursion_limit="256"] diff --git a/src/librustc_target/lib.rs b/src/librustc_target/lib.rs index c198b19ce6160..e4d958e3b6f35 100644 --- a/src/librustc_target/lib.rs +++ b/src/librustc_target/lib.rs @@ -25,6 +25,7 @@ #![cfg_attr(stage0, feature(const_fn))] #![cfg_attr(not(stage0), feature(min_const_fn))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(slice_patterns)] #[macro_use] diff --git a/src/librustc_traits/lib.rs b/src/librustc_traits/lib.rs index a6618efebb310..00d0d147fe9c3 100644 --- a/src/librustc_traits/lib.rs +++ b/src/librustc_traits/lib.rs @@ -16,6 +16,7 @@ #![cfg_attr(stage0, feature(extern_prelude))] #![feature(in_band_lifetimes)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![recursion_limit="256"] diff --git a/src/librustc_tsan/lib.rs b/src/librustc_tsan/lib.rs index b3ba86ad8a4b3..ed8fd305977e5 100644 --- a/src/librustc_tsan/lib.rs +++ b/src/librustc_tsan/lib.rs @@ -11,6 +11,7 @@ #![sanitizer_runtime] #![feature(alloc_system)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(sanitizer_runtime)] #![feature(staged_api)] #![no_std] diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs index 5309be21768f1..cc83c24e51c04 100644 --- a/src/librustc_typeck/collect.rs +++ b/src/librustc_typeck/collect.rs @@ -1578,10 +1578,14 @@ fn predicates_defined_on<'a, 'tcx>( def_id: DefId, ) -> ty::GenericPredicates<'tcx> { let explicit = tcx.explicit_predicates_of(def_id); - let predicates = [ - &explicit.predicates[..], - &tcx.inferred_outlives_of(def_id)[..], - ].concat(); + let predicates = if tcx.sess.features_untracked().infer_outlives_requirements { + [ + &explicit.predicates[..], + &tcx.inferred_outlives_of(def_id)[..], + ].concat() + } else { + explicit.predicates + }; ty::GenericPredicates { parent: explicit.parent, diff --git a/src/librustc_typeck/lib.rs b/src/librustc_typeck/lib.rs index c9aa0339dd469..13ea2fdd89d05 100644 --- a/src/librustc_typeck/lib.rs +++ b/src/librustc_typeck/lib.rs @@ -76,6 +76,7 @@ This API is completely unstable and subject to change. #![feature(crate_visibility_modifier)] #![feature(exhaustive_patterns)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(quote)] #![feature(refcell_replace_swap)] #![feature(rustc_diagnostic_macros)] diff --git a/src/librustc_typeck/outlives/implicit_infer.rs b/src/librustc_typeck/outlives/implicit_infer.rs index 254146c0ef3aa..092e4d62e2e9f 100644 --- a/src/librustc_typeck/outlives/implicit_infer.rs +++ b/src/librustc_typeck/outlives/implicit_infer.rs @@ -66,8 +66,7 @@ impl<'cx, 'tcx> ItemLikeVisitor<'tcx> for InferVisitor<'cx, 'tcx> { debug!("InferVisitor::visit_item(item={:?})", item_did); - let node_id = self - .tcx + let node_id = self.tcx .hir .as_local_node_id(item_did) .expect("expected local def-id"); @@ -109,8 +108,7 @@ impl<'cx, 'tcx> ItemLikeVisitor<'tcx> for InferVisitor<'cx, 'tcx> { // Therefore mark `predicates_added` as true and which will ensure // we walk the crates again and re-calculate predicates for all // items. - let item_predicates_len: usize = self - .global_inferred_outlives + let item_predicates_len: usize = self.global_inferred_outlives .get(&item_did) .map(|p| p.len()) .unwrap_or(0); diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 73057b19016c6..e9fac23b767df 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -17,6 +17,7 @@ #![feature(box_patterns)] #![feature(box_syntax)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(set_stdio)] #![feature(slice_sort_by_cached_key)] #![feature(test)] diff --git a/src/libserialize/lib.rs b/src/libserialize/lib.rs index 1f6ee3d867b17..e87c2793ee867 100644 --- a/src/libserialize/lib.rs +++ b/src/libserialize/lib.rs @@ -25,6 +25,7 @@ Core encoding and decoding interfaces. #![feature(specialization)] #![feature(never_type)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![cfg_attr(test, feature(test))] pub use self::serialize::{Decoder, Encoder, Decodable, Encodable}; diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 17f6923eae723..5c9e88dc57ca6 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -274,6 +274,7 @@ #![feature(needs_panic_runtime)] #![feature(never_type)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(exhaustive_patterns)] #![feature(on_unimplemented)] #![feature(optin_builtin_traits)] diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index fa4346ee70d96..1d9a278a55bff 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -406,6 +406,9 @@ declare_features! ( // Use `?` as the Kleene "at most one" operator (active, macro_at_most_once_rep, "1.25.0", Some(48075), None), + // Infer outlives requirements; RFC 2093 + (active, infer_outlives_requirements, "1.26.0", Some(44493), None), + // Infer static outlives requirements; RFC 2093 (active, infer_static_outlives_requirements, "1.26.0", Some(44493), None), @@ -663,8 +666,6 @@ declare_features! ( (accepted, proc_macro_path_invoc, "1.30.0", Some(38356), None), // Allows all literals in attribute lists and values of key-value pairs. (accepted, attr_literals, "1.30.0", Some(34981), None), - // Infer outlives requirements; RFC 2093 - (accepted, infer_outlives_requirements, "1.30.0", Some(44493), None), (accepted, panic_handler, "1.30.0", Some(44489), None), // Used to preserve symbols (see llvm.used) (accepted, used, "1.30.0", Some(40289), None), @@ -1126,6 +1127,12 @@ pub const BUILTIN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeG "never will be stable", cfg_fn!(rustc_attrs))), + // RFC #2093 + ("infer_outlives_requirements", Normal, Gated(Stability::Unstable, + "infer_outlives_requirements", + "infer outlives requirements is an experimental feature", + cfg_fn!(infer_outlives_requirements))), + // RFC #2093 ("infer_static_outlives_requirements", Normal, Gated(Stability::Unstable, "infer_static_outlives_requirements", diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 2aaab6aaa16d9..c8ec273a03f28 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -22,6 +22,7 @@ #![feature(crate_visibility_modifier)] #![feature(macro_at_most_once_rep)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(rustc_attrs)] #![feature(rustc_diagnostic_macros)] #![feature(slice_sort_by_cached_key)] diff --git a/src/libsyntax_ext/lib.rs b/src/libsyntax_ext/lib.rs index 31089c9ff82ce..88af4a73a1515 100644 --- a/src/libsyntax_ext/lib.rs +++ b/src/libsyntax_ext/lib.rs @@ -17,6 +17,7 @@ #![feature(proc_macro_internals)] #![feature(decl_macro)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(str_escape)] #![feature(quote)] #![feature(rustc_diagnostic_macros)] diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index 67fd847a2ae91..e7310dbfd3405 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -22,6 +22,7 @@ #![feature(crate_visibility_modifier)] #![feature(custom_attribute)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(non_exhaustive)] #![feature(optin_builtin_traits)] #![feature(specialization)] diff --git a/src/libterm/lib.rs b/src/libterm/lib.rs index a49fd67639dbe..df90be6393743 100644 --- a/src/libterm/lib.rs +++ b/src/libterm/lib.rs @@ -51,6 +51,7 @@ // Handle rustfmt skips #![feature(custom_attribute)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![allow(unused_attributes)] use std::io::prelude::*; diff --git a/src/libtest/lib.rs b/src/libtest/lib.rs index 6ffa6e9be937d..bf3cb7c537bd0 100644 --- a/src/libtest/lib.rs +++ b/src/libtest/lib.rs @@ -36,6 +36,7 @@ #![feature(fnbox)] #![cfg_attr(any(unix, target_os = "cloudabi"), feature(libc))] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(set_stdio)] #![feature(panic_unwind)] #![feature(staged_api)] diff --git a/src/libunwind/lib.rs b/src/libunwind/lib.rs index 424a7e3d009ec..3b94dc238d91c 100644 --- a/src/libunwind/lib.rs +++ b/src/libunwind/lib.rs @@ -14,6 +14,7 @@ #![feature(cfg_target_vendor)] #![feature(link_cfg)] #![cfg_attr(not(stage0), feature(nll))] +#![cfg_attr(not(stage0), feature(infer_outlives_requirements))] #![feature(staged_api)] #![feature(unwind_attributes)] #![feature(static_nobundle)] diff --git a/src/test/incremental/issue-51409.rs b/src/test/incremental/issue-51409.rs index 8aa75e6315d1d..d7aff5afe409e 100644 --- a/src/test/incremental/issue-51409.rs +++ b/src/test/incremental/issue-51409.rs @@ -13,6 +13,8 @@ // Regression test that `infer_outlives_predicates` can be // used with incremental without an ICE. +#![feature(infer_outlives_requirements)] + struct Foo<'a, T> { x: &'a T } diff --git a/src/test/run-pass/issue-54467.rs b/src/test/run-pass/issue-54467.rs new file mode 100644 index 0000000000000..033925a4c044b --- /dev/null +++ b/src/test/run-pass/issue-54467.rs @@ -0,0 +1,54 @@ +// Copyright 2018 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. + +pub trait Stream { + type Item; + type Error; +} + +pub trait ParseError { + type Output; +} + +impl ParseError for u32 { + type Output = (); +} + +impl Stream for () { + type Item = char; + type Error = u32; +} + +pub struct Lex<'a, I> + where I: Stream, + I::Error: ParseError, + <::Error as ParseError>::Output: 'a +{ + x: &'a >::Output +} + +pub struct Reserved<'a, I> where + I: Stream + 'a, + I::Error: ParseError, +// <::Error as ParseError>::Output: 'a // comment this to compile + +{ + x: Lex<'a, I> +} + +fn main() { + let r: Reserved<()> = Reserved { + x: Lex { + x: &() + } + }; + + let _v = r.x.x; +} diff --git a/src/test/ui/dep-graph/dep-graph-struct-signature.rs b/src/test/ui/dep-graph/dep-graph-struct-signature.rs index 6343dc201c5d9..647605ae4383e 100644 --- a/src/test/ui/dep-graph/dep-graph-struct-signature.rs +++ b/src/test/ui/dep-graph/dep-graph-struct-signature.rs @@ -88,6 +88,7 @@ mod invalid_signatures { } #[rustc_then_this_would_need(FnSignature)] //~ ERROR no path + #[rustc_then_this_would_need(TypeckTables)] //~ ERROR no path fn b(x: WontChange) { } #[rustc_then_this_would_need(FnSignature)] //~ ERROR no path from `WillChange` diff --git a/src/test/ui/dep-graph/dep-graph-struct-signature.stderr b/src/test/ui/dep-graph/dep-graph-struct-signature.stderr index 0d75bf5a9adc0..cbb695d0cf2b9 100644 --- a/src/test/ui/dep-graph/dep-graph-struct-signature.stderr +++ b/src/test/ui/dep-graph/dep-graph-struct-signature.stderr @@ -82,14 +82,20 @@ error: no path from `WillChange` to `FnSignature` LL | #[rustc_then_this_would_need(FnSignature)] //~ ERROR no path | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +error: no path from `WillChange` to `TypeckTables` + --> $DIR/dep-graph-struct-signature.rs:91:5 + | +LL | #[rustc_then_this_would_need(TypeckTables)] //~ ERROR no path + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + error: no path from `WillChange` to `FnSignature` - --> $DIR/dep-graph-struct-signature.rs:93:5 + --> $DIR/dep-graph-struct-signature.rs:94:5 | LL | #[rustc_then_this_would_need(FnSignature)] //~ ERROR no path from `WillChange` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: no path from `WillChange` to `TypeckTables` - --> $DIR/dep-graph-struct-signature.rs:94:5 + --> $DIR/dep-graph-struct-signature.rs:95:5 | LL | #[rustc_then_this_would_need(TypeckTables)] //~ ERROR no path from `WillChange` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -130,5 +136,5 @@ error: OK LL | #[rustc_then_this_would_need(TypeckTables)] //~ ERROR OK | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 22 previous errors +error: aborting due to 23 previous errors diff --git a/src/test/ui/feature-gates/feature-gate-infer_outlives_requirements.rs b/src/test/ui/feature-gates/feature-gate-infer_outlives_requirements.rs new file mode 100644 index 0000000000000..01ccc50a130f2 --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-infer_outlives_requirements.rs @@ -0,0 +1,18 @@ +// Copyright 2015 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. + +// Needs an explicit where clause stating outlives condition. (RFC 2093) + +// Type T needs to outlive lifetime 'a. +struct Foo<'a, T> { + bar: &'a [T] //~ ERROR the parameter type `T` may not live long enough [E0309] +} + +fn main() { } diff --git a/src/test/ui/feature-gates/feature-gate-infer_outlives_requirements.stderr b/src/test/ui/feature-gates/feature-gate-infer_outlives_requirements.stderr new file mode 100644 index 0000000000000..560e494b5828d --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-infer_outlives_requirements.stderr @@ -0,0 +1,17 @@ +error[E0309]: the parameter type `T` may not live long enough + --> $DIR/feature-gate-infer_outlives_requirements.rs:15:5 + | +LL | struct Foo<'a, T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | bar: &'a [T] //~ ERROR the parameter type `T` may not live long enough [E0309] + | ^^^^^^^^^^^^ + | +note: ...so that the reference type `&'a [T]` does not outlive the data it points at + --> $DIR/feature-gate-infer_outlives_requirements.rs:15:5 + | +LL | bar: &'a [T] //~ ERROR the parameter type `T` may not live long enough [E0309] + | ^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0309`. diff --git a/src/test/ui/issue-53419.rs b/src/test/ui/issue-53419.rs index 0dd5a8512852a..e4ade1b6323b7 100644 --- a/src/test/ui/issue-53419.rs +++ b/src/test/ui/issue-53419.rs @@ -10,6 +10,8 @@ //compile-pass +#![feature(infer_outlives_requirements)] + struct Foo { bar: for<'r> Fn(usize, &'r FnMut()) } diff --git a/src/test/ui/issues/issue-37323.rs b/src/test/ui/issues/issue-37323.rs index 24ed7ce92bfda..98806cdd1b9af 100644 --- a/src/test/ui/issues/issue-37323.rs +++ b/src/test/ui/issues/issue-37323.rs @@ -8,8 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-pass - #![feature(rustc_attrs)] #![allow(warnings)] @@ -19,6 +17,7 @@ struct Point { struct NestedA<'a, 'b> { x: &'a NestedB<'b> + //~^ ERROR E0491 } struct NestedB<'a> { diff --git a/src/test/ui/issues/issue-37323.stderr b/src/test/ui/issues/issue-37323.stderr new file mode 100644 index 0000000000000..a83923a591023 --- /dev/null +++ b/src/test/ui/issues/issue-37323.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a NestedB<'b>`, reference has a longer lifetime than the data it references + --> $DIR/issue-37323.rs:19:5 + | +LL | x: &'a NestedB<'b> + | ^^^^^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the struct at 18:16 + --> $DIR/issue-37323.rs:18:16 + | +LL | struct NestedA<'a, 'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the struct at 18:20 + --> $DIR/issue-37323.rs:18:20 + | +LL | struct NestedA<'a, 'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.rs b/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.rs index 7bc83fd750703..0099a8bc10f5a 100644 --- a/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.rs +++ b/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.rs @@ -14,9 +14,9 @@ trait ListItem<'a> { trait Collection { fn len(&self) -> usize; } -// is now well formed. RFC 2093 struct List<'a, T: ListItem<'a>> { slice: &'a [T] + //~^ ERROR may not live long enough } impl<'a, T: ListItem<'a>> Collection for List<'a, T> { diff --git a/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.stderr b/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.stderr index db8d57bb19d03..ea79990bbb1fb 100644 --- a/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.stderr +++ b/src/test/ui/lifetimes/lifetime-doesnt-live-long-enough.stderr @@ -1,3 +1,17 @@ +error[E0309]: the parameter type `T` may not live long enough + --> $DIR/lifetime-doesnt-live-long-enough.rs:18:5 + | +LL | struct List<'a, T: ListItem<'a>> { + | -- help: consider adding an explicit lifetime bound `T: 'a`... +LL | slice: &'a [T] + | ^^^^^^^^^^^^^^ + | +note: ...so that the reference type `&'a [T]` does not outlive the data it points at + --> $DIR/lifetime-doesnt-live-long-enough.rs:18:5 + | +LL | slice: &'a [T] + | ^^^^^^^^^^^^^^ + error[E0310]: the parameter type `T` may not live long enough --> $DIR/lifetime-doesnt-live-long-enough.rs:29:5 | @@ -95,7 +109,7 @@ LL | | //~^ ERROR may not live long enough LL | | } | |_____^ -error: aborting due to 6 previous errors +error: aborting due to 7 previous errors Some errors occurred: E0309, E0310. For more information about an error, try `rustc --explain E0309`. diff --git a/src/test/ui/lint/lint-ctypes.rs b/src/test/ui/lint/lint-ctypes.rs index e09aabaf69253..b8b1a675c5f6d 100644 --- a/src/test/ui/lint/lint-ctypes.rs +++ b/src/test/ui/lint/lint-ctypes.rs @@ -11,8 +11,6 @@ #![deny(improper_ctypes)] #![feature(libc)] -#![allow(private_in_public)] - extern crate libc; use std::marker::PhantomData; diff --git a/src/test/ui/lint/lint-ctypes.stderr b/src/test/ui/lint/lint-ctypes.stderr index b243c49316f8c..b97e4662660fb 100644 --- a/src/test/ui/lint/lint-ctypes.stderr +++ b/src/test/ui/lint/lint-ctypes.stderr @@ -1,5 +1,5 @@ error: `extern` block uses type `Foo` which is not FFI-safe: this struct has unspecified layout - --> $DIR/lint-ctypes.rs:56:28 + --> $DIR/lint-ctypes.rs:54:28 | LL | pub fn ptr_type1(size: *const Foo); //~ ERROR: uses type `Foo` | ^^^^^^^^^^ @@ -11,26 +11,26 @@ LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ = help: consider adding a #[repr(C)] or #[repr(transparent)] attribute to this struct note: type defined here - --> $DIR/lint-ctypes.rs:34:1 + --> $DIR/lint-ctypes.rs:32:1 | LL | pub struct Foo; | ^^^^^^^^^^^^^^^ error: `extern` block uses type `Foo` which is not FFI-safe: this struct has unspecified layout - --> $DIR/lint-ctypes.rs:57:28 + --> $DIR/lint-ctypes.rs:55:28 | LL | pub fn ptr_type2(size: *const Foo); //~ ERROR: uses type `Foo` | ^^^^^^^^^^ | = help: consider adding a #[repr(C)] or #[repr(transparent)] attribute to this struct note: type defined here - --> $DIR/lint-ctypes.rs:34:1 + --> $DIR/lint-ctypes.rs:32:1 | LL | pub struct Foo; | ^^^^^^^^^^^^^^^ error: `extern` block uses type `[u32]` which is not FFI-safe: slices have no C equivalent - --> $DIR/lint-ctypes.rs:58:26 + --> $DIR/lint-ctypes.rs:56:26 | LL | pub fn slice_type(p: &[u32]); //~ ERROR: uses type `[u32]` | ^^^^^^ @@ -38,7 +38,7 @@ LL | pub fn slice_type(p: &[u32]); //~ ERROR: uses type `[u32]` = help: consider using a raw pointer instead error: `extern` block uses type `str` which is not FFI-safe: string slices have no C equivalent - --> $DIR/lint-ctypes.rs:59:24 + --> $DIR/lint-ctypes.rs:57:24 | LL | pub fn str_type(p: &str); //~ ERROR: uses type `str` | ^^^^ @@ -46,7 +46,7 @@ LL | pub fn str_type(p: &str); //~ ERROR: uses type `str` = help: consider using `*const u8` and a length instead error: `extern` block uses type `std::boxed::Box` which is not FFI-safe: this struct has unspecified layout - --> $DIR/lint-ctypes.rs:60:24 + --> $DIR/lint-ctypes.rs:58:24 | LL | pub fn box_type(p: Box); //~ ERROR uses type `std::boxed::Box` | ^^^^^^^^ @@ -54,7 +54,7 @@ LL | pub fn box_type(p: Box); //~ ERROR uses type `std::boxed::Box = help: consider adding a #[repr(C)] or #[repr(transparent)] attribute to this struct error: `extern` block uses type `char` which is not FFI-safe: the `char` type has no C equivalent - --> $DIR/lint-ctypes.rs:61:25 + --> $DIR/lint-ctypes.rs:59:25 | LL | pub fn char_type(p: char); //~ ERROR uses type `char` | ^^^^ @@ -62,25 +62,25 @@ LL | pub fn char_type(p: char); //~ ERROR uses type `char` = help: consider using `u32` or `libc::wchar_t` instead error: `extern` block uses type `i128` which is not FFI-safe: 128-bit integers don't currently have a known stable ABI - --> $DIR/lint-ctypes.rs:62:25 + --> $DIR/lint-ctypes.rs:60:25 | LL | pub fn i128_type(p: i128); //~ ERROR uses type `i128` | ^^^^ error: `extern` block uses type `u128` which is not FFI-safe: 128-bit integers don't currently have a known stable ABI - --> $DIR/lint-ctypes.rs:63:25 + --> $DIR/lint-ctypes.rs:61:25 | LL | pub fn u128_type(p: u128); //~ ERROR uses type `u128` | ^^^^ error: `extern` block uses type `dyn std::clone::Clone` which is not FFI-safe: trait objects have no C equivalent - --> $DIR/lint-ctypes.rs:64:26 + --> $DIR/lint-ctypes.rs:62:26 | LL | pub fn trait_type(p: &Clone); //~ ERROR uses type `dyn std::clone::Clone` | ^^^^^^ error: `extern` block uses type `(i32, i32)` which is not FFI-safe: tuples have unspecified layout - --> $DIR/lint-ctypes.rs:65:26 + --> $DIR/lint-ctypes.rs:63:26 | LL | pub fn tuple_type(p: (i32, i32)); //~ ERROR uses type `(i32, i32)` | ^^^^^^^^^^ @@ -88,7 +88,7 @@ LL | pub fn tuple_type(p: (i32, i32)); //~ ERROR uses type `(i32, i32)` = help: consider using a struct instead error: `extern` block uses type `(i32, i32)` which is not FFI-safe: tuples have unspecified layout - --> $DIR/lint-ctypes.rs:66:27 + --> $DIR/lint-ctypes.rs:64:27 | LL | pub fn tuple_type2(p: I32Pair); //~ ERROR uses type `(i32, i32)` | ^^^^^^^ @@ -96,32 +96,32 @@ LL | pub fn tuple_type2(p: I32Pair); //~ ERROR uses type `(i32, i32)` = help: consider using a struct instead error: `extern` block uses type `ZeroSize` which is not FFI-safe: this struct has no fields - --> $DIR/lint-ctypes.rs:67:25 + --> $DIR/lint-ctypes.rs:65:25 | LL | pub fn zero_size(p: ZeroSize); //~ ERROR struct has no fields | ^^^^^^^^ | = help: consider adding a member to this struct note: type defined here - --> $DIR/lint-ctypes.rs:30:1 + --> $DIR/lint-ctypes.rs:28:1 | LL | pub struct ZeroSize; | ^^^^^^^^^^^^^^^^^^^^ error: `extern` block uses type `ZeroSizeWithPhantomData` which is not FFI-safe: composed only of PhantomData - --> $DIR/lint-ctypes.rs:68:33 + --> $DIR/lint-ctypes.rs:66:33 | LL | pub fn zero_size_phantom(p: ZeroSizeWithPhantomData); //~ ERROR composed only of PhantomData | ^^^^^^^^^^^^^^^^^^^^^^^ error: `extern` block uses type `std::marker::PhantomData` which is not FFI-safe: composed only of PhantomData - --> $DIR/lint-ctypes.rs:70:12 + --> $DIR/lint-ctypes.rs:68:12 | LL | -> ::std::marker::PhantomData; //~ ERROR: composed only of PhantomData | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: `extern` block uses type `fn()` which is not FFI-safe: this function pointer has Rust-specific calling convention - --> $DIR/lint-ctypes.rs:71:23 + --> $DIR/lint-ctypes.rs:69:23 | LL | pub fn fn_type(p: RustFn); //~ ERROR function pointer has Rust-specific | ^^^^^^ @@ -129,7 +129,7 @@ LL | pub fn fn_type(p: RustFn); //~ ERROR function pointer has Rust-specific = help: consider using an `extern fn(...) -> ...` function pointer instead error: `extern` block uses type `fn()` which is not FFI-safe: this function pointer has Rust-specific calling convention - --> $DIR/lint-ctypes.rs:72:24 + --> $DIR/lint-ctypes.rs:70:24 | LL | pub fn fn_type2(p: fn()); //~ ERROR function pointer has Rust-specific | ^^^^ @@ -137,7 +137,7 @@ LL | pub fn fn_type2(p: fn()); //~ ERROR function pointer has Rust-specific = help: consider using an `extern fn(...) -> ...` function pointer instead error: `extern` block uses type `std::boxed::Box` which is not FFI-safe: this struct has unspecified layout - --> $DIR/lint-ctypes.rs:73:28 + --> $DIR/lint-ctypes.rs:71:28 | LL | pub fn fn_contained(p: RustBadRet); //~ ERROR: uses type `std::boxed::Box` | ^^^^^^^^^^ @@ -145,13 +145,13 @@ LL | pub fn fn_contained(p: RustBadRet); //~ ERROR: uses type `std::boxed::B = help: consider adding a #[repr(C)] or #[repr(transparent)] attribute to this struct error: `extern` block uses type `i128` which is not FFI-safe: 128-bit integers don't currently have a known stable ABI - --> $DIR/lint-ctypes.rs:74:32 + --> $DIR/lint-ctypes.rs:72:32 | LL | pub fn transparent_i128(p: TransparentI128); //~ ERROR: uses type `i128` | ^^^^^^^^^^^^^^^ error: `extern` block uses type `str` which is not FFI-safe: string slices have no C equivalent - --> $DIR/lint-ctypes.rs:75:31 + --> $DIR/lint-ctypes.rs:73:31 | LL | pub fn transparent_str(p: TransparentStr); //~ ERROR: uses type `str` | ^^^^^^^^^^^^^^ @@ -159,7 +159,7 @@ LL | pub fn transparent_str(p: TransparentStr); //~ ERROR: uses type `str` = help: consider using `*const u8` and a length instead error: `extern` block uses type `std::boxed::Box` which is not FFI-safe: this struct has unspecified layout - --> $DIR/lint-ctypes.rs:76:30 + --> $DIR/lint-ctypes.rs:74:30 | LL | pub fn transparent_fn(p: TransparentBadFn); //~ ERROR: uses type `std::boxed::Box` | ^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/no_owned_box_lang_item.rs b/src/test/ui/no_owned_box_lang_item.rs index 34d1075f9b71d..1c2bf1573dcc1 100644 --- a/src/test/ui/no_owned_box_lang_item.rs +++ b/src/test/ui/no_owned_box_lang_item.rs @@ -15,12 +15,10 @@ #![feature(lang_items, box_syntax)] #![no_std] -use core::panic::PanicInfo; - fn main() { let x = box 1i32; } #[lang = "eh_personality"] extern fn eh_personality() {} #[lang = "eh_unwind_resume"] extern fn eh_unwind_resume() {} -#[lang = "panic_impl"] fn panic_impl(panic: &PanicInfo) -> ! { loop {} } +#[lang = "panic_impl"] fn panic_impl() -> ! { loop {} } diff --git a/src/test/ui/regions/regions-enum-not-wf.rs b/src/test/ui/regions/regions-enum-not-wf.rs index a2d3cf6779f17..e21f92bc9b885 100644 --- a/src/test/ui/regions/regions-enum-not-wf.rs +++ b/src/test/ui/regions/regions-enum-not-wf.rs @@ -8,43 +8,31 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// ignore-tidy-linelength - // Various examples of structs whose fields are not well-formed. #![allow(dead_code)] -trait Dummy<'a> { - type Out; -} -impl<'a, T> Dummy<'a> for T -where T: 'a -{ - type Out = (); -} -type RequireOutlives<'a, T> = >::Out; - enum Ref1<'a, T> { - Ref1Variant1(RequireOutlives<'a, T>) //~ ERROR the parameter type `T` may not live long enough + Ref1Variant1(&'a T) //~ ERROR the parameter type `T` may not live long enough } enum Ref2<'a, T> { Ref2Variant1, - Ref2Variant2(isize, RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough + Ref2Variant2(isize, &'a T), //~ ERROR the parameter type `T` may not live long enough } enum RefOk<'a, T:'a> { RefOkVariant1(&'a T) } -// This is now well formed. RFC 2093 enum RefIndirect<'a, T> { RefIndirectVariant1(isize, RefOk<'a,T>) + //~^ ERROR the parameter type `T` may not live long enough } -enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] - RefDoubleVariant1(&'a RequireOutlives<'b, T>) - //~^ 46:23: 46:49: the parameter type `T` may not live long enough [E0309] +enum RefDouble<'a, 'b, T> { + RefDoubleVariant1(&'a &'b T) + //~^ ERROR reference has a longer lifetime than the data } fn main() { } diff --git a/src/test/ui/regions/regions-enum-not-wf.stderr b/src/test/ui/regions/regions-enum-not-wf.stderr index 923ea17622ac0..381a8aada5a3f 100644 --- a/src/test/ui/regions/regions-enum-not-wf.stderr +++ b/src/test/ui/regions/regions-enum-not-wf.stderr @@ -1,67 +1,64 @@ error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:28:18 + --> $DIR/regions-enum-not-wf.rs:16:18 | LL | enum Ref1<'a, T> { | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | Ref1Variant1(RequireOutlives<'a, T>) //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | Ref1Variant1(&'a T) //~ ERROR the parameter type `T` may not live long enough + | ^^^^^ | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:28:18 +note: ...so that the reference type `&'a T` does not outlive the data it points at + --> $DIR/regions-enum-not-wf.rs:16:18 | -LL | Ref1Variant1(RequireOutlives<'a, T>) //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | Ref1Variant1(&'a T) //~ ERROR the parameter type `T` may not live long enough + | ^^^^^ error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:33:25 + --> $DIR/regions-enum-not-wf.rs:21:25 | LL | enum Ref2<'a, T> { | - help: consider adding an explicit lifetime bound `T: 'a`... LL | Ref2Variant1, -LL | Ref2Variant2(isize, RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | Ref2Variant2(isize, &'a T), //~ ERROR the parameter type `T` may not live long enough + | ^^^^^ | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:33:25 +note: ...so that the reference type `&'a T` does not outlive the data it points at + --> $DIR/regions-enum-not-wf.rs:21:25 | -LL | Ref2Variant2(isize, RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | Ref2Variant2(isize, &'a T), //~ ERROR the parameter type `T` may not live long enough + | ^^^^^ error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:45:1 + --> $DIR/regions-enum-not-wf.rs:29:32 | -LL | enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] - | ^ - help: consider adding an explicit lifetime bound `T: 'b`... - | _| - | | -LL | | RefDoubleVariant1(&'a RequireOutlives<'b, T>) -LL | | //~^ 46:23: 46:49: the parameter type `T` may not live long enough [E0309] -LL | | } - | |_^ +LL | enum RefIndirect<'a, T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | RefIndirectVariant1(isize, RefOk<'a,T>) + | ^^^^^^^^^^^ | note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:45:1 + --> $DIR/regions-enum-not-wf.rs:29:32 | -LL | / enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] -LL | | RefDoubleVariant1(&'a RequireOutlives<'b, T>) -LL | | //~^ 46:23: 46:49: the parameter type `T` may not live long enough [E0309] -LL | | } - | |_^ +LL | RefIndirectVariant1(isize, RefOk<'a,T>) + | ^^^^^^^^^^^ -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:46:23 +error[E0491]: in type `&'a &'b T`, reference has a longer lifetime than the data it references + --> $DIR/regions-enum-not-wf.rs:34:23 | -LL | enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] - | - help: consider adding an explicit lifetime bound `T: 'b`... -LL | RefDoubleVariant1(&'a RequireOutlives<'b, T>) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | RefDoubleVariant1(&'a &'b T) + | ^^^^^^^^^ | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:46:23 +note: the pointer is valid for the lifetime 'a as defined on the enum at 33:16 + --> $DIR/regions-enum-not-wf.rs:33:16 + | +LL | enum RefDouble<'a, 'b, T> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the enum at 33:20 + --> $DIR/regions-enum-not-wf.rs:33:20 | -LL | RefDoubleVariant1(&'a RequireOutlives<'b, T>) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | enum RefDouble<'a, 'b, T> { + | ^^ error: aborting due to 4 previous errors -For more information about this error, try `rustc --explain E0309`. +Some errors occurred: E0309, E0491. +For more information about an error, try `rustc --explain E0309`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-region-rev.rs b/src/test/ui/regions/regions-outlives-nominal-type-enum-region-rev.rs index 7a2be8c0d95bb..db25a0698fed4 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-enum-region-rev.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-region-rev.rs @@ -13,8 +13,6 @@ // // Rule OutlivesNominalType from RFC 1214. -// compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] @@ -23,8 +21,9 @@ mod rev_variant_struct_region { x: fn(&'a i32), } enum Bar<'a,'b> { - V(&'a Foo<'b>) + V(&'a Foo<'b>) //~ ERROR reference has a longer lifetime } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-region-rev.stderr b/src/test/ui/regions/regions-outlives-nominal-type-enum-region-rev.stderr new file mode 100644 index 0000000000000..5084097e30d11 --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-region-rev.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a rev_variant_struct_region::Foo<'b>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-enum-region-rev.rs:24:11 + | +LL | V(&'a Foo<'b>) //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the enum at 23:14 + --> $DIR/regions-outlives-nominal-type-enum-region-rev.rs:23:14 + | +LL | enum Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the enum at 23:17 + --> $DIR/regions-outlives-nominal-type-enum-region-rev.rs:23:17 + | +LL | enum Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-region.rs b/src/test/ui/regions/regions-outlives-nominal-type-enum-region.rs index 07127263bf869..403757042d2f3 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-enum-region.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-region.rs @@ -13,8 +13,6 @@ // // Rule OutlivesNominalType from RFC 1214. -// compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] @@ -23,8 +21,9 @@ mod variant_struct_region { x: &'a i32, } enum Bar<'a,'b> { - V(&'a Foo<'b>) + V(&'a Foo<'b>) //~ ERROR reference has a longer lifetime } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-region.stderr b/src/test/ui/regions/regions-outlives-nominal-type-enum-region.stderr new file mode 100644 index 0000000000000..ce187eddfa9d6 --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-region.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a variant_struct_region::Foo<'b>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-enum-region.rs:24:11 + | +LL | V(&'a Foo<'b>) //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the enum at 23:14 + --> $DIR/regions-outlives-nominal-type-enum-region.rs:23:14 + | +LL | enum Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the enum at 23:17 + --> $DIR/regions-outlives-nominal-type-enum-region.rs:23:17 + | +LL | enum Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-type-rev.rs b/src/test/ui/regions/regions-outlives-nominal-type-enum-type-rev.rs index 4941b568fc6c9..cc294651db773 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-enum-type-rev.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-type-rev.rs @@ -13,18 +13,17 @@ // // Rule OutlivesNominalType from RFC 1214. -//compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] -mod variant_struct_type { +mod rev_variant_struct_type { struct Foo { x: fn(T) } enum Bar<'a,'b> { - V(&'a Foo<&'b i32>) + V(&'a Foo<&'b i32>) //~ ERROR reference has a longer lifetime } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-type-rev.stderr b/src/test/ui/regions/regions-outlives-nominal-type-enum-type-rev.stderr new file mode 100644 index 0000000000000..8636b89b71abe --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-type-rev.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a rev_variant_struct_type::Foo<&'b i32>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-enum-type-rev.rs:24:11 + | +LL | V(&'a Foo<&'b i32>) //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the enum at 23:14 + --> $DIR/regions-outlives-nominal-type-enum-type-rev.rs:23:14 + | +LL | enum Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the enum at 23:17 + --> $DIR/regions-outlives-nominal-type-enum-type-rev.rs:23:17 + | +LL | enum Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-type.rs b/src/test/ui/regions/regions-outlives-nominal-type-enum-type.rs index 38eb0c97a47de..e269767cc1683 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-enum-type.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-type.rs @@ -13,8 +13,6 @@ // // Rule OutlivesNominalType from RFC 1214. -// compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] @@ -23,8 +21,9 @@ mod variant_struct_type { x: T } enum Bar<'a,'b> { - V(&'a Foo<&'b i32>) + F(&'a Foo<&'b i32>) //~ ERROR reference has a longer lifetime } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-enum-type.stderr b/src/test/ui/regions/regions-outlives-nominal-type-enum-type.stderr new file mode 100644 index 0000000000000..c209547e20c84 --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-enum-type.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a variant_struct_type::Foo<&'b i32>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-enum-type.rs:24:11 + | +LL | F(&'a Foo<&'b i32>) //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the enum at 23:14 + --> $DIR/regions-outlives-nominal-type-enum-type.rs:23:14 + | +LL | enum Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the enum at 23:17 + --> $DIR/regions-outlives-nominal-type-enum-type.rs:23:17 + | +LL | enum Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-region-rev.rs b/src/test/ui/regions/regions-outlives-nominal-type-struct-region-rev.rs index 50febdd45797e..c7e6ace8b9224 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-struct-region-rev.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-region-rev.rs @@ -13,8 +13,6 @@ // // Rule OutlivesNominalType from RFC 1214. -// compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] @@ -23,8 +21,9 @@ mod rev_variant_struct_region { x: fn(&'a i32), } struct Bar<'a,'b> { - f: &'a Foo<'b> + f: &'a Foo<'b> //~ ERROR reference has a longer lifetime } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-region-rev.stderr b/src/test/ui/regions/regions-outlives-nominal-type-struct-region-rev.stderr new file mode 100644 index 0000000000000..48980bdf8320e --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-region-rev.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a rev_variant_struct_region::Foo<'b>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-struct-region-rev.rs:24:9 + | +LL | f: &'a Foo<'b> //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the struct at 23:16 + --> $DIR/regions-outlives-nominal-type-struct-region-rev.rs:23:16 + | +LL | struct Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the struct at 23:19 + --> $DIR/regions-outlives-nominal-type-struct-region-rev.rs:23:19 + | +LL | struct Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-region.rs b/src/test/ui/regions/regions-outlives-nominal-type-struct-region.rs index ea07fb4104be1..2fe6444c33aec 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-struct-region.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-region.rs @@ -13,8 +13,6 @@ // // Rule OutlivesNominalType from RFC 1214. -// compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] @@ -27,4 +25,5 @@ mod variant_struct_region { } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-region.stderr b/src/test/ui/regions/regions-outlives-nominal-type-struct-region.stderr new file mode 100644 index 0000000000000..e2b328886b334 --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-region.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a variant_struct_region::Foo<'b>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-struct-region.rs:24:9 + | +LL | f: &'a Foo<'b> //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the struct at 23:16 + --> $DIR/regions-outlives-nominal-type-struct-region.rs:23:16 + | +LL | struct Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the struct at 23:19 + --> $DIR/regions-outlives-nominal-type-struct-region.rs:23:19 + | +LL | struct Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-type-rev.rs b/src/test/ui/regions/regions-outlives-nominal-type-struct-type-rev.rs index 735037ac2f6d4..c4b631bce9874 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-struct-type-rev.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-type-rev.rs @@ -13,8 +13,6 @@ // // Rule OutlivesNominalType from RFC 1214. -// compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] @@ -27,4 +25,5 @@ mod rev_variant_struct_type { } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-type-rev.stderr b/src/test/ui/regions/regions-outlives-nominal-type-struct-type-rev.stderr new file mode 100644 index 0000000000000..2bf04ffa64afb --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-type-rev.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a rev_variant_struct_type::Foo<&'b i32>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-struct-type-rev.rs:24:9 + | +LL | f: &'a Foo<&'b i32> //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the struct at 23:16 + --> $DIR/regions-outlives-nominal-type-struct-type-rev.rs:23:16 + | +LL | struct Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the struct at 23:19 + --> $DIR/regions-outlives-nominal-type-struct-type-rev.rs:23:19 + | +LL | struct Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-type.rs b/src/test/ui/regions/regions-outlives-nominal-type-struct-type.rs index dfd3583ce6cab..1c9489444a6a3 100644 --- a/src/test/ui/regions/regions-outlives-nominal-type-struct-type.rs +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-type.rs @@ -13,8 +13,6 @@ // // Rule OutlivesNominalType from RFC 1214. -// compile-pass - #![feature(rustc_attrs)] #![allow(dead_code)] @@ -27,4 +25,5 @@ mod variant_struct_type { } } +#[rustc_error] fn main() { } diff --git a/src/test/ui/regions/regions-outlives-nominal-type-struct-type.stderr b/src/test/ui/regions/regions-outlives-nominal-type-struct-type.stderr new file mode 100644 index 0000000000000..af9f1d3722aeb --- /dev/null +++ b/src/test/ui/regions/regions-outlives-nominal-type-struct-type.stderr @@ -0,0 +1,20 @@ +error[E0491]: in type `&'a variant_struct_type::Foo<&'b i32>`, reference has a longer lifetime than the data it references + --> $DIR/regions-outlives-nominal-type-struct-type.rs:24:9 + | +LL | f: &'a Foo<&'b i32> //~ ERROR reference has a longer lifetime + | ^^^^^^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the struct at 23:16 + --> $DIR/regions-outlives-nominal-type-struct-type.rs:23:16 + | +LL | struct Bar<'a,'b> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the struct at 23:19 + --> $DIR/regions-outlives-nominal-type-struct-type.rs:23:19 + | +LL | struct Bar<'a,'b> { + | ^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/regions/regions-struct-not-wf.lexical.stderr b/src/test/ui/regions/regions-struct-not-wf.lexical.stderr new file mode 100644 index 0000000000000..9433b8b1952f2 --- /dev/null +++ b/src/test/ui/regions/regions-struct-not-wf.lexical.stderr @@ -0,0 +1,49 @@ +error[E0309]: the parameter type `T` may not live long enough + --> $DIR/regions-struct-not-wf.rs:19:5 + | +LL | struct Ref<'a, T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | field: &'a T + | ^^^^^^^^^^^^ + | +note: ...so that the reference type `&'a T` does not outlive the data it points at + --> $DIR/regions-struct-not-wf.rs:19:5 + | +LL | field: &'a T + | ^^^^^^^^^^^^ + +error[E0309]: the parameter type `T` may not live long enough + --> $DIR/regions-struct-not-wf.rs:29:5 + | +LL | struct RefIndirect<'a, T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | field: RefOk<'a, T> + | ^^^^^^^^^^^^^^^^^^^ + | +note: ...so that the type `T` will meet its required lifetime bounds + --> $DIR/regions-struct-not-wf.rs:29:5 + | +LL | field: RefOk<'a, T> + | ^^^^^^^^^^^^^^^^^^^ + +error[E0491]: in type `&'a &'b T`, reference has a longer lifetime than the data it references + --> $DIR/regions-struct-not-wf.rs:35:5 + | +LL | field: &'a &'b T + | ^^^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the struct at 34:18 + --> $DIR/regions-struct-not-wf.rs:34:18 + | +LL | struct DoubleRef<'a, 'b, T> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the struct at 34:22 + --> $DIR/regions-struct-not-wf.rs:34:22 + | +LL | struct DoubleRef<'a, 'b, T> { + | ^^ + +error: aborting due to 3 previous errors + +Some errors occurred: E0309, E0491. +For more information about an error, try `rustc --explain E0309`. diff --git a/src/test/ui/regions/regions-struct-not-wf.nll.stderr b/src/test/ui/regions/regions-struct-not-wf.nll.stderr new file mode 100644 index 0000000000000..9433b8b1952f2 --- /dev/null +++ b/src/test/ui/regions/regions-struct-not-wf.nll.stderr @@ -0,0 +1,49 @@ +error[E0309]: the parameter type `T` may not live long enough + --> $DIR/regions-struct-not-wf.rs:19:5 + | +LL | struct Ref<'a, T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | field: &'a T + | ^^^^^^^^^^^^ + | +note: ...so that the reference type `&'a T` does not outlive the data it points at + --> $DIR/regions-struct-not-wf.rs:19:5 + | +LL | field: &'a T + | ^^^^^^^^^^^^ + +error[E0309]: the parameter type `T` may not live long enough + --> $DIR/regions-struct-not-wf.rs:29:5 + | +LL | struct RefIndirect<'a, T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | field: RefOk<'a, T> + | ^^^^^^^^^^^^^^^^^^^ + | +note: ...so that the type `T` will meet its required lifetime bounds + --> $DIR/regions-struct-not-wf.rs:29:5 + | +LL | field: RefOk<'a, T> + | ^^^^^^^^^^^^^^^^^^^ + +error[E0491]: in type `&'a &'b T`, reference has a longer lifetime than the data it references + --> $DIR/regions-struct-not-wf.rs:35:5 + | +LL | field: &'a &'b T + | ^^^^^^^^^^^^^^^^ + | +note: the pointer is valid for the lifetime 'a as defined on the struct at 34:18 + --> $DIR/regions-struct-not-wf.rs:34:18 + | +LL | struct DoubleRef<'a, 'b, T> { + | ^^ +note: but the referenced data is only valid for the lifetime 'b as defined on the struct at 34:22 + --> $DIR/regions-struct-not-wf.rs:34:22 + | +LL | struct DoubleRef<'a, 'b, T> { + | ^^ + +error: aborting due to 3 previous errors + +Some errors occurred: E0309, E0491. +For more information about an error, try `rustc --explain E0309`. diff --git a/src/test/ui/regions/regions-struct-not-wf.rs b/src/test/ui/regions/regions-struct-not-wf.rs index bdd708197bc76..9106f1f0ba69c 100644 --- a/src/test/ui/regions/regions-struct-not-wf.rs +++ b/src/test/ui/regions/regions-struct-not-wf.rs @@ -10,29 +10,31 @@ // Various examples of structs whose fields are not well-formed. -#![allow(dead_code)] +// revisions:lexical nll -trait Trait<'a, T> { - type Out; -} -trait Trait1<'a, 'b, T> { - type Out; -} +#![allow(dead_code)] +#![cfg_attr(nll, feature(nll))] -impl<'a, T> Trait<'a, T> for usize { - type Out = &'a T; +struct Ref<'a, T> { + field: &'a T + //[lexical]~^ ERROR the parameter type `T` may not live long enough + //[nll]~^^ ERROR the parameter type `T` may not live long enough } struct RefOk<'a, T:'a> { field: &'a T } -impl<'a, T> Trait<'a, T> for u32 { - type Out = RefOk<'a, T>; +struct RefIndirect<'a, T> { + field: RefOk<'a, T> + //[lexical]~^ ERROR the parameter type `T` may not live long enough + //[nll]~^^ ERROR the parameter type `T` may not live long enough } -impl<'a, 'b, T> Trait1<'a, 'b, T> for u32 { - type Out = &'a &'b T; +struct DoubleRef<'a, 'b, T> { + field: &'a &'b T + //[lexical]~^ ERROR reference has a longer lifetime than the data it references + //[nll]~^^ ERROR reference has a longer lifetime than the data it references } fn main() { } diff --git a/src/test/ui/regions/regions-struct-not-wf.stderr b/src/test/ui/regions/regions-struct-not-wf.stderr deleted file mode 100644 index d8c8b6c3ccc86..0000000000000 --- a/src/test/ui/regions/regions-struct-not-wf.stderr +++ /dev/null @@ -1,49 +0,0 @@ -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-struct-not-wf.rs:23:5 - | -LL | impl<'a, T> Trait<'a, T> for usize { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | type Out = &'a T; - | ^^^^^^^^^^^^^^^^^ - | -note: ...so that the reference type `&'a T` does not outlive the data it points at - --> $DIR/regions-struct-not-wf.rs:23:5 - | -LL | type Out = &'a T; - | ^^^^^^^^^^^^^^^^^ - -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-struct-not-wf.rs:31:5 - | -LL | impl<'a, T> Trait<'a, T> for u32 { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | type Out = RefOk<'a, T>; - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-struct-not-wf.rs:31:5 - | -LL | type Out = RefOk<'a, T>; - | ^^^^^^^^^^^^^^^^^^^^^^^^ - -error[E0491]: in type `&'a &'b T`, reference has a longer lifetime than the data it references - --> $DIR/regions-struct-not-wf.rs:35:5 - | -LL | type Out = &'a &'b T; - | ^^^^^^^^^^^^^^^^^^^^^ - | -note: the pointer is valid for the lifetime 'a as defined on the impl at 34:6 - --> $DIR/regions-struct-not-wf.rs:34:6 - | -LL | impl<'a, 'b, T> Trait1<'a, 'b, T> for u32 { - | ^^ -note: but the referenced data is only valid for the lifetime 'b as defined on the impl at 34:10 - --> $DIR/regions-struct-not-wf.rs:34:10 - | -LL | impl<'a, 'b, T> Trait1<'a, 'b, T> for u32 { - | ^^ - -error: aborting due to 3 previous errors - -Some errors occurred: E0309, E0491. -For more information about an error, try `rustc --explain E0309`. diff --git a/src/test/ui/rfc-2093-infer-outlives/cross-crate.rs b/src/test/ui/rfc-2093-infer-outlives/cross-crate.rs index cc659cd14b1a1..016739978834b 100644 --- a/src/test/ui/rfc-2093-infer-outlives/cross-crate.rs +++ b/src/test/ui/rfc-2093-infer-outlives/cross-crate.rs @@ -9,9 +9,10 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] -struct Foo<'a, T> { //~ ERROR 14:1: 16:2: rustc_outlives +struct Foo<'a, T> { //~ ERROR 15:1: 17:2: rustc_outlives bar: std::slice::IterMut<'a, T> } diff --git a/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr b/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr index dd00c14ea16f2..a90643ae8916b 100644 --- a/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/cross-crate.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/cross-crate.rs:14:1 + --> $DIR/cross-crate.rs:15:1 | -LL | / struct Foo<'a, T> { //~ ERROR 14:1: 16:2: rustc_outlives +LL | / struct Foo<'a, T> { //~ ERROR 15:1: 17:2: rustc_outlives LL | | bar: std::slice::IterMut<'a, T> LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.rs b/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.rs index 47dc5dfdc96e6..72d5127c294dc 100644 --- a/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.rs +++ b/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.rs @@ -10,6 +10,8 @@ // ignore-tidy-linelength +#![feature(infer_outlives_requirements)] + /* * We don't infer `T: 'static` outlives relationships by default. * Instead an additional feature gate `infer_static_outlives_requirements` @@ -17,7 +19,7 @@ */ struct Foo { - bar: Bar //~ ERROR 20:5: 20:16: the parameter type `U` may not live long enough [E0310] + bar: Bar //~ ERROR 22:5: 22:16: the parameter type `U` may not live long enough [E0310] } struct Bar { x: T, diff --git a/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.stderr b/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.stderr index 5d8cf0aa3245c..775ac215e190d 100644 --- a/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/dont-infer-static.stderr @@ -1,15 +1,15 @@ error[E0310]: the parameter type `U` may not live long enough - --> $DIR/dont-infer-static.rs:20:5 + --> $DIR/dont-infer-static.rs:22:5 | LL | struct Foo { | - help: consider adding an explicit lifetime bound `U: 'static`... -LL | bar: Bar //~ ERROR 20:5: 20:16: the parameter type `U` may not live long enough [E0310] +LL | bar: Bar //~ ERROR 22:5: 22:16: the parameter type `U` may not live long enough [E0310] | ^^^^^^^^^^^ | note: ...so that the type `U` will meet its required lifetime bounds - --> $DIR/dont-infer-static.rs:20:5 + --> $DIR/dont-infer-static.rs:22:5 | -LL | bar: Bar //~ ERROR 20:5: 20:16: the parameter type `U` may not live long enough [E0310] +LL | bar: Bar //~ ERROR 22:5: 22:16: the parameter type `U` may not live long enough [E0310] | ^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/rfc-2093-infer-outlives/enum.rs b/src/test/ui/rfc-2093-infer-outlives/enum.rs index b2c18b274ce01..5071465b5f647 100644 --- a/src/test/ui/rfc-2093-infer-outlives/enum.rs +++ b/src/test/ui/rfc-2093-infer-outlives/enum.rs @@ -10,26 +10,24 @@ // ignore-tidy-linelength -#![feature(rustc_attrs)] - // Needs an explicit where clause stating outlives condition. (RFC 2093) // Type T needs to outlive lifetime 'a. -#[rustc_outlives] -enum Foo<'a, T> { //~ ERROR rustc_outlives +enum Foo<'a, T> { + One(Bar<'a, T>) } // Type U needs to outlive lifetime 'b -#[rustc_outlives] -struct Bar<'b, U> { //~ ERROR rustc_outlives - field2: &'b U +struct Bar<'b, U> { + field2: &'b U //~ ERROR the parameter type `U` may not live long enough [E0309] } + + // Type K needs to outlive lifetime 'c. -#[rustc_outlives] -enum Ying<'c, K> { //~ ERROR rustc_outlives - One(&'c Yang) +enum Ying<'c, K> { + One(&'c Yang) //~ ERROR the parameter type `K` may not live long enough [E0309] } struct Yang { diff --git a/src/test/ui/rfc-2093-infer-outlives/enum.stderr b/src/test/ui/rfc-2093-infer-outlives/enum.stderr index e621c435eea35..604dd0b43c04a 100644 --- a/src/test/ui/rfc-2093-infer-outlives/enum.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/enum.stderr @@ -1,32 +1,31 @@ -error: rustc_outlives - --> $DIR/enum.rs:19:1 +error[E0309]: the parameter type `U` may not live long enough + --> $DIR/enum.rs:23:5 | -LL | / enum Foo<'a, T> { //~ ERROR rustc_outlives -LL | | One(Bar<'a, T>) -LL | | } - | |_^ +LL | struct Bar<'b, U> { + | - help: consider adding an explicit lifetime bound `U: 'b`... +LL | field2: &'b U //~ ERROR the parameter type `U` may not live long enough [E0309] + | ^^^^^^^^^^^^^ | - = note: T : 'a - -error: rustc_outlives - --> $DIR/enum.rs:25:1 - | -LL | / struct Bar<'b, U> { //~ ERROR rustc_outlives -LL | | field2: &'b U -LL | | } - | |_^ +note: ...so that the reference type `&'b U` does not outlive the data it points at + --> $DIR/enum.rs:23:5 | - = note: U : 'b +LL | field2: &'b U //~ ERROR the parameter type `U` may not live long enough [E0309] + | ^^^^^^^^^^^^^ -error: rustc_outlives - --> $DIR/enum.rs:31:1 +error[E0309]: the parameter type `K` may not live long enough + --> $DIR/enum.rs:30:9 + | +LL | enum Ying<'c, K> { + | - help: consider adding an explicit lifetime bound `K: 'c`... +LL | One(&'c Yang) //~ ERROR the parameter type `K` may not live long enough [E0309] + | ^^^^^^^^^^^ | -LL | / enum Ying<'c, K> { //~ ERROR rustc_outlives -LL | | One(&'c Yang) -LL | | } - | |_^ +note: ...so that the reference type `&'c Yang` does not outlive the data it points at + --> $DIR/enum.rs:30:9 | - = note: K : 'c +LL | One(&'c Yang) //~ ERROR the parameter type `K` may not live long enough [E0309] + | ^^^^^^^^^^^ -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0309`. diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.rs b/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.rs index 9264259520952..445c246a12067 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.rs +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.rs @@ -10,12 +10,13 @@ #![feature(dyn_trait)] #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] trait Trait<'x, T> where T: 'x { } #[rustc_outlives] -struct Foo<'a, A> //~ ERROR 18:1: 21:2: rustc_outlives +struct Foo<'a, A> //~ ERROR 19:1: 22:2: rustc_outlives { foo: Box> } diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr index 5d167493308fd..4bb5d90e9644e 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-dyn.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/explicit-dyn.rs:18:1 + --> $DIR/explicit-dyn.rs:19:1 | -LL | / struct Foo<'a, A> //~ ERROR 18:1: 21:2: rustc_outlives +LL | / struct Foo<'a, A> //~ ERROR 19:1: 22:2: rustc_outlives LL | | { LL | | foo: Box> LL | | } diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-enum.rs b/src/test/ui/rfc-2093-infer-outlives/explicit-enum.rs index 0ac75fc255601..e85b49bb0bf23 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-enum.rs +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-enum.rs @@ -9,9 +9,10 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] -enum Foo<'a, U> { //~ ERROR 14:1: 16:2: rustc_outlives +enum Foo<'a, U> { //~ ERROR 15:1: 17:2: rustc_outlives One(Bar<'a, U>) } diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr index 33ef4b7e6a108..d7438758d77af 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-enum.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/explicit-enum.rs:14:1 + --> $DIR/explicit-enum.rs:15:1 | -LL | / enum Foo<'a, U> { //~ ERROR 14:1: 16:2: rustc_outlives +LL | / enum Foo<'a, U> { //~ ERROR 15:1: 17:2: rustc_outlives LL | | One(Bar<'a, U>) LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-projection.rs b/src/test/ui/rfc-2093-infer-outlives/explicit-projection.rs index 02c171627e6f0..2662043c36d59 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-projection.rs +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-projection.rs @@ -9,6 +9,7 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] trait Trait<'x, T> where T: 'x { type Type; diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr index 5480130c2d3f1..43ab02d01ed57 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-projection.stderr @@ -1,5 +1,5 @@ error: rustc_outlives - --> $DIR/explicit-projection.rs:18:1 + --> $DIR/explicit-projection.rs:19:1 | LL | / struct Foo<'a, A, B> where A: Trait<'a, B> //~ ERROR rustc_outlives LL | | { diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-struct.rs b/src/test/ui/rfc-2093-infer-outlives/explicit-struct.rs index 4dc01a5221006..d42c9160e1e75 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-struct.rs +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-struct.rs @@ -9,9 +9,10 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] -struct Foo<'b, U> { //~ ERROR 14:1: 16:2: rustc_outlives +struct Foo<'b, U> { //~ ERROR 15:1: 17:2: rustc_outlives bar: Bar<'b, U> } diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr index 7655dec5cb851..0223f707e8d9b 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-struct.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/explicit-struct.rs:14:1 + --> $DIR/explicit-struct.rs:15:1 | -LL | / struct Foo<'b, U> { //~ ERROR 14:1: 16:2: rustc_outlives +LL | / struct Foo<'b, U> { //~ ERROR 15:1: 17:2: rustc_outlives LL | | bar: Bar<'b, U> LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-union.rs b/src/test/ui/rfc-2093-infer-outlives/explicit-union.rs index ae4b9b15f683b..e548b24719383 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-union.rs +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-union.rs @@ -9,11 +9,13 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #![feature(untagged_unions)] #![allow(unions_with_drop_fields)] + #[rustc_outlives] -union Foo<'b, U> { //~ ERROR 16:1: 18:2: rustc_outlives +union Foo<'b, U> { //~ ERROR 18:1: 20:2: rustc_outlives bar: Bar<'b, U> } diff --git a/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr b/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr index c01c7532c8624..8622ae12aa10c 100644 --- a/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/explicit-union.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/explicit-union.rs:16:1 + --> $DIR/explicit-union.rs:18:1 | -LL | / union Foo<'b, U> { //~ ERROR 16:1: 18:2: rustc_outlives +LL | / union Foo<'b, U> { //~ ERROR 18:1: 20:2: rustc_outlives LL | | bar: Bar<'b, U> LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/infer-static.rs b/src/test/ui/rfc-2093-infer-outlives/infer-static.rs index c4407b8b89f24..aeca18c24b3db 100644 --- a/src/test/ui/rfc-2093-infer-outlives/infer-static.rs +++ b/src/test/ui/rfc-2093-infer-outlives/infer-static.rs @@ -9,10 +9,11 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #![feature(infer_static_outlives_requirements)] #[rustc_outlives] -struct Foo { //~ ERROR 15:1: 17:2: rustc_outlives +struct Foo { //~ ERROR 16:1: 18:2: rustc_outlives bar: Bar } struct Bar { diff --git a/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr b/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr index 0cb4f3faa3352..f167e522df650 100644 --- a/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/infer-static.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/infer-static.rs:15:1 + --> $DIR/infer-static.rs:16:1 | -LL | / struct Foo { //~ ERROR 15:1: 17:2: rustc_outlives +LL | / struct Foo { //~ ERROR 16:1: 18:2: rustc_outlives LL | | bar: Bar LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-enum.rs b/src/test/ui/rfc-2093-infer-outlives/nested-enum.rs index 5cb365b7a7bbf..85f381ea515c3 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-enum.rs +++ b/src/test/ui/rfc-2093-infer-outlives/nested-enum.rs @@ -9,9 +9,11 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] + #[rustc_outlives] -enum Foo<'a, T> { //~ ERROR 14:1: 17:2: rustc_outlives +enum Foo<'a, T> { //~ ERROR 16:1: 19:2: rustc_outlives One(Bar<'a, T>) } diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr index f0a6905d14bdd..54a886a92fd40 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-enum.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/nested-enum.rs:14:1 + --> $DIR/nested-enum.rs:16:1 | -LL | / enum Foo<'a, T> { //~ ERROR 14:1: 17:2: rustc_outlives +LL | / enum Foo<'a, T> { //~ ERROR 16:1: 19:2: rustc_outlives LL | | LL | | One(Bar<'a, T>) LL | | } diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-regions.rs b/src/test/ui/rfc-2093-infer-outlives/nested-regions.rs index e56d7d7a053b1..792d2a02962dc 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-regions.rs +++ b/src/test/ui/rfc-2093-infer-outlives/nested-regions.rs @@ -9,9 +9,10 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] -struct Foo<'a, 'b, T> { //~ ERROR 14:1: 16:2: rustc_outlives +struct Foo<'a, 'b, T> { //~ ERROR 15:1: 17:2: rustc_outlives x: &'a &'b T } diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr index 978fe352bc750..04fe4814a0415 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-regions.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/nested-regions.rs:14:1 + --> $DIR/nested-regions.rs:15:1 | -LL | / struct Foo<'a, 'b, T> { //~ ERROR 14:1: 16:2: rustc_outlives +LL | / struct Foo<'a, 'b, T> { //~ ERROR 15:1: 17:2: rustc_outlives LL | | x: &'a &'b T LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-structs.rs b/src/test/ui/rfc-2093-infer-outlives/nested-structs.rs index 84d1b88188003..71a36dfb34423 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-structs.rs +++ b/src/test/ui/rfc-2093-infer-outlives/nested-structs.rs @@ -9,9 +9,10 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] -struct Foo<'a, T> { //~ ERROR 14:1: 16:2: rustc_outlives +struct Foo<'a, T> { //~ ERROR 15:1: 17:2: rustc_outlives field1: Bar<'a, T> } diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr index db02232b9130b..abea71f2d12fc 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-structs.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/nested-structs.rs:14:1 + --> $DIR/nested-structs.rs:15:1 | -LL | / struct Foo<'a, T> { //~ ERROR 14:1: 16:2: rustc_outlives +LL | / struct Foo<'a, T> { //~ ERROR 15:1: 17:2: rustc_outlives LL | | field1: Bar<'a, T> LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-union.rs b/src/test/ui/rfc-2093-infer-outlives/nested-union.rs index 974675f51c711..0720e581e2c5b 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-union.rs +++ b/src/test/ui/rfc-2093-infer-outlives/nested-union.rs @@ -9,11 +9,13 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #![feature(untagged_unions)] #![allow(unions_with_drop_fields)] + #[rustc_outlives] -union Foo<'a, T> { //~ ERROR 16:1: 18:2: rustc_outlives +union Foo<'a, T> { //~ ERROR 18:1: 20:2: rustc_outlives field1: Bar<'a, T> } diff --git a/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr b/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr index 2704a1d2def77..b7b50c1506146 100644 --- a/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/nested-union.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/nested-union.rs:16:1 + --> $DIR/nested-union.rs:18:1 | -LL | / union Foo<'a, T> { //~ ERROR 16:1: 18:2: rustc_outlives +LL | / union Foo<'a, T> { //~ ERROR 18:1: 20:2: rustc_outlives LL | | field1: Bar<'a, T> LL | | } | |_^ diff --git a/src/test/ui/rfc-2093-infer-outlives/privacy.rs b/src/test/ui/rfc-2093-infer-outlives/privacy.rs deleted file mode 100644 index 180f5ac6cdc46..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/privacy.rs +++ /dev/null @@ -1,20 +0,0 @@ -// Test that we do not get a privacy error here. Initially, we did, -// because we inferred an outlives predciate of ` as -// Private>::Out: 'a`, but the private trait is -- well -- private, -// and hence it was not something that a pub trait could refer to. -// -// run-pass - -#![allow(dead_code)] - -pub struct Foo<'a> { - field: Option<&'a as Private>::Out> -} - -trait Private { - type Out: ?Sized; -} - -impl Private for T { type Out = Self; } - -fn main() { } diff --git a/src/test/ui/rfc-2093-infer-outlives/projection.rs b/src/test/ui/rfc-2093-infer-outlives/projection.rs index 7693d0e9401d2..3abce873b28f9 100644 --- a/src/test/ui/rfc-2093-infer-outlives/projection.rs +++ b/src/test/ui/rfc-2093-infer-outlives/projection.rs @@ -9,6 +9,7 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] struct Foo<'a, T: Iterator> { //~ ERROR rustc_outlives diff --git a/src/test/ui/rfc-2093-infer-outlives/projection.stderr b/src/test/ui/rfc-2093-infer-outlives/projection.stderr index fb4835ae2d8bf..dfaf7793a51f2 100644 --- a/src/test/ui/rfc-2093-infer-outlives/projection.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/projection.stderr @@ -1,5 +1,5 @@ error: rustc_outlives - --> $DIR/projection.rs:14:1 + --> $DIR/projection.rs:15:1 | LL | / struct Foo<'a, T: Iterator> { //~ ERROR rustc_outlives LL | | bar: &'a T::Item diff --git a/src/test/ui/rfc-2093-infer-outlives/reference.rs b/src/test/ui/rfc-2093-infer-outlives/reference.rs index 760d9889bbe76..56b1bc3c7d11e 100644 --- a/src/test/ui/rfc-2093-infer-outlives/reference.rs +++ b/src/test/ui/rfc-2093-infer-outlives/reference.rs @@ -9,6 +9,7 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] struct Foo<'a, T> { //~ ERROR rustc_outlives diff --git a/src/test/ui/rfc-2093-infer-outlives/reference.stderr b/src/test/ui/rfc-2093-infer-outlives/reference.stderr index fdd312f9b89c5..785d76e8f2275 100644 --- a/src/test/ui/rfc-2093-infer-outlives/reference.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/reference.stderr @@ -1,5 +1,5 @@ error: rustc_outlives - --> $DIR/reference.rs:14:1 + --> $DIR/reference.rs:15:1 | LL | / struct Foo<'a, T> { //~ ERROR rustc_outlives LL | | bar: &'a T, diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-enum-not-wf.rs b/src/test/ui/rfc-2093-infer-outlives/regions-enum-not-wf.rs deleted file mode 100644 index a2d3cf6779f17..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-enum-not-wf.rs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2014 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. - -// ignore-tidy-linelength - -// Various examples of structs whose fields are not well-formed. - -#![allow(dead_code)] - -trait Dummy<'a> { - type Out; -} -impl<'a, T> Dummy<'a> for T -where T: 'a -{ - type Out = (); -} -type RequireOutlives<'a, T> = >::Out; - -enum Ref1<'a, T> { - Ref1Variant1(RequireOutlives<'a, T>) //~ ERROR the parameter type `T` may not live long enough -} - -enum Ref2<'a, T> { - Ref2Variant1, - Ref2Variant2(isize, RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough -} - -enum RefOk<'a, T:'a> { - RefOkVariant1(&'a T) -} - -// This is now well formed. RFC 2093 -enum RefIndirect<'a, T> { - RefIndirectVariant1(isize, RefOk<'a,T>) -} - -enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] - RefDoubleVariant1(&'a RequireOutlives<'b, T>) - //~^ 46:23: 46:49: the parameter type `T` may not live long enough [E0309] -} - -fn main() { } diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-enum-not-wf.stderr b/src/test/ui/rfc-2093-infer-outlives/regions-enum-not-wf.stderr deleted file mode 100644 index 923ea17622ac0..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-enum-not-wf.stderr +++ /dev/null @@ -1,67 +0,0 @@ -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:28:18 - | -LL | enum Ref1<'a, T> { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | Ref1Variant1(RequireOutlives<'a, T>) //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ - | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:28:18 - | -LL | Ref1Variant1(RequireOutlives<'a, T>) //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ - -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:33:25 - | -LL | enum Ref2<'a, T> { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | Ref2Variant1, -LL | Ref2Variant2(isize, RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ - | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:33:25 - | -LL | Ref2Variant2(isize, RequireOutlives<'a, T>), //~ ERROR the parameter type `T` may not live long enough - | ^^^^^^^^^^^^^^^^^^^^^^ - -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:45:1 - | -LL | enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] - | ^ - help: consider adding an explicit lifetime bound `T: 'b`... - | _| - | | -LL | | RefDoubleVariant1(&'a RequireOutlives<'b, T>) -LL | | //~^ 46:23: 46:49: the parameter type `T` may not live long enough [E0309] -LL | | } - | |_^ - | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:45:1 - | -LL | / enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] -LL | | RefDoubleVariant1(&'a RequireOutlives<'b, T>) -LL | | //~^ 46:23: 46:49: the parameter type `T` may not live long enough [E0309] -LL | | } - | |_^ - -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-enum-not-wf.rs:46:23 - | -LL | enum RefDouble<'a, 'b, T> { //~ ERROR 45:1: 48:2: the parameter type `T` may not live long enough [E0309] - | - help: consider adding an explicit lifetime bound `T: 'b`... -LL | RefDoubleVariant1(&'a RequireOutlives<'b, T>) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-enum-not-wf.rs:46:23 - | -LL | RefDoubleVariant1(&'a RequireOutlives<'b, T>) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0309`. diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region-rev.rs b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region-rev.rs deleted file mode 100644 index 44af621ef24dc..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region-rev.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 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. - -// Test that a nominal type (like `Foo<'a>`) outlives `'b` if its -// arguments (like `'a`) outlive `'b`. -// -// Rule OutlivesNominalType from RFC 1214. - -#![feature(rustc_attrs)] -#![allow(dead_code)] - -mod rev_variant_struct_region { - struct Foo<'a> { - x: fn(&'a i32), - } - trait Trait<'a, 'b> { - type Out; - } - impl<'a, 'b> Trait<'a, 'b> for usize { - type Out = &'a Foo<'b>; //~ ERROR reference has a longer lifetime - } -} - -#[rustc_error] -fn main() { } diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region-rev.stderr b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region-rev.stderr deleted file mode 100644 index bd4682f0acfe7..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region-rev.stderr +++ /dev/null @@ -1,20 +0,0 @@ -error[E0491]: in type `&'a rev_variant_struct_region::Foo<'b>`, reference has a longer lifetime than the data it references - --> $DIR/regions-outlives-nominal-type-region-rev.rs:27:9 - | -LL | type Out = &'a Foo<'b>; //~ ERROR reference has a longer lifetime - | ^^^^^^^^^^^^^^^^^^^^^^^ - | -note: the pointer is valid for the lifetime 'a as defined on the impl at 26:10 - --> $DIR/regions-outlives-nominal-type-region-rev.rs:26:10 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ -note: but the referenced data is only valid for the lifetime 'b as defined on the impl at 26:14 - --> $DIR/regions-outlives-nominal-type-region-rev.rs:26:14 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region.rs b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region.rs deleted file mode 100644 index 93f16350a7b4d..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 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. - -// Test that a nominal type (like `Foo<'a>`) outlives `'b` if its -// arguments (like `'a`) outlive `'b`. -// -// Rule OutlivesNominalType from RFC 1214. - -#![feature(rustc_attrs)] -#![allow(dead_code)] - -mod variant_struct_region { - struct Foo<'a> { - x: &'a i32, - } - trait Trait<'a, 'b> { - type Out; - } - impl<'a, 'b> Trait<'a, 'b> for usize { - type Out = &'a Foo<'b>; //~ ERROR reference has a longer lifetime - } -} - -#[rustc_error] -fn main() { } diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region.stderr b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region.stderr deleted file mode 100644 index 3fdfb673b3700..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-region.stderr +++ /dev/null @@ -1,20 +0,0 @@ -error[E0491]: in type `&'a variant_struct_region::Foo<'b>`, reference has a longer lifetime than the data it references - --> $DIR/regions-outlives-nominal-type-region.rs:27:9 - | -LL | type Out = &'a Foo<'b>; //~ ERROR reference has a longer lifetime - | ^^^^^^^^^^^^^^^^^^^^^^^ - | -note: the pointer is valid for the lifetime 'a as defined on the impl at 26:10 - --> $DIR/regions-outlives-nominal-type-region.rs:26:10 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ -note: but the referenced data is only valid for the lifetime 'b as defined on the impl at 26:14 - --> $DIR/regions-outlives-nominal-type-region.rs:26:14 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type-rev.rs b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type-rev.rs deleted file mode 100644 index e44e049a9e5dc..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type-rev.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 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. - -// Test that a nominal type (like `Foo<'a>`) outlives `'b` if its -// arguments (like `'a`) outlive `'b`. -// -// Rule OutlivesNominalType from RFC 1214. - -#![feature(rustc_attrs)] -#![allow(dead_code)] - -mod variant_struct_type { - struct Foo { - x: fn(T) - } - trait Trait<'a, 'b> { - type Out; - } - impl<'a, 'b> Trait<'a, 'b> for usize { - type Out = &'a Foo<&'b i32>; //~ ERROR reference has a longer lifetime - } -} - -#[rustc_error] -fn main() { } diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type-rev.stderr b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type-rev.stderr deleted file mode 100644 index 166e95cdeddf3..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type-rev.stderr +++ /dev/null @@ -1,20 +0,0 @@ -error[E0491]: in type `&'a variant_struct_type::Foo<&'b i32>`, reference has a longer lifetime than the data it references - --> $DIR/regions-outlives-nominal-type-type-rev.rs:27:9 - | -LL | type Out = &'a Foo<&'b i32>; //~ ERROR reference has a longer lifetime - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | -note: the pointer is valid for the lifetime 'a as defined on the impl at 26:10 - --> $DIR/regions-outlives-nominal-type-type-rev.rs:26:10 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ -note: but the referenced data is only valid for the lifetime 'b as defined on the impl at 26:14 - --> $DIR/regions-outlives-nominal-type-type-rev.rs:26:14 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type.rs b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type.rs deleted file mode 100644 index 1293e6c234bc1..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2014 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. - -// Test that a nominal type (like `Foo<'a>`) outlives `'b` if its -// arguments (like `'a`) outlive `'b`. -// -// Rule OutlivesNominalType from RFC 1214. - -#![feature(rustc_attrs)] -#![allow(dead_code)] - -mod variant_struct_type { - struct Foo { - x: T - } - trait Trait<'a, 'b> { - type Out; - } - impl<'a, 'b> Trait<'a, 'b> for usize { - type Out = &'a Foo<&'b i32>; //~ ERROR reference has a longer lifetime - } -} - -#[rustc_error] -fn main() { } diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type.stderr b/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type.stderr deleted file mode 100644 index 54952ec1676db..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-outlives-nominal-type-type.stderr +++ /dev/null @@ -1,20 +0,0 @@ -error[E0491]: in type `&'a variant_struct_type::Foo<&'b i32>`, reference has a longer lifetime than the data it references - --> $DIR/regions-outlives-nominal-type-type.rs:27:9 - | -LL | type Out = &'a Foo<&'b i32>; //~ ERROR reference has a longer lifetime - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | -note: the pointer is valid for the lifetime 'a as defined on the impl at 26:10 - --> $DIR/regions-outlives-nominal-type-type.rs:26:10 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ -note: but the referenced data is only valid for the lifetime 'b as defined on the impl at 26:14 - --> $DIR/regions-outlives-nominal-type-type.rs:26:14 - | -LL | impl<'a, 'b> Trait<'a, 'b> for usize { - | ^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0491`. diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-struct-not-wf.rs b/src/test/ui/rfc-2093-infer-outlives/regions-struct-not-wf.rs deleted file mode 100644 index bdd708197bc76..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-struct-not-wf.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 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. - -// Various examples of structs whose fields are not well-formed. - -#![allow(dead_code)] - -trait Trait<'a, T> { - type Out; -} -trait Trait1<'a, 'b, T> { - type Out; -} - -impl<'a, T> Trait<'a, T> for usize { - type Out = &'a T; -} - -struct RefOk<'a, T:'a> { - field: &'a T -} - -impl<'a, T> Trait<'a, T> for u32 { - type Out = RefOk<'a, T>; -} - -impl<'a, 'b, T> Trait1<'a, 'b, T> for u32 { - type Out = &'a &'b T; -} - -fn main() { } diff --git a/src/test/ui/rfc-2093-infer-outlives/regions-struct-not-wf.stderr b/src/test/ui/rfc-2093-infer-outlives/regions-struct-not-wf.stderr deleted file mode 100644 index d8c8b6c3ccc86..0000000000000 --- a/src/test/ui/rfc-2093-infer-outlives/regions-struct-not-wf.stderr +++ /dev/null @@ -1,49 +0,0 @@ -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-struct-not-wf.rs:23:5 - | -LL | impl<'a, T> Trait<'a, T> for usize { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | type Out = &'a T; - | ^^^^^^^^^^^^^^^^^ - | -note: ...so that the reference type `&'a T` does not outlive the data it points at - --> $DIR/regions-struct-not-wf.rs:23:5 - | -LL | type Out = &'a T; - | ^^^^^^^^^^^^^^^^^ - -error[E0309]: the parameter type `T` may not live long enough - --> $DIR/regions-struct-not-wf.rs:31:5 - | -LL | impl<'a, T> Trait<'a, T> for u32 { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | type Out = RefOk<'a, T>; - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | -note: ...so that the type `T` will meet its required lifetime bounds - --> $DIR/regions-struct-not-wf.rs:31:5 - | -LL | type Out = RefOk<'a, T>; - | ^^^^^^^^^^^^^^^^^^^^^^^^ - -error[E0491]: in type `&'a &'b T`, reference has a longer lifetime than the data it references - --> $DIR/regions-struct-not-wf.rs:35:5 - | -LL | type Out = &'a &'b T; - | ^^^^^^^^^^^^^^^^^^^^^ - | -note: the pointer is valid for the lifetime 'a as defined on the impl at 34:6 - --> $DIR/regions-struct-not-wf.rs:34:6 - | -LL | impl<'a, 'b, T> Trait1<'a, 'b, T> for u32 { - | ^^ -note: but the referenced data is only valid for the lifetime 'b as defined on the impl at 34:10 - --> $DIR/regions-struct-not-wf.rs:34:10 - | -LL | impl<'a, 'b, T> Trait1<'a, 'b, T> for u32 { - | ^^ - -error: aborting due to 3 previous errors - -Some errors occurred: E0309, E0491. -For more information about an error, try `rustc --explain E0309`. diff --git a/src/test/ui/rfc-2093-infer-outlives/self-dyn.rs b/src/test/ui/rfc-2093-infer-outlives/self-dyn.rs index 37c468f2f8310..a19bcf8afff9a 100644 --- a/src/test/ui/rfc-2093-infer-outlives/self-dyn.rs +++ b/src/test/ui/rfc-2093-infer-outlives/self-dyn.rs @@ -10,13 +10,14 @@ #![feature(dyn_trait)] #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] trait Trait<'x, 's, T> where T: 'x, 's: { } #[rustc_outlives] -struct Foo<'a, 'b, A> //~ ERROR 19:1: 22:2: rustc_outlives +struct Foo<'a, 'b, A> //~ ERROR 20:1: 23:2: rustc_outlives { foo: Box> } diff --git a/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr b/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr index 8c69307ddfb72..546ba9db64460 100644 --- a/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/self-dyn.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/self-dyn.rs:19:1 + --> $DIR/self-dyn.rs:20:1 | -LL | / struct Foo<'a, 'b, A> //~ ERROR 19:1: 22:2: rustc_outlives +LL | / struct Foo<'a, 'b, A> //~ ERROR 20:1: 23:2: rustc_outlives LL | | { LL | | foo: Box> LL | | } diff --git a/src/test/ui/rfc-2093-infer-outlives/self-structs.rs b/src/test/ui/rfc-2093-infer-outlives/self-structs.rs index 82d13d9179a1b..c4f8f83bdcefd 100644 --- a/src/test/ui/rfc-2093-infer-outlives/self-structs.rs +++ b/src/test/ui/rfc-2093-infer-outlives/self-structs.rs @@ -9,9 +9,10 @@ // except according to those terms. #![feature(rustc_attrs)] +#![feature(infer_outlives_requirements)] #[rustc_outlives] -struct Foo<'a, 'b, T> { //~ ERROR 14:1: 16:2: rustc_outlives +struct Foo<'a, 'b, T> { //~ ERROR 15:1: 17:2: rustc_outlives field1: Bar<'a, 'b, T> } diff --git a/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr b/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr index 541e282f23874..04284577a0746 100644 --- a/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr +++ b/src/test/ui/rfc-2093-infer-outlives/self-structs.stderr @@ -1,7 +1,7 @@ error: rustc_outlives - --> $DIR/self-structs.rs:14:1 + --> $DIR/self-structs.rs:15:1 | -LL | / struct Foo<'a, 'b, T> { //~ ERROR 14:1: 16:2: rustc_outlives +LL | / struct Foo<'a, 'b, T> { //~ ERROR 15:1: 17:2: rustc_outlives LL | | field1: Bar<'a, 'b, T> LL | | } | |_^ diff --git a/src/test/ui/typeck/typeck_type_placeholder_item.stderr b/src/test/ui/typeck/typeck_type_placeholder_item.stderr index 598f18bf8d8d2..3f814085955f7 100644 --- a/src/test/ui/typeck/typeck_type_placeholder_item.stderr +++ b/src/test/ui/typeck/typeck_type_placeholder_item.stderr @@ -76,24 +76,6 @@ error[E0121]: the type placeholder `_` is not allowed within types on item signa LL | b: (_, _), | ^ not allowed in type signatures -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:112:12 - | -LL | a: _, - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:114:13 - | -LL | b: (_, _), - | ^ not allowed in type signatures - -error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:114:16 - | -LL | b: (_, _), - | ^ not allowed in type signatures - error[E0121]: the type placeholder `_` is not allowed within types on item signatures --> $DIR/typeck_type_placeholder_item.rs:67:21 | @@ -154,6 +136,24 @@ error[E0121]: the type placeholder `_` is not allowed within types on item signa LL | fn fn_test8(_f: fn() -> _) { } | ^ not allowed in type signatures +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:112:12 + | +LL | a: _, + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:114:13 + | +LL | b: (_, _), + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:114:16 + | +LL | b: (_, _), + | ^ not allowed in type signatures + error[E0121]: the type placeholder `_` is not allowed within types on item signatures --> $DIR/typeck_type_placeholder_item.rs:43:24 | diff --git a/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.rs b/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.rs index afdf59d1e5bc5..c11b2e4c544e1 100644 --- a/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.rs +++ b/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.rs @@ -8,26 +8,25 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +// Test that an appearance of `T` in fn args or in a trait object must +// still meet the outlives bounds. Since this is a new requirement, +// this is currently only a warning, not a hard error. + #![feature(rustc_attrs)] #![allow(dead_code)] -trait Trait<'a, T> { - type Out; -} - -impl<'a, T> Trait<'a, T> for usize { - type Out = &'a fn(T); -} +trait Trait { } struct Foo<'a,T> { f: &'a fn(T), + //~^ ERROR E0309 } -trait Baz { } - -impl<'a, T> Trait<'a, T> for u32 { - type Out = &'a Baz; +struct Bar<'a,T> { + f: &'a Trait, + //~^ ERROR E0309 } +#[rustc_error] fn main() { } diff --git a/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.stderr b/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.stderr index 26a2138c9f83c..9a8c63126f28e 100644 --- a/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.stderr +++ b/src/test/ui/wf/wf-outlives-ty-in-fn-or-trait.stderr @@ -1,30 +1,30 @@ error[E0309]: the parameter type `T` may not live long enough - --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:19:5 + --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:21:5 | -LL | impl<'a, T> Trait<'a, T> for usize { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | type Out = &'a fn(T); - | ^^^^^^^^^^^^^^^^^^^^^ +LL | struct Foo<'a,T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | f: &'a fn(T), + | ^^^^^^^^^^^^ | note: ...so that the reference type `&'a fn(T)` does not outlive the data it points at - --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:19:5 + --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:21:5 | -LL | type Out = &'a fn(T); - | ^^^^^^^^^^^^^^^^^^^^^ +LL | f: &'a fn(T), + | ^^^^^^^^^^^^ error[E0309]: the parameter type `T` may not live long enough - --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:29:5 + --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:26:5 | -LL | impl<'a, T> Trait<'a, T> for u32 { - | - help: consider adding an explicit lifetime bound `T: 'a`... -LL | type Out = &'a Baz; - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | struct Bar<'a,T> { + | - help: consider adding an explicit lifetime bound `T: 'a`... +LL | f: &'a Trait, + | ^^^^^^^^^^^^^^^ | -note: ...so that the reference type `&'a (dyn Baz + 'a)` does not outlive the data it points at - --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:29:5 +note: ...so that the reference type `&'a (dyn Trait + 'a)` does not outlive the data it points at + --> $DIR/wf-outlives-ty-in-fn-or-trait.rs:26:5 | -LL | type Out = &'a Baz; - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | f: &'a Trait, + | ^^^^^^^^^^^^^^^ error: aborting due to 2 previous errors