librustc: Resolve nested vtable parameters in overloaded calls.

Closes #16508.
This commit is contained in:
Patrick Walton 2014-08-20 15:28:26 -07:00
parent 43f040dac8
commit 478decf98b
3 changed files with 35 additions and 4 deletions

View File

@ -201,7 +201,9 @@ impl param_substs {
}
fn param_substs_to_string(this: &param_substs, tcx: &ty::ctxt) -> String {
format!("param_substs({})", this.substs.repr(tcx))
format!("param_substs(substs={},vtables={})",
this.substs.repr(tcx),
this.vtables.repr(tcx))
}
impl Repr for param_substs {
@ -859,8 +861,7 @@ pub fn find_vtable(tcx: &ty::ctxt,
debug!("find_vtable(n_param={:?}, n_bound={}, ps={})",
n_param, n_bound, ps.repr(tcx));
let param_bounds = ps.vtables.get(n_param.space,
n_param.index);
let param_bounds = ps.vtables.get(n_param.space, n_param.index);
param_bounds.get(n_bound).clone()
}

View File

@ -769,7 +769,8 @@ pub fn early_resolve_expr(ex: &ast::Expr, fcx: &FnCtxt, is_early: bool) {
ast::ExprAssignOp(_, _, _) |
ast::ExprIndex(_, _) |
ast::ExprMethodCall(_, _, _) |
ast::ExprForLoop(..) => {
ast::ExprForLoop(..) |
ast::ExprCall(..) => {
match fcx.inh.method_map.borrow().find(&MethodCall::expr(ex.id)) {
Some(method) => {
debug!("vtable resolution on parameter bounds for method call {}",

View File

@ -0,0 +1,29 @@
// 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 <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.
// Tests that nested vtables work with overloaded calls.
#![feature(overloaded_calls)]
use std::ops::Fn;
struct G;
impl<'a, A: Add<int, int>> Fn<(A,), int> for G {
extern "rust-call" fn call(&self, (arg,): (A,)) -> int {
arg.add(&1)
}
}
fn main() {
// ICE trigger
G(1i);
}