From 401af7994d26747c21e58dcbffa45bc3cd423696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Mon, 6 Aug 2018 12:03:51 +0200 Subject: [PATCH] Record adjustments and original type for expressions in the generator interior --- .../check/generator_interior.rs | 8 ++++- src/test/run-pass/generator/issue-52398.rs | 35 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/generator/issue-52398.rs diff --git a/src/librustc_typeck/check/generator_interior.rs b/src/librustc_typeck/check/generator_interior.rs index e20904930792e..6e0c0bac186f4 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 0000000000000..0fb8f277ea9d4 --- /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 or the MIT license +// , 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"; + }; +}