@@ -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:: cell:: RefCell ;
28
28
use std:: collections:: hash_map:: Entry ;
@@ -389,7 +389,7 @@ crate fn run_global_ctxt(
389
389
tcx : TyCtxt < ' _ > ,
390
390
resolver : Rc < RefCell < interface:: BoxedResolver > > ,
391
391
mut default_passes : passes:: DefaultPassOption ,
392
- mut manual_passes : Vec < String > ,
392
+ manual_passes : Vec < String > ,
393
393
render_options : RenderOptions ,
394
394
output_format : OutputFormat ,
395
395
) -> ( clean:: Crate , RenderOptions , Cache ) {
@@ -490,21 +490,44 @@ crate fn run_global_ctxt(
490
490
}
491
491
}
492
492
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 (
497
497
"see issue #44136 <https://github.com/rust-lang/rust/issues/44136> \
498
498
for more information",
499
499
) ;
500
500
501
501
if name == "no_default_passes" {
502
502
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>" ) ;
503
505
}
504
506
505
507
msg. emit ( ) ;
506
508
}
507
509
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
+
508
531
// Process all of the crate attributes, extracting plugin metadata along
509
532
// with the passes which we are supposed to run.
510
533
for attr in krate. module . as_ref ( ) . unwrap ( ) . attrs . lists ( sym:: doc) {
@@ -513,29 +536,25 @@ crate fn run_global_ctxt(
513
536
let name = attr. name_or_empty ( ) ;
514
537
if attr. is_word ( ) {
515
538
if name == sym:: no_default_passes {
516
- report_deprecated_attr ( "no_default_passes" , diag) ;
539
+ report_deprecated_attr ( "no_default_passes" , diag, attr . span ( ) ) ;
517
540
if default_passes == passes:: DefaultPassOption :: Default {
518
541
default_passes = passes:: DefaultPassOption :: None ;
519
542
}
520
543
}
521
544
} else if let Some ( value) = attr. value_str ( ) {
522
- let sink = match name {
545
+ match name {
523
546
sym:: passes => {
524
- report_deprecated_attr ( "passes = \" ...\" " , diag) ;
525
- & mut manual_passes
547
+ report_deprecated_attr ( "passes = \" ...\" " , diag, attr. span ( ) ) ;
526
548
}
527
549
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 ( ) ) ;
533
551
continue ;
534
552
}
535
553
_ => continue ,
536
554
} ;
537
555
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) ) ) ;
539
558
}
540
559
}
541
560
@@ -544,17 +563,7 @@ crate fn run_global_ctxt(
544
563
}
545
564
}
546
565
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) ;
558
567
info ! ( "Executing passes" ) ;
559
568
560
569
for p in passes {
0 commit comments