From 9876f6bd9c2927633e6df21889a585469dc5fce6 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 4 Jan 2020 00:28:15 +0100 Subject: [PATCH 1/2] Fix error code failure check in rustdoc test --- src/librustdoc/test.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs index db66b7530b29d..ca5c09edfbb28 100644 --- a/src/librustdoc/test.rs +++ b/src/librustdoc/test.rs @@ -299,7 +299,6 @@ fn run_test( eprint!("{}", self.0); } } - let out = str::from_utf8(&output.stderr).unwrap(); let _bomb = Bomb(&out); match (output.status.success(), compile_fail) { @@ -309,7 +308,7 @@ fn run_test( (true, false) => {} (false, true) => { if !error_codes.is_empty() { - error_codes.retain(|err| !out.contains(err)); + error_codes.retain(|err| !out.contains(&format!("error[{}]: ", err))); if !error_codes.is_empty() { return Err(TestFailure::MissingErrorCodes(error_codes)); From 5b7d64e9473216dc8650ca5f910100389ab91726 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 4 Jan 2020 01:41:25 +0100 Subject: [PATCH 2/2] Fix error codes explanation' code examples --- src/librustc_error_codes/error_codes/E0445.md | 4 +++ src/librustc_error_codes/error_codes/E0446.md | 4 +++ src/librustc_error_codes/error_codes/E0491.md | 36 ++++++++++--------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/librustc_error_codes/error_codes/E0445.md b/src/librustc_error_codes/error_codes/E0445.md index 9cc62b2ba6d0a..e6a28a9c2c460 100644 --- a/src/librustc_error_codes/error_codes/E0445.md +++ b/src/librustc_error_codes/error_codes/E0445.md @@ -12,6 +12,8 @@ trait Foo { pub trait Bar : Foo {} // error: private trait in public interface pub struct Bar2(pub T); // same error pub fn foo (t: T) {} // same error + +fn main() {} ``` To solve this error, please ensure that the trait is also public. The trait @@ -26,4 +28,6 @@ pub trait Foo { // we set the Foo trait public pub trait Bar : Foo {} // ok! pub struct Bar2(pub T); // ok! pub fn foo (t: T) {} // ok! + +fn main() {} ``` diff --git a/src/librustc_error_codes/error_codes/E0446.md b/src/librustc_error_codes/error_codes/E0446.md index d0144478dbfe0..77a1834ece42f 100644 --- a/src/librustc_error_codes/error_codes/E0446.md +++ b/src/librustc_error_codes/error_codes/E0446.md @@ -12,6 +12,8 @@ mod Foo { Bar(0) } } + +fn main() {} ``` To solve this error, please ensure that the type is also public. The type @@ -27,4 +29,6 @@ mod Foo { Bar(0) } } + +fn main() {} ``` diff --git a/src/librustc_error_codes/error_codes/E0491.md b/src/librustc_error_codes/error_codes/E0491.md index 1ccaf71257b8b..d45663f3a5347 100644 --- a/src/librustc_error_codes/error_codes/E0491.md +++ b/src/librustc_error_codes/error_codes/E0491.md @@ -3,30 +3,34 @@ A reference has a longer lifetime than the data it references. Erroneous code example: ```compile_fail,E0491 -trait SomeTrait<'a> { - type Output; +struct Foo<'a> { + x: fn(&'a i32), } -impl<'a, T> SomeTrait<'a> for T { - type Output = &'a T; // compile error E0491 +trait Trait<'a, 'b> { + type Out; +} + +impl<'a, 'b> Trait<'a, 'b> for usize { + type Out = &'a Foo<'b>; // error! } ``` -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`. +Here, the problem is that the compiler cannot be sure that the `'b` lifetime +will live longer than `'a`, which should be mandatory in order to be sure that +`Trait::Out` will always have a reference pointing to an existing type. So in +this case, we just need to tell the compiler than `'b` must outlive `'a`: ``` -trait SomeTrait<'a> { - type Output; +struct Foo<'a> { + x: fn(&'a i32), +} + +trait Trait<'a, 'b> { + type Out; } -impl<'a, T> SomeTrait<'a> for T -where - T: 'a, -{ - type Output = &'a T; // compile error E0491 +impl<'a, 'b: 'a> Trait<'a, 'b> for usize { // we added the lifetime enforcement + type Out = &'a Foo<'b>; // it now works! } ```