3 use expect_test::expect;
4 use test_utils::project_dir;
6 use super::{check_infer, check_types};
12 //- /main.rs crate:main deps:foo cfg:test
18 fn foo1(&self) -> i32 { 0 }
23 fn foo2(&self) -> i32 { 0 }
27 let t = (S.foo1(), S.foo2(), T.foo3(), T.foo4());
29 } //^ (i32, {unknown}, i32, {unknown})
36 fn foo3(&self) -> i32 { 0 }
41 fn foo4(&self) -> i32 { 0 }
48 fn infer_macros_expanded() {
54 ($($item:expr),*) => {
66 !0..17 '{Foo(v...,2,])}': Foo
67 !1..4 'Foo': Foo({unknown}) -> Foo
68 !1..16 'Foo(vec![1,2,])': Foo
69 !5..15 'vec![1,2,]': {unknown}
70 155..181 '{ ...,2); }': ()
77 fn infer_legacy_textual_scoped_macros_expanded() {
85 ($($item:expr),*) => {
95 let y = crate::foo!(1,2);
99 !0..17 '{Foo(v...,2,])}': Foo
100 !1..4 'Foo': Foo({unknown}) -> Foo
101 !1..16 'Foo(vec![1,2,])': Foo
102 !5..15 'vec![1,2,]': {unknown}
103 194..250 '{ ...,2); }': ()
105 227..228 'y': {unknown}
106 231..247 'crate:...!(1,2)': {unknown}
112 fn infer_path_qualified_macros_expanded() {
121 pub use super::foo as bar;
125 let x = crate::foo!();
132 110..163 '{ ...!(); }': ()
140 fn expr_macro_expanded_in_various_places() {
150 spam!().spam(spam!());
157 _ if spam!() => spam!(),
160 Spam { spam: spam!() };
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 !0..6 '1isize': isize
195 !0..6 '1isize': isize
196 53..456 '{ ...!(); }': ()
197 87..108 'spam!(...am!())': {unknown}
198 114..133 'for _ ...!() {}': ()
199 118..119 '_': {unknown}
201 138..148 '|| spam!()': || -> isize
202 154..170 'while ...!() {}': ()
204 175..188 'break spam!()': !
205 194..208 'return spam!()': !
206 214..268 'match ... }': isize
208 273..289 'spam!(...am!())': {unknown}
209 295..317 'Spam {...m!() }': {unknown}
210 323..339 'spam!(...am!()]': {unknown}
211 364..380 'spam!(... usize': usize
212 386..394 '&spam!()': &isize
213 400..408 '-spam!()': isize
214 414..430 'spam!(...pam!()': {unknown}
215 436..453 'spam!(...pam!()': isize
221 fn infer_type_value_macro_having_same_name() {
239 let foo = foo::foo!(42i32);
244 170..205 '{ ...32); }': ()
251 fn processes_impls_generated_by_macros() {
255 ($ident:ident) => (impl Trait for $ident {})
257 trait Trait { fn foo(self) -> u128 {} }
260 fn test() { S.foo(); }
267 fn infer_assoc_items_generated_by_macros() {
271 () => (fn foo(&self) -> u128 {0})
278 fn test() { S.foo(); }
285 fn infer_assoc_items_generated_by_macros_chain() {
288 macro_rules! m_inner {
289 () => {fn foo(&self) -> u128 {0}}
300 fn test() { S.foo(); }
307 fn infer_macro_with_dollar_crate_is_correct_in_expr() {
310 //- /main.rs crate:main deps:foo
312 let x = (foo::foo!(1), foo::foo!(2));
316 //- /lib.rs crate:foo
319 (1) => { $crate::bar!() };
320 (2) => { 1 + $crate::baz() };
328 pub fn baz() -> usize { 31usize }
334 fn infer_macro_with_dollar_crate_is_correct_in_trait_associate_type() {
337 //- /main.rs crate:main deps:foo
341 let msg = foo::Message(foo::MessageRef);
347 //- /lib.rs crate:foo
348 pub struct MessageRef;
349 pub struct Message(MessageRef);
353 fn deref(&self) -> &Self::Target;
357 macro_rules! expand {
359 impl Trait for Message {
360 type Target = $crate::MessageRef;
361 fn deref(&self) -> &Self::Target {
374 fn infer_macro_with_dollar_crate_in_def_site() {
377 //- /main.rs crate:main deps:foo
381 ($($tt:tt)*) => { $($tt)* }
390 //- /lib.rs crate:foo
392 macro_rules! expand {
393 () => { list!($crate::m!()) };
405 fn infer_type_value_non_legacy_macro_use_as() {
410 ($x:ident) => { type $x = u64; }
412 pub(crate) use _foo as foo;
423 158..163 '{ 0 }': u64
425 174..196 '{ ...f(); }': ()
427 190..191 'f': fn f() -> u64
434 fn infer_local_macro() {
445 !0..6 '1usize': usize
446 10..89 '{ ...!(); }': ()
453 fn infer_local_inner_macros() {
456 //- /main.rs crate:main deps:foo
458 let x = foo::foo!(1);
462 //- /lib.rs crate:foo
463 #[macro_export(local_inner_macros)]
478 fn infer_builtin_macros_line() {
481 #[rustc_builtin_macro]
482 macro_rules! line {() => {}}
490 63..87 '{ ...!(); }': ()
497 fn infer_builtin_macros_file() {
500 #[rustc_builtin_macro]
501 macro_rules! file {() => {}}
509 63..87 '{ ...!(); }': ()
516 fn infer_builtin_macros_column() {
519 #[rustc_builtin_macro]
520 macro_rules! column {() => {}}
528 65..91 '{ ...!(); }': ()
535 fn infer_builtin_macros_concat() {
538 #[rustc_builtin_macro]
539 macro_rules! concat {() => {}}
542 let x = concat!("hello", concat!("world", "!"));
546 !0..13 '"helloworld!"': &str
547 65..121 '{ ...")); }': ()
554 fn infer_builtin_macros_include() {
558 #[rustc_builtin_macro]
559 macro_rules! include {() => {}}
574 fn infer_builtin_macros_include_str() {
578 #[rustc_builtin_macro]
579 macro_rules! include_str {() => {}}
582 let a = include_str!("foo.rs");
593 fn infer_builtin_macros_include_str_with_lazy_nested() {
597 #[rustc_builtin_macro]
598 macro_rules! concat {() => {}}
599 #[rustc_builtin_macro]
600 macro_rules! include_str {() => {}}
609 let a = include_str!(m!(".rs"));
621 fn include_accidentally_quadratic() {
622 let file = project_dir().join("crates/syntax/test_data/accidentally_quadratic");
623 let big_file = fs::read_to_string(file).unwrap();
624 let big_file = vec![big_file; 10].join("\n");
628 #[rustc_builtin_macro]
629 macro_rules! include {() => {}}
638 let fixture = format!("{}\n//- /foo.rs\n{}", fixture, big_file);
639 check_types(&fixture);
643 fn infer_builtin_macros_include_concat() {
647 #[rustc_builtin_macro]
648 macro_rules! include {() => {}}
650 #[rustc_builtin_macro]
651 macro_rules! concat {() => {}}
653 include!(concat!("f", "oo.rs"));
666 fn infer_builtin_macros_include_concat_with_bad_env_should_failed() {
670 #[rustc_builtin_macro]
671 macro_rules! include {() => {}}
673 #[rustc_builtin_macro]
674 macro_rules! concat {() => {}}
676 #[rustc_builtin_macro]
677 macro_rules! env {() => {}}
679 include!(concat!(env!("OUT_DIR"), "/foo.rs"));
692 fn infer_builtin_macros_include_itself_should_failed() {
695 #[rustc_builtin_macro]
696 macro_rules! include {() => {}}
708 fn infer_builtin_macros_concat_with_lazy() {
711 macro_rules! hello {() => {"hello"}}
713 #[rustc_builtin_macro]
714 macro_rules! concat {() => {}}
717 let x = concat!(hello!(), concat!("world", "!"));
721 !0..13 '"helloworld!"': &str
722 103..160 '{ ...")); }': ()
729 fn infer_builtin_macros_env() {
732 //- /main.rs env:foo=bar
733 #[rustc_builtin_macro]
734 macro_rules! env {() => {}}
741 !0..22 '"__RA_...TED__"': &str
742 62..90 '{ ...o"); }': ()
749 fn infer_derive_clone_simple() {
752 //- /main.rs crate:main deps:core
759 //- /lib.rs crate:core
764 fn clone(&self) -> Self;
766 #[rustc_builtin_macro]
774 fn infer_derive_clone_in_core() {
777 //- /lib.rs crate:core
782 fn clone(&self) -> Self;
784 #[rustc_builtin_macro]
790 //- /main.rs crate:main deps:core
800 fn infer_derive_clone_with_params() {
803 //- /main.rs crate:main deps:core
807 struct Wrapper<T>(T);
810 (Wrapper(S).clone(), Wrapper(NonClone).clone());
811 //^ (Wrapper<S>, {unknown})
814 //- /lib.rs crate:core
819 fn clone(&self) -> Self;
821 #[rustc_builtin_macro]
829 fn infer_custom_derive_simple() {
830 // FIXME: this test current now do nothing
833 //- /main.rs crate:main
861 51..110 '{ ... }; }': ()
863 65..107 'match ... }': u32