From 8827395a3a830a421409ba995991bfd5bce38c1e Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Tue, 17 Jun 2014 14:14:06 -0400 Subject: [PATCH] librustc: Check regions for overloaded calls. --- src/librustc/middle/typeck/check/regionck.rs | 5 +- src/test/run-pass/issue-14959.rs | 48 ++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/test/run-pass/issue-14959.rs diff --git a/src/librustc/middle/typeck/check/regionck.rs b/src/librustc/middle/typeck/check/regionck.rs index 93ab492eb3a..e8d507c8b4a 100644 --- a/src/librustc/middle/typeck/check/regionck.rs +++ b/src/librustc/middle/typeck/check/regionck.rs @@ -443,7 +443,10 @@ fn visit_expr(rcx: &mut Rcx, expr: &ast::Expr) { match expr.node { ast::ExprCall(ref callee, ref args) => { - if !has_method_map { + if has_method_map { + constrain_call(rcx, None, expr, Some(*callee), + args.as_slice(), false); + } else { constrain_callee(rcx, callee.id, expr, &**callee); constrain_call(rcx, Some(callee.id), diff --git a/src/test/run-pass/issue-14959.rs b/src/test/run-pass/issue-14959.rs new file mode 100644 index 00000000000..7fbb0657c70 --- /dev/null +++ b/src/test/run-pass/issue-14959.rs @@ -0,0 +1,48 @@ +// 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. + +#![feature(overloaded_calls)] + +use std::ops::Fn; + +trait Response {} +trait Request {} +trait Ingot { + fn enter(&mut self, _: &mut R, _: &mut S, a: &mut Alloy) -> Status; +} + +#[allow(dead_code)] +struct HelloWorld; + +struct SendFile<'a>; +struct Alloy; +enum Status { + Continue +} + +impl Alloy { + fn find(&self) -> Option { + None + } +} + +impl<'a, 'b> Fn<(&'b mut Response,),()> for SendFile<'a> { + fn call(&self, (_res,): (&'b mut Response,)) {} +} + +impl Ingot for HelloWorld { + fn enter(&mut self, _req: &mut Rq, res: &mut Rs, alloy: &mut Alloy) -> Status { + let send_file = alloy.find::().unwrap(); + send_file(res); + Continue + } +} + +fn main() {} -- 2.44.0