]> git.proxmox.com Git - rustc.git/blob - src/test/run-pass/ufcs-polymorphic-paths.rs
Imported Upstream version 1.0.0~beta
[rustc.git] / src / test / run-pass / ufcs-polymorphic-paths.rs
1 // Copyright 2014 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 // pretty-expanded FIXME #23616
12
13 #![feature(collections, rand, into_cow)]
14
15 use std::borrow::{Cow, IntoCow};
16 use std::collections::BitVec;
17 use std::default::Default;
18 use std::iter::FromIterator;
19 use std::ops::Add;
20 use std::option::IntoIter as OptionIter;
21 use std::rand::Rand;
22 use std::rand::XorShiftRng as DummyRng;
23 // FIXME the glob std::prelude::*; import of Vec is missing non-static inherent methods.
24 use std::vec::Vec;
25
26 #[derive(PartialEq, Eq)]
27 struct Newt<T>(T);
28
29 fn id<T>(x: T) -> T { x }
30 fn eq<T: Eq>(a: T, b: T) -> bool { a == b }
31 fn u8_as_i8(x: u8) -> i8 { x as i8 }
32 fn odd(x: usize) -> bool { x % 2 == 1 }
33 fn dummy_rng() -> DummyRng { DummyRng::new_unseeded() }
34
35 trait Size: Sized {
36 fn size() -> usize { std::mem::size_of::<Self>() }
37 }
38 impl<T> Size for T {}
39
40 macro_rules! tests {
41 ($($expr:expr, $ty:ty, ($($test:expr),*);)+) => (pub fn main() {$({
42 const C: $ty = $expr;
43 static S: $ty = $expr;
44 assert!(eq(C($($test),*), $expr($($test),*)));
45 assert!(eq(S($($test),*), $expr($($test),*)));
46 assert!(eq(C($($test),*), S($($test),*)));
47 })+})
48 }
49
50 tests! {
51 // Free function.
52 id, fn(i32) -> i32, (5);
53 id::<i32>, fn(i32) -> i32, (5);
54
55 // Enum variant constructor.
56 Some, fn(i32) -> Option<i32>, (5);
57 Some::<i32>, fn(i32) -> Option<i32>, (5);
58
59 // Tuple struct constructor.
60 Newt, fn(i32) -> Newt<i32>, (5);
61 Newt::<i32>, fn(i32) -> Newt<i32>, (5);
62
63 // Inherent static methods.
64 Vec::new, fn() -> Vec<()>, ();
65 Vec::<()>::new, fn() -> Vec<()>, ();
66 <Vec<()>>::new, fn() -> Vec<()>, ();
67 Vec::with_capacity, fn(usize) -> Vec<()>, (5);
68 Vec::<()>::with_capacity, fn(usize) -> Vec<()>, (5);
69 <Vec<()>>::with_capacity, fn(usize) -> Vec<()>, (5);
70 BitVec::from_fn, fn(usize, fn(usize) -> bool) -> BitVec, (5, odd);
71 BitVec::from_fn::<fn(usize) -> bool>, fn(usize, fn(usize) -> bool) -> BitVec, (5, odd);
72
73 // Inherent non-static method.
74 Vec::map_in_place, fn(Vec<u8>, fn(u8) -> i8) -> Vec<i8>, (vec![b'f', b'o', b'o'], u8_as_i8);
75 Vec::map_in_place::<i8, fn(u8) -> i8>, fn(Vec<u8>, fn(u8) -> i8) -> Vec<i8>,
76 (vec![b'f', b'o', b'o'], u8_as_i8);
77 // FIXME these break with "type parameter might not appear here pointing at `<u8>`.
78 // Vec::<u8>::map_in_place: fn(Vec<u8>, fn(u8) -> i8) -> Vec<i8>
79 // , (vec![b'f', b'o', b'o'], u8_as_i8);
80 // Vec::<u8>::map_in_place::<i8, fn(u8) -> i8>: fn(Vec<u8>, fn(u8) -> i8) -> Vec<i8>
81 // , (vec![b'f', b'o', b'o'], u8_as_i8);
82
83 // Trait static methods.
84 bool::size, fn() -> usize, ();
85 <bool>::size, fn() -> usize, ();
86 <bool as Size>::size, fn() -> usize, ();
87
88 Default::default, fn() -> i32, ();
89 i32::default, fn() -> i32, ();
90 <i32>::default, fn() -> i32, ();
91 <i32 as Default>::default, fn() -> i32, ();
92
93 Rand::rand, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
94 i32::rand, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
95 <i32>::rand, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
96 <i32 as Rand>::rand, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
97 Rand::rand::<DummyRng>, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
98 i32::rand::<DummyRng>, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
99 <i32>::rand::<DummyRng>, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
100 <i32 as Rand>::rand::<DummyRng>, fn(&mut DummyRng) -> i32, (&mut dummy_rng());
101
102 // Trait non-static methods.
103 Clone::clone, fn(&i32) -> i32, (&5);
104 i32::clone, fn(&i32) -> i32, (&5);
105 <i32>::clone, fn(&i32) -> i32, (&5);
106 <i32 as Clone>::clone, fn(&i32) -> i32, (&5);
107
108 FromIterator::from_iter, fn(OptionIter<i32>) -> Vec<i32>, (Some(5).into_iter());
109 Vec::from_iter, fn(OptionIter<i32>) -> Vec<i32>, (Some(5).into_iter());
110 <Vec<_>>::from_iter, fn(OptionIter<i32>) -> Vec<i32>, (Some(5).into_iter());
111 <Vec<_> as FromIterator<_>>::from_iter, fn(OptionIter<i32>) -> Vec<i32>,
112 (Some(5).into_iter());
113 <Vec<i32> as FromIterator<_>>::from_iter, fn(OptionIter<i32>) -> Vec<i32>,
114 (Some(5).into_iter());
115 FromIterator::from_iter::<OptionIter<i32>>, fn(OptionIter<i32>) -> Vec<i32>,
116 (Some(5).into_iter());
117 <Vec<i32> as FromIterator<_>>::from_iter::<OptionIter<i32>>, fn(OptionIter<i32>) -> Vec<i32>,
118 (Some(5).into_iter());
119
120 Add::add, fn(i32, i32) -> i32, (5, 6);
121 i32::add, fn(i32, i32) -> i32, (5, 6);
122 <i32>::add, fn(i32, i32) -> i32, (5, 6);
123 <i32 as Add<_>>::add, fn(i32, i32) -> i32, (5, 6);
124 <i32 as Add<i32>>::add, fn(i32, i32) -> i32, (5, 6);
125
126 String::into_cow, fn(String) -> Cow<'static, str>,
127 ("foo".to_string());
128 <String>::into_cow, fn(String) -> Cow<'static, str>,
129 ("foo".to_string());
130 <String as IntoCow<_>>::into_cow, fn(String) -> Cow<'static, str>,
131 ("foo".to_string());
132 <String as IntoCow<'static, _>>::into_cow, fn(String) -> Cow<'static, str>,
133 ("foo".to_string());
134 }