1
Fork 0

Fixed regression in associated item resolution with default type parameters that reference Self in traits.

This commit is contained in:
Sean Bowe 2015-09-13 14:14:04 -06:00
parent fd230ff124
commit 522d4b0a35
3 changed files with 61 additions and 1 deletions

View file

@ -413,9 +413,20 @@ fn create_substs_for_ast_path<'tcx>(
let mut type_substs = if param_mode == PathParamMode::Optional &&
types_provided.is_empty() {
let mut substs = region_substs.clone();
ty_param_defs
.iter()
.map(|p| this.ty_infer(Some(p.clone()), Some(&mut substs), Some(TypeSpace), span))
.map(|p| {
if let Some(ref default) = p.default {
if self_ty.is_none() && default.has_self_ty() {
// There is no suitable inference default for a type parameter
// that references Self with no self-type provided.
return this.ty_infer(None, Some(&mut substs), Some(TypeSpace), span);
}
}
this.ty_infer(Some(p.clone()), Some(&mut substs), Some(TypeSpace), span)
})
.collect()
} else {
types_provided

View file

@ -0,0 +1,21 @@
// Copyright 2015 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.
use std::ops::BitXor;
fn main() {
let x: u8 = BitXor::bitor(0 as u8, 0 as u8);
//~^ ERROR must be specified
//~| no associated item named
let g = BitXor::bitor;
//~^ ERROR must be specified
//~| no associated item named
}

View file

@ -0,0 +1,28 @@
// Copyright 2015 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.
pub trait Foo<A=Self> {
fn foo();
}
pub trait Bar<X=usize, A=Self> {
fn foo();
}
fn main() {
let a = Foo::lol();
//~^ ERROR no associated item named
let b = Foo::<_>::lol();
//~^ ERROR no associated item named
let c = Bar::lol();
//~^ ERROR no associated item named
let d = Bar::<usize, _>::lol();
//~^ ERROR no associated item named
}