2 use crate::nameres::proc_macro::{ProcMacroDef, ProcMacroKind};
5 fn macro_rules_are_globally_visible() {
11 $(struct $i { field: u32 } )*
33 fn macro_rules_can_define_modules() {
38 ($name:ident) => { mod $name; }
71 fn macro_rules_from_other_crates_are_visible() {
74 //- /main.rs crate:main deps:foo
75 foo::structs!(Foo, Bar)
83 macro_rules! structs {
85 $(struct $i { field: u32 } )*
104 fn macro_rules_export_with_local_inner_macros_are_visible() {
107 //- /main.rs crate:main deps:foo
108 foo::structs!(Foo, Bar)
114 //- /lib.rs crate:foo
115 #[macro_export(local_inner_macros)]
116 macro_rules! structs {
118 $(struct $i { field: u32 } )*
137 fn local_inner_macros_makes_local_macros_usable() {
140 //- /main.rs crate:main deps:foo
141 foo::structs!(Foo, Bar);
147 //- /lib.rs crate:foo
148 #[macro_export(local_inner_macros)]
149 macro_rules! structs {
157 $(struct $i { field: u32 } )*
176 fn unexpanded_macro_should_expand_by_fixedpoint_loop() {
179 //- /main.rs crate:main deps:foo
189 //- /lib.rs crate:foo
193 struct Foo { field: u32 }
213 fn macro_rules_from_other_crates_are_visible_with_macro_use() {
214 cov_mark::check!(macro_rules_from_other_crates_are_visible_with_macro_use);
217 //- /main.rs crate:main deps:foo
220 structs_not_exported!(MacroNotResolved1);
221 crate::structs!(MacroNotResolved2);
230 crate::structs!(MacroNotResolved3);
232 //- /lib.rs crate:foo
234 macro_rules! structs {
235 ($i:ident) => { struct $i; }
238 macro_rules! structs_not_exported {
239 ($i:ident) => { struct $i; }
244 macro_rules! structs_priv {
245 ($i:ident) => { struct $i; }
263 fn prelude_is_macro_use() {
264 cov_mark::check!(prelude_is_macro_use);
267 //- /main.rs crate:main deps:foo
270 structs_outside!(Out);
271 crate::structs!(MacroNotResolved2);
277 crate::structs!(MacroNotResolved3);
279 //- /lib.rs crate:foo
281 use self::prelude::*;
285 macro_rules! structs {
286 ($i:ident) => { struct $i; }
291 macro_rules! structs_priv {
292 ($i:ident) => { struct $i; }
298 macro_rules! structs_outside {
299 ($i:ident) => { struct $i; }
320 use self::prelude::*;
325 macro_rules! declare_mod {
340 fn plain_macros_are_legacy_textual_scoped() {
345 bar!(NotFoundNotMacroUse);
347 mod m2 { foo!(NotFoundBeforeInside2); }
350 ($x:ident) => { struct $x; }
356 bar!(NotFoundMacroUseStop);
363 ($x:ident) => { fn $x() {} }
367 foo!(ok_double_macro_use_shadow);
369 baz!(NotFoundBefore);
373 ($x:ident) => { struct $x; }
379 foo!(NotFoundBeforeInside1);
381 ($x:ident) => { struct $x; }
387 ($x:ident) => { fn $x() {} }
396 baz!(OkMacroUseInner);
399 foo!(ok_shadow_deep);
401 ($x:ident) => { struct $x; }
406 ($x:ident) => { struct $x; }
421 ok_double_macro_use_shadow: v
451 fn type_value_macro_live_in_different_scopes() {
456 ($x:ident) => { type $x = (); }
462 use self::foo as baz;
475 fn macro_use_can_be_aliased() {
478 //- /main.rs crate:main deps:foo
485 //- /lib.rs crate:foo
486 use crate::foo as bar;
491 ($x:ident) => { struct $x; }
505 fn path_qualified_macros() {
509 ($x:ident) => { struct $x; }
512 crate::foo!(NotResolved);
514 crate::bar!(OkCrate);
517 m::alias1!(OkAliasPlain);
518 m::alias2!(OkAliasSuper);
519 m::alias3!(OkAliasCrate);
520 not_found!(NotFound);
525 ($x:ident) => { struct $x; }
527 pub use bar as alias1;
528 pub use super::bar as alias2;
529 pub use crate::bar as alias3;
530 pub use self::bar as not_found;
553 fn macro_dollar_crate_is_correct_in_item() {
554 cov_mark::check!(macro_dollar_crate_self);
557 //- /main.rs crate:main deps:foo
563 macro_rules! current {
565 use $crate::Foo as FooSelf;
574 foo::not_current2!();
576 //- /lib.rs crate:foo
579 macro_rules! not_current1 {
587 macro_rules! not_current2 {
611 fn macro_dollar_crate_is_correct_in_indirect_deps() {
612 cov_mark::check!(macro_dollar_crate_other);
616 //- /main.rs crate:main deps:std
619 //- /std.rs crate:std deps:core
621 use self::prelude::*;
630 //- /core.rs crate:core
649 let map = compute_crate_def_map(
651 //- /main.rs crate:main deps:core
654 #[derive(Copy, core::Clone)]
657 //- /core.rs crate:core
658 #[rustc_builtin_macro]
661 #[rustc_builtin_macro]
665 assert_eq!(map.modules[map.root].scope.impls().len(), 2);
669 fn resolve_builtin_derive() {
672 //- /main.rs crate:main deps:core
675 //- /core.rs crate:core
676 #[rustc_builtin_macro]
689 fn builtin_derive_with_unresolved_attributes_fall_back() {
690 // Tests that we still resolve derives after ignoring an unresolved attribute.
691 cov_mark::check!(unresolved_attribute_fallback);
692 let map = compute_crate_def_map(
694 //- /main.rs crate:main deps:core
701 //- /core.rs crate:core
702 #[rustc_builtin_macro]
706 assert_eq!(map.modules[map.root].scope.impls().len(), 1);
710 fn unresolved_attributes_fall_back_track_per_file_moditems() {
711 // Tests that we track per-file ModItems when ignoring an unresolved attribute.
712 // Just tracking the `ModItem` leads to `Foo` getting ignored.
716 //- /main.rs crate:main
739 fn macro_expansion_overflow() {
740 cov_mark::check!(macro_expansion_overflow);
744 ($e:expr; $($t:tt)*) => {
745 b!(static = (); $($t)*);
751 (static = $e:expr; $($t:tt)*) => {
757 b! { static = #[] ();}
766 fn macros_defining_macros() {
770 ($item:item) => { $item }
774 macro_rules! indirect_macro { () => { struct S {} } }
787 fn resolves_proc_macros() {
793 pub fn function_like_macro(args: TokenStream) -> TokenStream {
797 #[proc_macro_attribute]
798 pub fn attribute_macro(_args: TokenStream, item: TokenStream) -> TokenStream {
802 #[proc_macro_derive(DummyTrait)]
803 pub fn derive_macro(_item: TokenStream) -> TokenStream {
807 #[proc_macro_derive(AnotherTrait, attributes(helper_attr))]
808 pub fn derive_macro_2(_item: TokenStream) -> TokenStream {
820 function_like_macro: v m
826 fn proc_macro_censoring() {
827 // Make sure that only proc macros are publicly exported from proc-macro crates.
831 //- /main.rs crate:main deps:macros
834 //- /macros.rs crate:macros
835 pub struct TokenStream;
838 pub fn function_like_macro(args: TokenStream) -> TokenStream {
842 #[proc_macro_attribute]
843 pub fn attribute_macro(_args: TokenStream, item: TokenStream) -> TokenStream {
847 #[proc_macro_derive(DummyTrait)]
848 pub fn derive_macro(_item: TokenStream) -> TokenStream {
861 function_like_macro: m
867 fn collects_derive_helpers() {
868 let def_map = compute_crate_def_map(
872 #[proc_macro_derive(AnotherTrait, attributes(helper_attr))]
873 pub fn derive_macro_2(_item: TokenStream) -> TokenStream {
879 assert_eq!(def_map.exported_proc_macros.len(), 1);
880 match def_map.exported_proc_macros.values().next() {
881 Some(ProcMacroDef { kind: ProcMacroKind::CustomDerive { helpers }, .. }) => {
883 [attr] => assert_eq!(attr.to_string(), "helper_attr"),
892 fn resolve_macro_def() {
895 pub macro structs($($i:ident),*) {
896 $(struct $i { field: u32 } )*