Handle supertrait calls in default methods
Add a new method_super origin for supertrait methods. Also make coherence create a table that maps pairs of trait IDs and self types to impl IDs, so that it's possible to check a supertrait method knowing only its index in its trait's methods (without knowing all supertraits for a given trait). r=nmatsakis and graydon -- with hope, we'll revamp all of this code as per #4678, but for now this fixes the bug. Closes #3979
This commit is contained in:
parent
b927e48a26
commit
a30ea013f5
14 changed files with 352 additions and 72 deletions
26
src/test/auxiliary/issue_3979_traits.rs
Normal file
26
src/test/auxiliary/issue_3979_traits.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2012 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.
|
||||
|
||||
#[link(name = "issue_3979_traits",
|
||||
vers = "0.1")];
|
||||
|
||||
#[crate_type = "lib"];
|
||||
|
||||
trait Positioned {
|
||||
fn SetX(&self, int);
|
||||
fn X(&self) -> int;
|
||||
}
|
||||
|
||||
#[allow(default_methods)]
|
||||
trait Movable: Positioned {
|
||||
fn translate(&self, dx: int) {
|
||||
self.SetX(self.X() + dx);
|
||||
}
|
||||
}
|
||||
26
src/test/run-pass/issue-3979-2.rs
Normal file
26
src/test/run-pass/issue-3979-2.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2012 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.
|
||||
|
||||
trait A {
|
||||
fn a_method();
|
||||
}
|
||||
|
||||
trait B: A {
|
||||
fn b_method();
|
||||
}
|
||||
|
||||
trait C: B {
|
||||
fn c_method() {
|
||||
self.a_method();
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
||||
41
src/test/run-pass/issue-3979-generics.rs
Normal file
41
src/test/run-pass/issue-3979-generics.rs
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2012 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.
|
||||
|
||||
// xfail-test
|
||||
trait Positioned<S> {
|
||||
fn SetX(&self, S);
|
||||
fn X(&self) -> S;
|
||||
}
|
||||
|
||||
#[allow(default_methods)]
|
||||
trait Movable<S, T>: Positioned<T> {
|
||||
fn translate(&self, dx: T) {
|
||||
self.SetX(self.X() + dx);
|
||||
}
|
||||
}
|
||||
|
||||
struct Point { mut x: int, mut y: int }
|
||||
|
||||
impl Point: Positioned<int> {
|
||||
fn SetX(&self, x: int) {
|
||||
self.x = x;
|
||||
}
|
||||
fn X(&self) -> int {
|
||||
self.x
|
||||
}
|
||||
}
|
||||
|
||||
impl Point: Movable<int, int>;
|
||||
|
||||
fn main() {
|
||||
let p = Point{ x: 1, y: 2};
|
||||
p.translate(3);
|
||||
assert p.X() == 4;
|
||||
}
|
||||
33
src/test/run-pass/issue-3979-xcrate.rs
Normal file
33
src/test/run-pass/issue-3979-xcrate.rs
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright 2012 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.
|
||||
|
||||
// xfail-test // tjc: ???
|
||||
// aux-build:issue_3979_traits.rs
|
||||
extern mod issue_3979_traits;
|
||||
use issue_3979_traits::*;
|
||||
|
||||
struct Point { mut x: int, mut y: int }
|
||||
|
||||
impl Point: Positioned {
|
||||
fn SetX(&self, x: int) {
|
||||
self.x = x;
|
||||
}
|
||||
fn X(&self) -> int {
|
||||
self.x
|
||||
}
|
||||
}
|
||||
|
||||
impl Point: Movable;
|
||||
|
||||
fn main() {
|
||||
let p = Point{ x: 1, y: 2};
|
||||
p.translate(3);
|
||||
assert p.X() == 4;
|
||||
}
|
||||
|
|
@ -8,15 +8,33 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// xfail-test
|
||||
trait Positioned {
|
||||
fn SetX(int);
|
||||
fn SetX(&self, int);
|
||||
fn X(&self) -> int;
|
||||
}
|
||||
|
||||
#[allow(default_methods)]
|
||||
trait Movable: Positioned {
|
||||
fn translate(dx: int) {
|
||||
fn translate(&self, dx: int) {
|
||||
self.SetX(self.X() + dx);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
struct Point { mut x: int, mut y: int }
|
||||
|
||||
impl Point: Positioned {
|
||||
fn SetX(&self, x: int) {
|
||||
self.x = x;
|
||||
}
|
||||
fn X(&self) -> int {
|
||||
self.x
|
||||
}
|
||||
}
|
||||
|
||||
impl Point: Movable;
|
||||
|
||||
fn main() {
|
||||
let p = Point{ x: 1, y: 2};
|
||||
p.translate(3);
|
||||
assert p.X() == 4;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue