@@ -26,6 +26,7 @@ use rustc_span::source_map::{BytePos, FilePathMapping, MultiSpan, SourceMap, Spa
2626use rustc_span:: { sym, FileName , Pos } ;
2727use std:: io;
2828use std:: ops:: Range ;
29+ use std:: thread;
2930use url:: Url ;
3031
3132declare_clippy_lint ! {
@@ -584,17 +585,17 @@ fn get_current_span(spans: &[(usize, Span)], idx: usize) -> (usize, Span) {
584585}
585586
586587fn check_code ( cx : & LateContext < ' _ > , text : & str , edition : Edition , span : Span ) {
587- fn has_needless_main ( code : & str , edition : Edition ) -> bool {
588+ fn has_needless_main ( code : String , edition : Edition ) -> bool {
588589 rustc_driver:: catch_fatal_errors ( || {
589- rustc_span:: with_session_globals ( edition, || {
590- let filename = FileName :: anon_source_code ( code) ;
590+ rustc_span:: create_session_globals_then ( edition, || {
591+ let filename = FileName :: anon_source_code ( & code) ;
591592
592593 let sm = Lrc :: new ( SourceMap :: new ( FilePathMapping :: empty ( ) ) ) ;
593594 let emitter = EmitterWriter :: new ( box io:: sink ( ) , None , false , false , false , None , false ) ;
594595 let handler = Handler :: with_emitter ( false , None , box emitter) ;
595596 let sess = ParseSess :: with_span_handler ( handler, sm) ;
596597
597- let mut parser = match maybe_new_parser_from_source_str ( & sess, filename, code. into ( ) ) {
598+ let mut parser = match maybe_new_parser_from_source_str ( & sess, filename, code) {
598599 Ok ( p) => p,
599600 Err ( errs) => {
600601 for mut err in errs {
@@ -649,7 +650,13 @@ fn check_code(cx: &LateContext<'_>, text: &str, edition: Edition, span: Span) {
649650 . unwrap_or_default ( )
650651 }
651652
652- if has_needless_main ( text, edition) {
653+ // Because of the global session, we need to create a new session in a different thread with
654+ // the edition we need.
655+ let text = text. to_owned ( ) ;
656+ if thread:: spawn ( move || has_needless_main ( text, edition) )
657+ . join ( )
658+ . expect ( "thread::spawn failed" )
659+ {
653660 span_lint ( cx, NEEDLESS_DOCTEST_MAIN , span, "needless `fn main` in doctest" ) ;
654661 }
655662}
0 commit comments