Auto merge of #33694 - arielb1:fuzzy-on-unimplemented, r=nikomatsakis
implement fuzzy matching in on_unimplemented Fixes #31062 r? @nikomatsakis
This commit is contained in:
commit
d0ca0ca063
9 changed files with 168 additions and 49 deletions
55
src/test/compile-fail/on-unimplemented/multiple-impls.rs
Normal file
55
src/test/compile-fail/on-unimplemented/multiple-impls.rs
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
// Copyright 2016 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.
|
||||
|
||||
// Test if the on_unimplemented message override works
|
||||
|
||||
#![feature(on_unimplemented)]
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
struct Foo<T>(T);
|
||||
struct Bar<T>(T);
|
||||
|
||||
#[rustc_on_unimplemented = "trait message"]
|
||||
trait Index<Idx: ?Sized> {
|
||||
type Output: ?Sized;
|
||||
fn index(&self, index: Idx) -> &Self::Output;
|
||||
}
|
||||
|
||||
#[rustc_on_unimplemented = "on impl for Foo"]
|
||||
impl Index<Foo<usize>> for [i32] {
|
||||
type Output = i32;
|
||||
fn index(&self, _index: Foo<usize>) -> &i32 {
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
|
||||
#[rustc_on_unimplemented = "on impl for Bar"]
|
||||
impl Index<Bar<usize>> for [i32] {
|
||||
type Output = i32;
|
||||
fn index(&self, _index: Bar<usize>) -> &i32 {
|
||||
loop {}
|
||||
}
|
||||
}
|
||||
|
||||
#[rustc_error]
|
||||
fn main() {
|
||||
Index::index(&[] as &[i32], 2u32);
|
||||
//~^ ERROR E0277
|
||||
//~| NOTE trait message
|
||||
//~| NOTE required by
|
||||
Index::index(&[] as &[i32], Foo(2u32));
|
||||
//~^ ERROR E0277
|
||||
//~| NOTE on impl for Foo
|
||||
//~| NOTE required by
|
||||
Index::index(&[] as &[i32], Bar(2u32));
|
||||
//~^ ERROR E0277
|
||||
//~| NOTE on impl for Bar
|
||||
//~| NOTE required by
|
||||
}
|
||||
|
|
@ -18,5 +18,7 @@ use std::ops::Index;
|
|||
fn main() {
|
||||
let x = &[1, 2, 3] as &[i32];
|
||||
x[1i32]; //~ ERROR E0277
|
||||
//~| NOTE a usize is required
|
||||
//~| NOTE slice indices are of type `usize`
|
||||
x[..1i32]; //~ ERROR E0277
|
||||
//~| NOTE slice indices are of type `usize`
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue