From 735e518a815bd06fa99ea343351041ba22751fe4 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Thu, 5 Jun 2014 18:06:33 -0400 Subject: [PATCH] librustc: Update AutoObject adjustment in writeback. --- src/librustc/middle/typeck/check/regionck.rs | 2 +- src/librustc/middle/typeck/check/writeback.rs | 9 +++++- src/test/run-pass/issue-11612.rs | 30 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/test/run-pass/issue-11612.rs diff --git a/src/librustc/middle/typeck/check/regionck.rs b/src/librustc/middle/typeck/check/regionck.rs index e1db465424a..e488a946d4a 100644 --- a/src/librustc/middle/typeck/check/regionck.rs +++ b/src/librustc/middle/typeck/check/regionck.rs @@ -432,7 +432,7 @@ fn visit_expr(rcx: &mut Rcx, expr: &ast::Expr) { // function check_cast_for_escaping_regions() in kind.rs // explaining how it goes about doing that. - let source_ty = rcx.fcx.expr_ty(expr); + let source_ty = rcx.resolve_node_type(expr.id); constrain_regions_in_type(rcx, trait_region, infer::RelateObjectBound(expr.span), source_ty); } diff --git a/src/librustc/middle/typeck/check/writeback.rs b/src/librustc/middle/typeck/check/writeback.rs index 63dc122f7cb..b93550384ae 100644 --- a/src/librustc/middle/typeck/check/writeback.rs +++ b/src/librustc/middle/typeck/check/writeback.rs @@ -260,7 +260,14 @@ fn visit_adjustments(&self, reason: ResolveReason, id: ast::NodeId) { }) } - adjustment => adjustment + ty::AutoObject(trait_store, bb, def_id, substs) => { + ty::AutoObject( + self.resolve(&trait_store, reason), + self.resolve(&bb, reason), + def_id, + self.resolve(&substs, reason) + ) + } }; debug!("Adjustments for node {}: {:?}", id, resolved_adjustment); self.tcx().adjustments.borrow_mut().insert( diff --git a/src/test/run-pass/issue-11612.rs b/src/test/run-pass/issue-11612.rs new file mode 100644 index 00000000000..5fb2274a446 --- /dev/null +++ b/src/test/run-pass/issue-11612.rs @@ -0,0 +1,30 @@ +// 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. + +// #11612 +// We weren't updating the auto adjustments with all the resolved +// type information after type check. + +trait A {} + +struct B<'a, T> { + f: &'a T +} + +impl<'a, T> A for B<'a, T> {} + +fn foo(_: &A) {} + +fn bar(b: &B) { + foo(b); // Coercion should work + foo(b as &A); // Explicit cast should work as well +} + +fn main() {} -- 2.44.0