Skip to content

Commit 981c6b1

Browse files
committed
Add tests for trait object coercion.
1 parent 1265a03 commit 981c6b1

File tree

5 files changed

+150
-2
lines changed

5 files changed

+150
-2
lines changed

src/test/compile-fail/map-types.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use std::hashmap::HashMap;
1717

1818
fn main() {
1919
let x: @HashMap<~str, ~str> = @HashMap::new();
20-
let x: @Map<~str, ~str> = x as @Map<~str, ~str>;
20+
let x: @Map<~str, ~str> = x;
2121
let y: @Map<uint, ~str> = @x;
22-
//~^ ERROR expected trait std::container::Map but found @-ptr
22+
//~^ ERROR failed to find an implementation of trait std::container::Map<uint,~str> for @std::container::Map<~str,~str>:'static
2323
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#[feature(managed_boxes)];
12+
13+
struct Struct {
14+
person: &'static str
15+
}
16+
17+
trait Trait<T> {
18+
fn f(&self, x: T);
19+
}
20+
21+
impl Trait<&'static str> for Struct {
22+
fn f(&self, x: &'static str) {
23+
println!("Hello, {}!", x);
24+
}
25+
}
26+
27+
fn main() {
28+
let s: @Trait<int> = @Struct { person: "Fred" }; //~ ERROR expected Trait<int>, but found Trait<&'static str>
29+
//~^ ERROR expected Trait<int>, but found Trait<&'static str>
30+
s.f(1);
31+
}
32+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#[feature(managed_boxes)];
12+
13+
struct Struct {
14+
person: &'static str
15+
}
16+
17+
trait Trait<T> {
18+
fn f(&self, x: T);
19+
}
20+
21+
impl Trait<&'static str> for Struct {
22+
fn f(&self, x: &'static str) {
23+
println!("Hello, {}!", x);
24+
}
25+
}
26+
27+
fn main() {
28+
let person = ~"Fred";
29+
let person: &str = person; //~ ERROR borrowed value does not live long enough
30+
let s: @Trait<&'static str> = @Struct { person: person };
31+
}
32+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#[feature(managed_boxes)];
12+
13+
trait Trait<T> {
14+
fn f(&self, x: T);
15+
}
16+
17+
struct Struct {
18+
x: int,
19+
y: int,
20+
}
21+
22+
impl Trait<&'static str> for Struct {
23+
fn f(&self, x: &'static str) {
24+
println(~"Hi, " + x + ~"!");
25+
}
26+
}
27+
28+
fn f(x: @Trait<&'static str>) {
29+
x.f("Sue");
30+
}
31+
32+
pub fn main() {
33+
let a = Struct { x: 1, y: 2 };
34+
let b: @Trait<&'static str> = @a;
35+
b.f("Fred");
36+
let c: ~Trait<&'static str> = ~a;
37+
c.f("Mary");
38+
let d: &Trait<&'static str> = &a;
39+
d.f("Joe");
40+
f(@a);
41+
}
42+

src/test/run-pass/trait-coercion.rs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#[feature(managed_boxes)];
12+
13+
trait Trait {
14+
fn f(&self);
15+
}
16+
17+
struct Struct {
18+
x: int,
19+
y: int,
20+
}
21+
22+
impl Trait for Struct {
23+
fn f(&self) {
24+
println("Hi!");
25+
}
26+
}
27+
28+
fn f(x: @Trait) {
29+
x.f();
30+
}
31+
32+
pub fn main() {
33+
let a = Struct { x: 1, y: 2 };
34+
let b: @Trait = @a;
35+
b.f();
36+
let c: ~Trait = ~a;
37+
c.f();
38+
let d: &Trait = &a;
39+
d.f();
40+
f(@a);
41+
}
42+

0 commit comments

Comments
 (0)