1 use expect_test::expect;
2 use test_utils::{bench, bench_fixture, skip_slow_tests};
4 use super::{check_infer, check_types};
10 //- /main.rs crate:main deps:foo cfg:test
16 fn foo1(&self) -> i32 { 0 }
21 fn foo2(&self) -> i32 { 0 }
25 let t = (S.foo1(), S.foo2(), T.foo3(), T.foo4());
27 } //^ (i32, {unknown}, i32, {unknown})
34 pub fn foo3(&self) -> i32 { 0 }
39 pub fn foo4(&self) -> i32 { 0 }
46 fn infer_macros_expanded() {
52 ($($item:expr),*) => {
64 !0..17 '{Foo(v...,2,])}': Foo
65 !1..4 'Foo': Foo({unknown}) -> Foo
66 !1..16 'Foo(vec![1,2,])': Foo
67 !5..15 'vec![1,2,]': {unknown}
68 155..181 '{ ...,2); }': ()
75 fn infer_legacy_textual_scoped_macros_expanded() {
83 ($($item:expr),*) => {
93 let y = crate::foo!(1,2);
97 !0..17 '{Foo(v...,2,])}': Foo
98 !1..4 'Foo': Foo({unknown}) -> Foo
99 !1..16 'Foo(vec![1,2,])': Foo
100 !5..15 'vec![1,2,]': {unknown}
101 194..250 '{ ...,2); }': ()
103 227..228 'y': {unknown}
104 231..247 'crate:...!(1,2)': {unknown}
110 fn infer_path_qualified_macros_expanded() {
119 pub use super::foo as bar;
123 let x = crate::foo!();
130 110..163 '{ ...!(); }': ()
138 fn expr_macro_def_expanded_in_various_places() {
148 spam!().spam(spam!());
155 _ if spam!() => spam!(),
158 Spam { spam: spam!() };
169 !0..6 '1isize': isize
170 !0..6 '1isize': isize
171 !0..6 '1isize': isize
172 !0..6 '1isize': isize
173 !0..6 '1isize': isize
174 !0..6 '1isize': isize
175 !0..6 '1isize': isize
176 !0..6 '1isize': isize
177 !0..6 '1isize': isize
178 !0..6 '1isize': isize
179 !0..6 '1isize': isize
180 !0..6 '1isize': isize
181 !0..6 '1isize': isize
182 !0..6 '1isize': isize
183 !0..6 '1isize': isize
184 !0..6 '1isize': isize
185 !0..6 '1isize': isize
186 !0..6 '1isize': isize
187 !0..6 '1isize': isize
188 !0..6 '1isize': isize
189 !0..6 '1isize': isize
190 !0..6 '1isize': isize
191 !0..6 '1isize': isize
192 !0..6 '1isize': isize
193 !0..6 '1isize': isize
194 39..442 '{ ...!(); }': ()
195 73..94 'spam!(...am!())': {unknown}
196 100..119 'for _ ...!() {}': ()
197 104..105 '_': {unknown}
199 124..134 '|| spam!()': || -> isize
200 140..156 'while ...!() {}': ()
202 161..174 'break spam!()': !
203 180..194 'return spam!()': !
204 200..254 'match ... }': isize
206 259..275 'spam!(...am!())': {unknown}
207 281..303 'Spam {...m!() }': {unknown}
208 309..325 'spam!(...am!()]': {unknown}
209 350..366 'spam!(... usize': usize
210 372..380 '&spam!()': &isize
211 386..394 '-spam!()': isize
212 400..416 'spam!(...pam!()': {unknown}
213 422..439 'spam!(...pam!()': isize
219 fn expr_macro_rules_expanded_in_various_places() {
229 spam!().spam(spam!());
236 _ if spam!() => spam!(),
239 Spam { spam: spam!() };
250 !0..6 '1isize': isize
251 !0..6 '1isize': isize
252 !0..6 '1isize': isize
253 !0..6 '1isize': isize
254 !0..6 '1isize': isize
255 !0..6 '1isize': isize
256 !0..6 '1isize': isize
257 !0..6 '1isize': isize
258 !0..6 '1isize': isize
259 !0..6 '1isize': isize
260 !0..6 '1isize': isize
261 !0..6 '1isize': isize
262 !0..6 '1isize': isize
263 !0..6 '1isize': isize
264 !0..6 '1isize': isize
265 !0..6 '1isize': isize
266 !0..6 '1isize': isize
267 !0..6 '1isize': isize
268 !0..6 '1isize': isize
269 !0..6 '1isize': isize
270 !0..6 '1isize': isize
271 !0..6 '1isize': isize
272 !0..6 '1isize': isize
273 !0..6 '1isize': isize
274 !0..6 '1isize': isize
275 53..456 '{ ...!(); }': ()
276 87..108 'spam!(...am!())': {unknown}
277 114..133 'for _ ...!() {}': ()
278 118..119 '_': {unknown}
280 138..148 '|| spam!()': || -> isize
281 154..170 'while ...!() {}': ()
283 175..188 'break spam!()': !
284 194..208 'return spam!()': !
285 214..268 'match ... }': isize
287 273..289 'spam!(...am!())': {unknown}
288 295..317 'Spam {...m!() }': {unknown}
289 323..339 'spam!(...am!()]': {unknown}
290 364..380 'spam!(... usize': usize
291 386..394 '&spam!()': &isize
292 400..408 '-spam!()': isize
293 414..430 'spam!(...pam!()': {unknown}
294 436..453 'spam!(...pam!()': isize
300 fn expr_macro_expanded_in_stmts() {
303 macro_rules! id { ($($es:tt)*) => { $($es)* } }
313 57..84 '{ ...); } }': ()
319 fn recurisve_macro_expanded_in_stmts() {
326 ([$($tts:tt)*] $head:tt $($rest:tt)*) => {
328 [$($tts)* $head] $($rest)*
338 !0..7 'leta=3;': {unknown}
339 !0..7 'leta=3;': {unknown}
340 !0..13 'ng!{[leta=3]}': {unknown}
341 !0..13 'ng!{[leta=]3}': {unknown}
342 !0..13 'ng!{[leta]=3}': {unknown}
345 196..237 '{ ...= a; }': ()
353 fn recursive_inner_item_macro_rules() {
358 ($x:tt) => { macro_rules! blub { () => { 1 }; } };
367 !0..26 'macro_...>{1};}': {unknown}
368 !0..26 'macro_...>{1};}': {unknown}
369 107..143 '{ ...!(); }': ()
376 fn infer_macro_defining_block_with_items() {
381 fn bar() -> usize { 0 }
392 !0..24 '{fnbar...bar()}': usize
393 !18..21 'bar': fn bar() -> usize
394 !18..23 'bar()': usize
395 98..122 '{ ...!(); }': ()
402 fn infer_type_value_macro_having_same_name() {
420 let foo = foo::foo!(42i32);
425 170..205 '{ ...32); }': ()
432 fn processes_impls_generated_by_macros() {
436 ($ident:ident) => (impl Trait for $ident {})
438 trait Trait { fn foo(self) -> u128 {} }
441 fn test() { S.foo(); }
448 fn infer_assoc_items_generated_by_macros() {
452 () => (fn foo(&self) -> u128 {0})
459 fn test() { S.foo(); }
466 fn infer_assoc_items_generated_by_macros_chain() {
469 macro_rules! m_inner {
470 () => {fn foo(&self) -> u128 {0}}
481 fn test() { S.foo(); }
488 fn infer_macro_with_dollar_crate_is_correct_in_expr() {
491 //- /main.rs crate:main deps:foo
493 let x = (foo::foo!(1), foo::foo!(2));
497 //- /lib.rs crate:foo
500 (1) => { $crate::bar!() };
501 (2) => { 1 + $crate::baz() };
509 pub fn baz() -> usize { 31usize }
515 fn infer_macro_with_dollar_crate_is_correct_in_trait_associate_type() {
518 //- /main.rs crate:main deps:foo
522 let msg = foo::Message(foo::MessageRef);
528 //- /lib.rs crate:foo
529 pub struct MessageRef;
530 pub struct Message(MessageRef);
534 fn deref(&self) -> &Self::Target;
538 macro_rules! expand {
540 impl Trait for Message {
541 type Target = $crate::MessageRef;
542 fn deref(&self) -> &Self::Target {
555 fn infer_macro_with_dollar_crate_in_def_site() {
558 //- /main.rs crate:main deps:foo
562 ($($tt:tt)*) => { $($tt)* }
571 //- /lib.rs crate:foo
573 macro_rules! expand {
574 () => { list!($crate::m!()) };
586 fn infer_type_value_non_legacy_macro_use_as() {
591 ($x:ident) => { type $x = u64; }
593 pub(crate) use _foo as foo;
604 158..163 '{ 0 }': u64
606 174..196 '{ ...f(); }': ()
608 190..191 'f': fn f() -> u64
615 fn infer_local_macro() {
626 !0..6 '1usize': usize
627 10..89 '{ ...!(); }': ()
634 fn infer_local_inner_macros() {
637 //- /main.rs crate:main deps:foo
639 let x = foo::foo!(1);
643 //- /lib.rs crate:foo
644 #[macro_export(local_inner_macros)]
659 fn infer_builtin_macros_line() {
662 #[rustc_builtin_macro]
663 macro_rules! line {() => {}}
671 63..87 '{ ...!(); }': ()
678 fn infer_builtin_macros_file() {
681 #[rustc_builtin_macro]
682 macro_rules! file {() => {}}
690 63..87 '{ ...!(); }': ()
697 fn infer_builtin_macros_column() {
700 #[rustc_builtin_macro]
701 macro_rules! column {() => {}}
709 65..91 '{ ...!(); }': ()
716 fn infer_builtin_macros_concat() {
719 #[rustc_builtin_macro]
720 macro_rules! concat {() => {}}
723 let x = concat!("hello", concat!("world", "!"));
727 !0..13 '"helloworld!"': &str
728 65..121 '{ ...")); }': ()
735 fn infer_builtin_macros_include() {
739 #[rustc_builtin_macro]
740 macro_rules! include {() => {}}
755 fn infer_builtin_macros_include_child_mod() {
759 #[rustc_builtin_macro]
760 macro_rules! include {() => {}}
762 include!("f/foo.rs");
772 pub fn bar() -> u32 {0}
778 fn infer_builtin_macros_include_str() {
782 #[rustc_builtin_macro]
783 macro_rules! include_str {() => {}}
786 let a = include_str!("foo.rs");
797 fn infer_builtin_macros_include_str_with_lazy_nested() {
801 #[rustc_builtin_macro]
802 macro_rules! concat {() => {}}
803 #[rustc_builtin_macro]
804 macro_rules! include_str {() => {}}
813 let a = include_str!(m!(".rs"));
824 fn benchmark_include_macro() {
825 if skip_slow_tests() {
828 let data = bench_fixture::big_struct();
831 #[rustc_builtin_macro]
832 macro_rules! include {() => {}}
841 let fixture = format!("{}\n//- /foo.rs\n{}", fixture, data);
844 let _b = bench("include macro");
845 check_types(&fixture);
850 fn infer_builtin_macros_include_concat() {
854 #[rustc_builtin_macro]
855 macro_rules! include {() => {}}
857 #[rustc_builtin_macro]
858 macro_rules! concat {() => {}}
860 include!(concat!("f", "oo.rs"));
873 fn infer_builtin_macros_include_concat_with_bad_env_should_failed() {
877 #[rustc_builtin_macro]
878 macro_rules! include {() => {}}
880 #[rustc_builtin_macro]
881 macro_rules! concat {() => {}}
883 #[rustc_builtin_macro]
884 macro_rules! env {() => {}}
886 include!(concat!(env!("OUT_DIR"), "/foo.rs"));
899 fn infer_builtin_macros_include_itself_should_failed() {
902 #[rustc_builtin_macro]
903 macro_rules! include {() => {}}
915 fn infer_builtin_macros_concat_with_lazy() {
918 macro_rules! hello {() => {"hello"}}
920 #[rustc_builtin_macro]
921 macro_rules! concat {() => {}}
924 let x = concat!(hello!(), concat!("world", "!"));
928 !0..13 '"helloworld!"': &str
929 103..160 '{ ...")); }': ()
936 fn infer_builtin_macros_env() {
939 //- /main.rs env:foo=bar
940 #[rustc_builtin_macro]
941 macro_rules! env {() => {}}
948 !0..22 '"__RA_...TED__"': &str
949 62..90 '{ ...o"); }': ()
956 fn infer_derive_clone_simple() {
959 //- /main.rs crate:main deps:core
966 //- /lib.rs crate:core
971 fn clone(&self) -> Self;
973 #[rustc_builtin_macro]
981 fn infer_derive_clone_in_core() {
984 //- /lib.rs crate:core
989 fn clone(&self) -> Self;
991 #[rustc_builtin_macro]
997 //- /main.rs crate:main deps:core
1007 fn infer_derive_clone_with_params() {
1010 //- /main.rs crate:main deps:core
1014 struct Wrapper<T>(T);
1017 (Wrapper(S).clone(), Wrapper(NonClone).clone());
1018 //^ (Wrapper<S>, {unknown})
1021 //- /lib.rs crate:core
1026 fn clone(&self) -> Self;
1028 #[rustc_builtin_macro]
1036 fn infer_custom_derive_simple() {
1037 // FIXME: this test current now do nothing
1040 //- /main.rs crate:main
1069 51..110 '{ ... }; }': ()
1071 65..107 'match ... }': u32
1073 95..100 '92u32': u32