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 fn foo3(&self) -> i32 { 0 }
39 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_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 53..456 '{ ...!(); }': ()
195 87..108 'spam!(...am!())': {unknown}
196 114..133 'for _ ...!() {}': ()
197 118..119 '_': {unknown}
199 138..148 '|| spam!()': || -> isize
200 154..170 'while ...!() {}': ()
202 175..188 'break spam!()': !
203 194..208 'return spam!()': !
204 214..268 'match ... }': isize
206 273..289 'spam!(...am!())': {unknown}
207 295..317 'Spam {...m!() }': {unknown}
208 323..339 'spam!(...am!()]': {unknown}
209 364..380 'spam!(... usize': usize
210 386..394 '&spam!()': &isize
211 400..408 '-spam!()': isize
212 414..430 'spam!(...pam!()': {unknown}
213 436..453 'spam!(...pam!()': isize
219 fn infer_type_value_macro_having_same_name() {
237 let foo = foo::foo!(42i32);
242 170..205 '{ ...32); }': ()
249 fn processes_impls_generated_by_macros() {
253 ($ident:ident) => (impl Trait for $ident {})
255 trait Trait { fn foo(self) -> u128 {} }
258 fn test() { S.foo(); }
265 fn infer_assoc_items_generated_by_macros() {
269 () => (fn foo(&self) -> u128 {0})
276 fn test() { S.foo(); }
283 fn infer_assoc_items_generated_by_macros_chain() {
286 macro_rules! m_inner {
287 () => {fn foo(&self) -> u128 {0}}
298 fn test() { S.foo(); }
305 fn infer_macro_with_dollar_crate_is_correct_in_expr() {
308 //- /main.rs crate:main deps:foo
310 let x = (foo::foo!(1), foo::foo!(2));
314 //- /lib.rs crate:foo
317 (1) => { $crate::bar!() };
318 (2) => { 1 + $crate::baz() };
326 pub fn baz() -> usize { 31usize }
332 fn infer_macro_with_dollar_crate_is_correct_in_trait_associate_type() {
335 //- /main.rs crate:main deps:foo
339 let msg = foo::Message(foo::MessageRef);
345 //- /lib.rs crate:foo
346 pub struct MessageRef;
347 pub struct Message(MessageRef);
351 fn deref(&self) -> &Self::Target;
355 macro_rules! expand {
357 impl Trait for Message {
358 type Target = $crate::MessageRef;
359 fn deref(&self) -> &Self::Target {
372 fn infer_macro_with_dollar_crate_in_def_site() {
375 //- /main.rs crate:main deps:foo
379 ($($tt:tt)*) => { $($tt)* }
388 //- /lib.rs crate:foo
390 macro_rules! expand {
391 () => { list!($crate::m!()) };
403 fn infer_type_value_non_legacy_macro_use_as() {
408 ($x:ident) => { type $x = u64; }
410 pub(crate) use _foo as foo;
421 158..163 '{ 0 }': u64
423 174..196 '{ ...f(); }': ()
425 190..191 'f': fn f() -> u64
432 fn infer_local_macro() {
443 !0..6 '1usize': usize
444 10..89 '{ ...!(); }': ()
451 fn infer_local_inner_macros() {
454 //- /main.rs crate:main deps:foo
456 let x = foo::foo!(1);
460 //- /lib.rs crate:foo
461 #[macro_export(local_inner_macros)]
476 fn infer_builtin_macros_line() {
479 #[rustc_builtin_macro]
480 macro_rules! line {() => {}}
488 63..87 '{ ...!(); }': ()
495 fn infer_builtin_macros_file() {
498 #[rustc_builtin_macro]
499 macro_rules! file {() => {}}
507 63..87 '{ ...!(); }': ()
514 fn infer_builtin_macros_column() {
517 #[rustc_builtin_macro]
518 macro_rules! column {() => {}}
526 65..91 '{ ...!(); }': ()
533 fn infer_builtin_macros_concat() {
536 #[rustc_builtin_macro]
537 macro_rules! concat {() => {}}
540 let x = concat!("hello", concat!("world", "!"));
544 !0..13 '"helloworld!"': &str
545 65..121 '{ ...")); }': ()
552 fn infer_builtin_macros_include() {
556 #[rustc_builtin_macro]
557 macro_rules! include {() => {}}
572 fn infer_builtin_macros_include_str() {
576 #[rustc_builtin_macro]
577 macro_rules! include_str {() => {}}
580 let a = include_str!("foo.rs");
591 fn infer_builtin_macros_include_str_with_lazy_nested() {
595 #[rustc_builtin_macro]
596 macro_rules! concat {() => {}}
597 #[rustc_builtin_macro]
598 macro_rules! include_str {() => {}}
607 let a = include_str!(m!(".rs"));
618 fn benchmark_include_macro() {
619 if skip_slow_tests() {
622 let data = bench_fixture::big_struct();
625 #[rustc_builtin_macro]
626 macro_rules! include {() => {}}
635 let fixture = format!("{}\n//- /foo.rs\n{}", fixture, data);
638 let _b = bench("include macro");
639 check_types(&fixture);
644 fn infer_builtin_macros_include_concat() {
648 #[rustc_builtin_macro]
649 macro_rules! include {() => {}}
651 #[rustc_builtin_macro]
652 macro_rules! concat {() => {}}
654 include!(concat!("f", "oo.rs"));
667 fn infer_builtin_macros_include_concat_with_bad_env_should_failed() {
671 #[rustc_builtin_macro]
672 macro_rules! include {() => {}}
674 #[rustc_builtin_macro]
675 macro_rules! concat {() => {}}
677 #[rustc_builtin_macro]
678 macro_rules! env {() => {}}
680 include!(concat!(env!("OUT_DIR"), "/foo.rs"));
693 fn infer_builtin_macros_include_itself_should_failed() {
696 #[rustc_builtin_macro]
697 macro_rules! include {() => {}}
709 fn infer_builtin_macros_concat_with_lazy() {
712 macro_rules! hello {() => {"hello"}}
714 #[rustc_builtin_macro]
715 macro_rules! concat {() => {}}
718 let x = concat!(hello!(), concat!("world", "!"));
722 !0..13 '"helloworld!"': &str
723 103..160 '{ ...")); }': ()
730 fn infer_builtin_macros_env() {
733 //- /main.rs env:foo=bar
734 #[rustc_builtin_macro]
735 macro_rules! env {() => {}}
742 !0..22 '"__RA_...TED__"': &str
743 62..90 '{ ...o"); }': ()
750 fn infer_derive_clone_simple() {
753 //- /main.rs crate:main deps:core
760 //- /lib.rs crate:core
765 fn clone(&self) -> Self;
767 #[rustc_builtin_macro]
775 fn infer_derive_clone_in_core() {
778 //- /lib.rs crate:core
783 fn clone(&self) -> Self;
785 #[rustc_builtin_macro]
791 //- /main.rs crate:main deps:core
801 fn infer_derive_clone_with_params() {
804 //- /main.rs crate:main deps:core
808 struct Wrapper<T>(T);
811 (Wrapper(S).clone(), Wrapper(NonClone).clone());
812 //^ (Wrapper<S>, {unknown})
815 //- /lib.rs crate:core
820 fn clone(&self) -> Self;
822 #[rustc_builtin_macro]
830 fn infer_custom_derive_simple() {
831 // FIXME: this test current now do nothing
834 //- /main.rs crate:main
862 51..110 '{ ... }; }': ()
864 65..107 'match ... }': u32