From 1485c168990b2dbb6e2858bc09af0254c1af9491 Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Mon, 23 Dec 2019 21:05:02 +0800 Subject: [PATCH 1/2] Add long error code explanation message for E0627 --- src/librustc_error_codes/error_codes.rs | 2 +- src/librustc_error_codes/error_codes/E0627.md | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/librustc_error_codes/error_codes/E0627.md diff --git a/src/librustc_error_codes/error_codes.rs b/src/librustc_error_codes/error_codes.rs index 9c1bec39b29e..fbcc976bd491 100644 --- a/src/librustc_error_codes/error_codes.rs +++ b/src/librustc_error_codes/error_codes.rs @@ -346,6 +346,7 @@ E0623: include_str!("./error_codes/E0623.md"), E0624: include_str!("./error_codes/E0624.md"), E0626: include_str!("./error_codes/E0626.md"), +E0627: include_str!("./error_codes/E0627.md"), E0631: include_str!("./error_codes/E0631.md"), E0633: include_str!("./error_codes/E0633.md"), E0635: include_str!("./error_codes/E0635.md"), @@ -574,7 +575,6 @@ // E0612, // merged into E0609 // E0613, // Removed (merged with E0609) E0625, // thread-local statics cannot be accessed at compile-time - E0627, // yield statement outside of generator literal E0628, // generators cannot have explicit parameters E0629, // missing 'feature' (rustc_const_unstable) // rustc_const_unstable attribute must be paired with stable/unstable diff --git a/src/librustc_error_codes/error_codes/E0627.md b/src/librustc_error_codes/error_codes/E0627.md new file mode 100644 index 000000000000..21358e1e567d --- /dev/null +++ b/src/librustc_error_codes/error_codes/E0627.md @@ -0,0 +1,30 @@ +A yield expression was used outside of the generator literal. + +Erroneous code example: + +```compile_fail,E0627 +#![feature(generators, generator_trait)] + +fn fake_generator() -> &'static str { + yield 1; + return "foo" +} + +fn main() { + let mut generator = fake_generator; +} +``` + +The error occurs because keyword `yield` can only be used inside the generator +literal. This can be fixed by constructing the generator correctly. + +``` +#![feature(generators, generator_trait)] + +fn main() { + let mut generator = || { + yield 1; + return "foo" + }; +} +``` From 587d03bea89b2b551633aa561073ba97409a5dac Mon Sep 17 00:00:00 2001 From: Donough Liu Date: Mon, 23 Dec 2019 21:07:13 +0800 Subject: [PATCH 2/2] Yield is an expression form, not a statement. --- src/librustc_mir/borrow_check/mod.rs | 2 +- src/librustc_mir/borrow_check/path_utils.rs | 2 +- src/librustc_typeck/check/expr.rs | 2 +- src/test/ui/feature-gates/feature-gate-generators.rs | 2 +- src/test/ui/feature-gates/feature-gate-generators.stderr | 5 +++-- src/test/ui/generator/yield-in-const.rs | 2 +- src/test/ui/generator/yield-in-const.stderr | 3 ++- src/test/ui/generator/yield-in-function.rs | 2 +- src/test/ui/generator/yield-in-function.stderr | 3 ++- src/test/ui/generator/yield-in-static.rs | 2 +- src/test/ui/generator/yield-in-static.stderr | 3 ++- 11 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/librustc_mir/borrow_check/mod.rs b/src/librustc_mir/borrow_check/mod.rs index 4a6379e3bc15..0d136bd7d9cf 100644 --- a/src/librustc_mir/borrow_check/mod.rs +++ b/src/librustc_mir/borrow_check/mod.rs @@ -1424,7 +1424,7 @@ fn check_for_invalidation_at_exit( } /// Reports an error if this is a borrow of local data. - /// This is called for all Yield statements on movable generators + /// This is called for all Yield expressions on movable generators fn check_for_local_borrow(&mut self, borrow: &BorrowData<'tcx>, yield_span: Span) { debug!("check_for_local_borrow({:?})", borrow); diff --git a/src/librustc_mir/borrow_check/path_utils.rs b/src/librustc_mir/borrow_check/path_utils.rs index ea541bd93bc9..23b4799643a6 100644 --- a/src/librustc_mir/borrow_check/path_utils.rs +++ b/src/librustc_mir/borrow_check/path_utils.rs @@ -131,7 +131,7 @@ pub(super) fn is_active<'tcx>( } /// Determines if a given borrow is borrowing local data -/// This is called for all Yield statements on movable generators +/// This is called for all Yield expressions on movable generators pub(super) fn borrow_of_local_data(place: &Place<'_>) -> bool { match place.base { PlaceBase::Static(_) => false, diff --git a/src/librustc_typeck/check/expr.rs b/src/librustc_typeck/check/expr.rs index 6ecf3ccd6e7e..479536a1c8f0 100644 --- a/src/librustc_typeck/check/expr.rs +++ b/src/librustc_typeck/check/expr.rs @@ -1775,7 +1775,7 @@ fn check_expr_yield( self.tcx.sess, expr.span, E0627, - "yield statement outside of generator literal" + "yield expression outside of generator literal" ) .emit(); } diff --git a/src/test/ui/feature-gates/feature-gate-generators.rs b/src/test/ui/feature-gates/feature-gate-generators.rs index 382d891feed8..931fee134712 100644 --- a/src/test/ui/feature-gates/feature-gate-generators.rs +++ b/src/test/ui/feature-gates/feature-gate-generators.rs @@ -1,6 +1,6 @@ fn main() { yield true; //~ ERROR yield syntax is experimental - //~^ ERROR yield statement outside of generator literal + //~^ ERROR yield expression outside of generator literal } #[cfg(FALSE)] diff --git a/src/test/ui/feature-gates/feature-gate-generators.stderr b/src/test/ui/feature-gates/feature-gate-generators.stderr index 24b814b410c9..4adc21efc6a2 100644 --- a/src/test/ui/feature-gates/feature-gate-generators.stderr +++ b/src/test/ui/feature-gates/feature-gate-generators.stderr @@ -25,7 +25,7 @@ LL | yield 0; = note: for more information, see https://github.com/rust-lang/rust/issues/43122 = help: add `#![feature(generators)]` to the crate attributes to enable -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/feature-gate-generators.rs:2:5 | LL | yield true; @@ -33,4 +33,5 @@ LL | yield true; error: aborting due to 4 previous errors -For more information about this error, try `rustc --explain E0658`. +Some errors have detailed explanations: E0627, E0658. +For more information about an error, try `rustc --explain E0627`. diff --git a/src/test/ui/generator/yield-in-const.rs b/src/test/ui/generator/yield-in-const.rs index f6f11b9cb13d..fe5ca822ceca 100644 --- a/src/test/ui/generator/yield-in-const.rs +++ b/src/test/ui/generator/yield-in-const.rs @@ -1,6 +1,6 @@ #![feature(generators)] const A: u8 = { yield 3u8; 3u8}; -//~^ ERROR yield statement outside +//~^ ERROR yield expression outside fn main() {} diff --git a/src/test/ui/generator/yield-in-const.stderr b/src/test/ui/generator/yield-in-const.stderr index 663bb70d7a07..dcf4fe63e64b 100644 --- a/src/test/ui/generator/yield-in-const.stderr +++ b/src/test/ui/generator/yield-in-const.stderr @@ -1,4 +1,4 @@ -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/yield-in-const.rs:3:17 | LL | const A: u8 = { yield 3u8; 3u8}; @@ -6,3 +6,4 @@ LL | const A: u8 = { yield 3u8; 3u8}; error: aborting due to previous error +For more information about this error, try `rustc --explain E0627`. diff --git a/src/test/ui/generator/yield-in-function.rs b/src/test/ui/generator/yield-in-function.rs index b737d3b22403..29b811621de1 100644 --- a/src/test/ui/generator/yield-in-function.rs +++ b/src/test/ui/generator/yield-in-function.rs @@ -1,4 +1,4 @@ #![feature(generators)] fn main() { yield; } -//~^ ERROR yield statement outside +//~^ ERROR yield expression outside diff --git a/src/test/ui/generator/yield-in-function.stderr b/src/test/ui/generator/yield-in-function.stderr index e12b0e6843e4..51cce198ca3b 100644 --- a/src/test/ui/generator/yield-in-function.stderr +++ b/src/test/ui/generator/yield-in-function.stderr @@ -1,4 +1,4 @@ -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/yield-in-function.rs:3:13 | LL | fn main() { yield; } @@ -6,3 +6,4 @@ LL | fn main() { yield; } error: aborting due to previous error +For more information about this error, try `rustc --explain E0627`. diff --git a/src/test/ui/generator/yield-in-static.rs b/src/test/ui/generator/yield-in-static.rs index 12c9ccea4cb7..d27fbb33ba10 100644 --- a/src/test/ui/generator/yield-in-static.rs +++ b/src/test/ui/generator/yield-in-static.rs @@ -1,6 +1,6 @@ #![feature(generators)] static B: u8 = { yield 3u8; 3u8}; -//~^ ERROR yield statement outside +//~^ ERROR yield expression outside fn main() {} diff --git a/src/test/ui/generator/yield-in-static.stderr b/src/test/ui/generator/yield-in-static.stderr index 220520c3862c..d867f3ad3452 100644 --- a/src/test/ui/generator/yield-in-static.stderr +++ b/src/test/ui/generator/yield-in-static.stderr @@ -1,4 +1,4 @@ -error[E0627]: yield statement outside of generator literal +error[E0627]: yield expression outside of generator literal --> $DIR/yield-in-static.rs:3:18 | LL | static B: u8 = { yield 3u8; 3u8}; @@ -6,3 +6,4 @@ LL | static B: u8 = { yield 3u8; 3u8}; error: aborting due to previous error +For more information about this error, try `rustc --explain E0627`.