@@ -22,7 +22,7 @@ use rustc_session::DiagnosticOutput;
22
22
use rustc_session:: Session ;
23
23
use rustc_span:: source_map;
24
24
use rustc_span:: symbol:: sym;
25
- use rustc_span:: DUMMY_SP ;
25
+ use rustc_span:: { Span , DUMMY_SP } ;
26
26
27
27
use std:: mem;
28
28
use std:: rc:: Rc ;
@@ -461,7 +461,7 @@ crate fn run_global_ctxt(
461
461
tcx : TyCtxt < ' _ > ,
462
462
resolver : Rc < RefCell < interface:: BoxedResolver > > ,
463
463
mut default_passes : passes:: DefaultPassOption ,
464
- mut manual_passes : Vec < String > ,
464
+ manual_passes : Vec < String > ,
465
465
render_options : RenderOptions ,
466
466
output_format : OutputFormat ,
467
467
) -> ( clean:: Crate , RenderOptions , Cache ) {
@@ -562,10 +562,10 @@ crate fn run_global_ctxt(
562
562
}
563
563
}
564
564
565
- fn report_deprecated_attr ( name : & str , diag : & rustc_errors:: Handler ) {
566
- let mut msg = diag
567
- . struct_warn ( & format ! ( "the `#![doc({})]` attribute is considered deprecated" , name) ) ;
568
- msg. warn (
565
+ fn report_deprecated_attr ( name : & str , diag : & rustc_errors:: Handler , sp : Span ) {
566
+ let mut msg =
567
+ diag . struct_span_warn ( sp , & format ! ( "the `#![doc({})]` attribute is deprecated" , name) ) ;
568
+ msg. note (
569
569
"see issue #44136 <https://github.com/rust-lang/rust/issues/44136> \
570
570
for more information",
571
571
) ;
@@ -577,6 +577,27 @@ crate fn run_global_ctxt(
577
577
msg. emit ( ) ;
578
578
}
579
579
580
+ let parse_pass = |name : & str , sp : Option < Span > | {
581
+ if let Some ( pass) = passes:: find_pass ( name) {
582
+ Some ( ConditionalPass :: always ( pass) )
583
+ } else {
584
+ let msg = & format ! ( "ignoring unknown pass `{}`" , name) ;
585
+ let mut warning = if let Some ( sp) = sp {
586
+ tcx. sess . struct_span_warn ( sp, msg)
587
+ } else {
588
+ tcx. sess . struct_warn ( msg)
589
+ } ;
590
+ if name == "collapse-docs" {
591
+ warning. note ( "the `collapse-docs` pass was removed in #80261 <https://github.com/rust-lang/rust/pull/80261>" ) ;
592
+ }
593
+ warning. emit ( ) ;
594
+ None
595
+ }
596
+ } ;
597
+
598
+ let mut manual_passes: Vec < _ > =
599
+ manual_passes. into_iter ( ) . flat_map ( |name| parse_pass ( & name, None ) ) . collect ( ) ;
600
+
580
601
// Process all of the crate attributes, extracting plugin metadata along
581
602
// with the passes which we are supposed to run.
582
603
for attr in krate. module . as_ref ( ) . unwrap ( ) . attrs . lists ( sym:: doc) {
@@ -585,19 +606,18 @@ crate fn run_global_ctxt(
585
606
let name = attr. name_or_empty ( ) ;
586
607
if attr. is_word ( ) {
587
608
if name == sym:: no_default_passes {
588
- report_deprecated_attr ( "no_default_passes" , diag) ;
609
+ report_deprecated_attr ( "no_default_passes" , diag, attr . span ( ) ) ;
589
610
if default_passes == passes:: DefaultPassOption :: Default {
590
611
default_passes = passes:: DefaultPassOption :: None ;
591
612
}
592
613
}
593
614
} else if let Some ( value) = attr. value_str ( ) {
594
- let sink = match name {
615
+ match name {
595
616
sym:: passes => {
596
- report_deprecated_attr ( "passes = \" ...\" " , diag) ;
597
- & mut manual_passes
617
+ report_deprecated_attr ( "passes = \" ...\" " , diag, attr. span ( ) ) ;
598
618
}
599
619
sym:: plugins => {
600
- report_deprecated_attr ( "plugins = \" ...\" " , diag) ;
620
+ report_deprecated_attr ( "plugins = \" ...\" " , diag, attr . span ( ) ) ;
601
621
eprintln ! (
602
622
"WARNING: `#![doc(plugins = \" ...\" )]` \
603
623
no longer functions; see CVE-2018-1000622"
@@ -607,7 +627,8 @@ crate fn run_global_ctxt(
607
627
_ => continue ,
608
628
} ;
609
629
for name in value. as_str ( ) . split_whitespace ( ) {
610
- sink. push ( name. to_string ( ) ) ;
630
+ let span = attr. name_value_literal_span ( ) . unwrap_or ( attr. span ( ) ) ;
631
+ manual_passes. extend ( parse_pass ( name, Some ( span) ) ) ;
611
632
}
612
633
}
613
634
@@ -616,17 +637,7 @@ crate fn run_global_ctxt(
616
637
}
617
638
}
618
639
619
- let passes = passes:: defaults ( default_passes) . iter ( ) . copied ( ) . chain (
620
- manual_passes. into_iter ( ) . flat_map ( |name| {
621
- if let Some ( pass) = passes:: find_pass ( & name) {
622
- Some ( ConditionalPass :: always ( pass) )
623
- } else {
624
- error ! ( "unknown pass {}, skipping" , name) ;
625
- None
626
- }
627
- } ) ,
628
- ) ;
629
-
640
+ let passes = passes:: defaults ( default_passes) . iter ( ) . copied ( ) . chain ( manual_passes) ;
630
641
info ! ( "Executing passes" ) ;
631
642
632
643
for p in passes {
0 commit comments