Fixed regression in associated item resolution with default type parameters that reference Self in traits.
This commit is contained in:
parent
fd230ff124
commit
522d4b0a35
3 changed files with 61 additions and 1 deletions
|
@ -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
|
||||
|
|
21
src/test/compile-fail/issue-28344.rs
Normal file
21
src/test/compile-fail/issue-28344.rs
Normal 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
|
||||
}
|
28
src/test/compile-fail/unspecified-self-in-trait-ref.rs
Normal file
28
src/test/compile-fail/unspecified-self-in-trait-ref.rs
Normal 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
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue