Skip to content

Commit 90a42a8

Browse files
committed
Test interaction with specialization.
1 parent da4dcad commit 90a42a8

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2015 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(default_type_parameter_fallback)]
12+
#![feature(specialization)]
13+
14+
use std::fmt::Debug;
15+
16+
trait B {
17+
fn b(&self) -> Self;
18+
}
19+
20+
default impl<T=i32> B for Option<T>
21+
where T: Default
22+
{
23+
fn b(&self) -> Option<T> {
24+
Some(T::default())
25+
}
26+
}
27+
28+
impl B for Option<String>
29+
{
30+
fn b(&self) -> Option<String> {
31+
Some("special".into())
32+
}
33+
}
34+
35+
fn main() {
36+
let x = None;
37+
// Even with defaults, the concrete impl is prefered,
38+
// the defaults are simply ignored.
39+
foo(x.b());
40+
}
41+
42+
fn foo<T=i32>(a: Option<T>)
43+
where T: Debug {
44+
assert_eq!(format!("{:?}", a.unwrap()), "\"special\"");
45+
}

0 commit comments

Comments
 (0)