@@ -22,7 +22,7 @@ use rustc_session::DiagnosticOutput;
2222use rustc_session:: Session ;
2323use rustc_span:: source_map;
2424use rustc_span:: symbol:: sym;
25- use rustc_span:: DUMMY_SP ;
25+ use rustc_span:: { Span , DUMMY_SP } ;
2626
2727use std:: cell:: RefCell ;
2828use std:: collections:: hash_map:: Entry ;
@@ -389,7 +389,7 @@ crate fn run_global_ctxt(
389389 tcx : TyCtxt < ' _ > ,
390390 resolver : Rc < RefCell < interface:: BoxedResolver > > ,
391391 mut default_passes : passes:: DefaultPassOption ,
392- mut manual_passes : Vec < String > ,
392+ manual_passes : Vec < String > ,
393393 render_options : RenderOptions ,
394394 output_format : OutputFormat ,
395395) -> ( clean:: Crate , RenderOptions , Cache ) {
@@ -490,21 +490,44 @@ crate fn run_global_ctxt(
490490 }
491491 }
492492
493- fn report_deprecated_attr ( name : & str , diag : & rustc_errors:: Handler ) {
494- let mut msg = diag
495- . struct_warn ( & format ! ( "the `#![doc({})]` attribute is considered deprecated" , name) ) ;
496- msg. warn (
493+ fn report_deprecated_attr ( name : & str , diag : & rustc_errors:: Handler , sp : Span ) {
494+ let mut msg =
495+ diag . struct_span_warn ( sp , & format ! ( "the `#![doc({})]` attribute is deprecated" , name) ) ;
496+ msg. note (
497497 "see issue #44136 <https://github.com/rust-lang/rust/issues/44136> \
498498 for more information",
499499 ) ;
500500
501501 if name == "no_default_passes" {
502502 msg. help ( "you may want to use `#![doc(document_private_items)]`" ) ;
503+ } else if name. starts_with ( "plugins" ) {
504+ msg. warn ( "`#![doc(plugins = \" ...\" )]` no longer functions; see CVE-2018-1000622 <https://nvd.nist.gov/vuln/detail/CVE-2018-1000622>" ) ;
503505 }
504506
505507 msg. emit ( ) ;
506508 }
507509
510+ let parse_pass = |name : & str , sp : Option < Span > | {
511+ if let Some ( pass) = passes:: find_pass ( name) {
512+ Some ( ConditionalPass :: always ( pass) )
513+ } else {
514+ let msg = & format ! ( "ignoring unknown pass `{}`" , name) ;
515+ let mut warning = if let Some ( sp) = sp {
516+ tcx. sess . struct_span_warn ( sp, msg)
517+ } else {
518+ tcx. sess . struct_warn ( msg)
519+ } ;
520+ if name == "collapse-docs" {
521+ warning. note ( "the `collapse-docs` pass was removed in #80261 <https://github.com/rust-lang/rust/pull/80261>" ) ;
522+ }
523+ warning. emit ( ) ;
524+ None
525+ }
526+ } ;
527+
528+ let mut manual_passes: Vec < _ > =
529+ manual_passes. into_iter ( ) . flat_map ( |name| parse_pass ( & name, None ) ) . collect ( ) ;
530+
508531 // Process all of the crate attributes, extracting plugin metadata along
509532 // with the passes which we are supposed to run.
510533 for attr in krate. module . as_ref ( ) . unwrap ( ) . attrs . lists ( sym:: doc) {
@@ -513,29 +536,25 @@ crate fn run_global_ctxt(
513536 let name = attr. name_or_empty ( ) ;
514537 if attr. is_word ( ) {
515538 if name == sym:: no_default_passes {
516- report_deprecated_attr ( "no_default_passes" , diag) ;
539+ report_deprecated_attr ( "no_default_passes" , diag, attr . span ( ) ) ;
517540 if default_passes == passes:: DefaultPassOption :: Default {
518541 default_passes = passes:: DefaultPassOption :: None ;
519542 }
520543 }
521544 } else if let Some ( value) = attr. value_str ( ) {
522- let sink = match name {
545+ match name {
523546 sym:: passes => {
524- report_deprecated_attr ( "passes = \" ...\" " , diag) ;
525- & mut manual_passes
547+ report_deprecated_attr ( "passes = \" ...\" " , diag, attr. span ( ) ) ;
526548 }
527549 sym:: plugins => {
528- report_deprecated_attr ( "plugins = \" ...\" " , diag) ;
529- eprintln ! (
530- "WARNING: `#![doc(plugins = \" ...\" )]` \
531- no longer functions; see CVE-2018-1000622"
532- ) ;
550+ report_deprecated_attr ( "plugins = \" ...\" " , diag, attr. span ( ) ) ;
533551 continue ;
534552 }
535553 _ => continue ,
536554 } ;
537555 for name in value. as_str ( ) . split_whitespace ( ) {
538- sink. push ( name. to_string ( ) ) ;
556+ let span = attr. name_value_literal_span ( ) . unwrap_or ( attr. span ( ) ) ;
557+ manual_passes. extend ( parse_pass ( name, Some ( span) ) ) ;
539558 }
540559 }
541560
@@ -544,17 +563,7 @@ crate fn run_global_ctxt(
544563 }
545564 }
546565
547- let passes = passes:: defaults ( default_passes) . iter ( ) . copied ( ) . chain (
548- manual_passes. into_iter ( ) . flat_map ( |name| {
549- if let Some ( pass) = passes:: find_pass ( & name) {
550- Some ( ConditionalPass :: always ( pass) )
551- } else {
552- error ! ( "unknown pass {}, skipping" , name) ;
553- None
554- }
555- } ) ,
556- ) ;
557-
566+ let passes = passes:: defaults ( default_passes) . iter ( ) . copied ( ) . chain ( manual_passes) ;
558567 info ! ( "Executing passes" ) ;
559568
560569 for p in passes {
0 commit comments