diff options
| author | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2018-08-06 12:03:51 +0200 |
|---|---|---|
| committer | John Kåre Alsaker <john.kare.alsaker@gmail.com> | 2018-08-07 04:44:35 +0200 |
| commit | 401af7994d26747c21e58dcbffa45bc3cd423696 (patch) | |
| tree | 69ff291d09aca752afb2561c571eaaf0952259a4 | |
| parent | b2397437530eecef72a1524a7e0a4b42034fa360 (diff) | |
Record adjustments and original type for expressions in the generator interior
| -rw-r--r-- | src/librustc_typeck/check/generator_interior.rs | 8 | ||||
| -rw-r--r-- | src/test/run-pass/generator/issue-52398.rs | 35 |
2 files changed, 42 insertions, 1 deletions
diff --git a/src/librustc_typeck/check/generator_interior.rs b/src/librustc_typeck/check/generator_interior.rs index e2090493079..6e0c0bac186 100644 --- a/src/librustc_typeck/check/generator_interior.rs +++ b/src/librustc_typeck/check/generator_interior.rs @@ -167,7 +167,13 @@ impl<'a, 'gcx, 'tcx> Visitor<'tcx> for InteriorVisitor<'a, 'gcx, 'tcx> { let scope = self.region_scope_tree.temporary_scope(expr.hir_id.local_id); - let ty = self.fcx.tables.borrow().expr_ty_adjusted(expr); + // Record the unadjusted type + let ty = self.fcx.tables.borrow().expr_ty(expr); self.record(ty, scope, Some(expr), expr.span); + + // Also include the adjusted types, since these can result in MIR locals + for adjustment in self.fcx.tables.borrow().expr_adjustments(expr) { + self.record(adjustment.target, scope, Some(expr), expr.span); + } } } diff --git a/src/test/run-pass/generator/issue-52398.rs b/src/test/run-pass/generator/issue-52398.rs new file mode 100644 index 00000000000..0fb8f277ea9 --- /dev/null +++ b/src/test/run-pass/generator/issue-52398.rs @@ -0,0 +1,35 @@ +// 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 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(generators)] + +use std::cell::RefCell; + +struct A; + +impl A { + fn test(&self, a: ()) {} +} + +fn main() { + // Test that the MIR local with type &A created for the auto-borrow adjustment + // is caught by typeck + move || { + A.test(yield); + }; + + // Test that the std::cell::Ref temporary returned from the `borrow` call + // is caught by typeck + let y = RefCell::new(true); + static move || { + yield *y.borrow(); + return "Done"; + }; +} |
