@@ -15,6 +15,7 @@ use codemap::{ExpnInfo, MacroBang, MacroAttribute, dummy_spanned, respan};
1515use config:: { is_test_or_bench, StripUnconfigured } ;
1616use errors:: { Applicability , FatalError } ;
1717use ext:: base:: * ;
18+ use ext:: build:: AstBuilder ;
1819use ext:: derive:: { add_derived_markers, collect_derives} ;
1920use ext:: hygiene:: { self , Mark , SyntaxContext } ;
2021use ext:: placeholders:: { placeholder, PlaceholderExpander } ;
@@ -1354,12 +1355,29 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> {
13541355 // Ensure that test functions are accessible from the test harness.
13551356 ast:: ItemKind :: Fn ( ..) if self . cx . ecfg . should_test => {
13561357 if item. attrs . iter ( ) . any ( |attr| is_test_or_bench ( attr) ) {
1358+ let orig_vis = item. vis . clone ( ) ;
1359+
1360+ // Publicize the item under gensymed name to avoid pollution
13571361 item = item. map ( |mut item| {
13581362 item. vis = respan ( item. vis . span , ast:: VisibilityKind :: Public ) ;
1363+ item. ident = Ident :: from_interned_str (
1364+ item. ident . as_interned_str ( ) ) . gensym ( ) ;
13591365 item
13601366 } ) ;
1367+
1368+ // Use the gensymed name under the item's original visibility
1369+ let use_item = self . cx . item_use_simple_ (
1370+ item. ident . span ,
1371+ orig_vis,
1372+ Some ( Ident :: from_interned_str ( item. ident . as_interned_str ( ) ) ) ,
1373+ self . cx . path ( item. ident . span , vec ! [ item. ident] ) ) ;
1374+
1375+ SmallVector :: many (
1376+ noop_fold_item ( item, self ) . into_iter ( )
1377+ . chain ( noop_fold_item ( use_item, self ) ) )
1378+ } else {
1379+ noop_fold_item ( item, self )
13611380 }
1362- noop_fold_item ( item, self )
13631381 }
13641382 _ => noop_fold_item ( item, self ) ,
13651383 }
0 commit comments