Skip to content

Commit d156d07

Browse files
authored
Unrolled build for #151952
Rollup merge of #151952 - GuillaumeGomez:revert-error-to-future-warning, r=JonathanBrouwer Revert doc attribute parsing errors to future warnings Part of #151865 (hopefully fixes it). r? @JonathanBrouwer
2 parents 930ecbc + c910511 commit d156d07

51 files changed

Lines changed: 622 additions & 340 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

compiler/rustc_attr_parsing/src/attributes/doc.rs

Lines changed: 83 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,42 @@ fn check_attr_crate_level<S: Stage>(cx: &mut AcceptContext<'_, '_, S>, span: Spa
7070
true
7171
}
7272

73+
// FIXME: To be removed once merged and replace with `cx.expected_name_value(span, _name)`.
74+
fn expected_name_value<S: Stage>(
75+
cx: &mut AcceptContext<'_, '_, S>,
76+
span: Span,
77+
_name: Option<Symbol>,
78+
) {
79+
cx.emit_lint(
80+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
81+
AttributeLintKind::ExpectedNameValue,
82+
span,
83+
);
84+
}
85+
86+
// FIXME: remove this method once merged and use `cx.expected_no_args(span)` instead.
87+
fn expected_no_args<S: Stage>(cx: &mut AcceptContext<'_, '_, S>, span: Span) {
88+
cx.emit_lint(
89+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
90+
AttributeLintKind::ExpectedNoArgs,
91+
span,
92+
);
93+
}
94+
95+
// FIXME: remove this method once merged and use `cx.expected_no_args(span)` instead.
96+
// cx.expected_string_literal(span, _actual_literal);
97+
fn expected_string_literal<S: Stage>(
98+
cx: &mut AcceptContext<'_, '_, S>,
99+
span: Span,
100+
_actual_literal: Option<&MetaItemLit>,
101+
) {
102+
cx.emit_lint(
103+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
104+
AttributeLintKind::MalformedDoc,
105+
span,
106+
);
107+
}
108+
73109
fn parse_keyword_and_attribute<S: Stage>(
74110
cx: &mut AcceptContext<'_, '_, S>,
75111
path: &OwnedPathParser,
@@ -78,12 +114,12 @@ fn parse_keyword_and_attribute<S: Stage>(
78114
attr_name: Symbol,
79115
) {
80116
let Some(nv) = args.name_value() else {
81-
cx.expected_name_value(args.span().unwrap_or(path.span()), path.word_sym());
117+
expected_name_value(cx, args.span().unwrap_or(path.span()), path.word_sym());
82118
return;
83119
};
84120

85121
let Some(value) = nv.value_as_str() else {
86-
cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
122+
expected_string_literal(cx, nv.value_span, Some(nv.value_as_lit()));
87123
return;
88124
};
89125

@@ -127,12 +163,21 @@ impl DocParser {
127163
match path.word_sym() {
128164
Some(sym::no_crate_inject) => {
129165
if let Err(span) = args.no_args() {
130-
cx.expected_no_args(span);
166+
expected_no_args(cx, span);
131167
return;
132168
}
133169

134-
if self.attribute.no_crate_inject.is_some() {
135-
cx.duplicate_key(path.span(), sym::no_crate_inject);
170+
if let Some(used_span) = self.attribute.no_crate_inject {
171+
let unused_span = path.span();
172+
cx.emit_lint(
173+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
174+
AttributeLintKind::UnusedDuplicate {
175+
this: unused_span,
176+
other: used_span,
177+
warning: true,
178+
},
179+
unused_span,
180+
);
136181
return;
137182
}
138183

@@ -144,7 +189,14 @@ impl DocParser {
144189
}
145190
Some(sym::attr) => {
146191
let Some(list) = args.list() else {
147-
cx.expected_list(cx.attr_span, args);
192+
// FIXME: remove this method once merged and uncomment the line below instead.
193+
// cx.expected_list(cx.attr_span, args);
194+
let span = cx.attr_span;
195+
cx.emit_lint(
196+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
197+
AttributeLintKind::MalformedDoc,
198+
span,
199+
);
148200
return;
149201
};
150202

@@ -246,7 +298,7 @@ impl DocParser {
246298
inline: DocInline,
247299
) {
248300
if let Err(span) = args.no_args() {
249-
cx.expected_no_args(span);
301+
expected_no_args(cx, span);
250302
return;
251303
}
252304

@@ -328,7 +380,14 @@ impl DocParser {
328380
match sub_item.args() {
329381
a @ (ArgParser::NoArgs | ArgParser::NameValue(_)) => {
330382
let Some(name) = sub_item.path().word_sym() else {
331-
cx.expected_identifier(sub_item.path().span());
383+
// FIXME: remove this method once merged and uncomment the line
384+
// below instead.
385+
// cx.expected_identifier(sub_item.path().span());
386+
cx.emit_lint(
387+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
388+
AttributeLintKind::MalformedDoc,
389+
sub_item.path().span(),
390+
);
332391
continue;
333392
};
334393
if let Ok(CfgEntry::NameValue { name, value, .. }) =
@@ -391,7 +450,7 @@ impl DocParser {
391450
macro_rules! no_args {
392451
($ident: ident) => {{
393452
if let Err(span) = args.no_args() {
394-
cx.expected_no_args(span);
453+
expected_no_args(cx, span);
395454
return;
396455
}
397456

@@ -410,7 +469,7 @@ impl DocParser {
410469
macro_rules! no_args_and_not_crate_level {
411470
($ident: ident) => {{
412471
if let Err(span) = args.no_args() {
413-
cx.expected_no_args(span);
472+
expected_no_args(cx, span);
414473
return;
415474
}
416475
let span = path.span();
@@ -423,7 +482,7 @@ impl DocParser {
423482
macro_rules! no_args_and_crate_level {
424483
($ident: ident) => {{
425484
if let Err(span) = args.no_args() {
426-
cx.expected_no_args(span);
485+
expected_no_args(cx, span);
427486
return;
428487
}
429488
let span = path.span();
@@ -436,12 +495,12 @@ impl DocParser {
436495
macro_rules! string_arg_and_crate_level {
437496
($ident: ident) => {{
438497
let Some(nv) = args.name_value() else {
439-
cx.expected_name_value(args.span().unwrap_or(path.span()), path.word_sym());
498+
expected_name_value(cx, args.span().unwrap_or(path.span()), path.word_sym());
440499
return;
441500
};
442501

443502
let Some(s) = nv.value_as_str() else {
444-
cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
503+
expected_string_literal(cx, nv.value_span, Some(nv.value_as_lit()));
445504
return;
446505
};
447506

@@ -512,7 +571,14 @@ impl DocParser {
512571
self.parse_single_test_doc_attr_item(cx, mip);
513572
}
514573
MetaItemOrLitParser::Lit(lit) => {
515-
cx.unexpected_literal(lit.span);
574+
// FIXME: remove this method once merged and uncomment the line
575+
// below instead.
576+
// cx.unexpected_literal(lit.span);
577+
cx.emit_lint(
578+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
579+
AttributeLintKind::MalformedDoc,
580+
lit.span,
581+
);
516582
}
517583
}
518584
}
@@ -582,7 +648,7 @@ impl DocParser {
582648
let suggestions = cx.suggestions();
583649
let span = cx.attr_span;
584650
cx.emit_lint(
585-
rustc_session::lint::builtin::ILL_FORMED_ATTRIBUTE_INPUT,
651+
rustc_session::lint::builtin::INVALID_DOC_ATTRIBUTES,
586652
AttributeLintKind::IllFormedAttributeInput { suggestions, docs: None },
587653
span,
588654
);
@@ -595,14 +661,14 @@ impl DocParser {
595661
self.parse_single_doc_attr_item(cx, mip);
596662
}
597663
MetaItemOrLitParser::Lit(lit) => {
598-
cx.expected_name_value(lit.span, None);
664+
expected_name_value(cx, lit.span, None);
599665
}
600666
}
601667
}
602668
}
603669
ArgParser::NameValue(nv) => {
604670
if nv.value_as_str().is_none() {
605-
cx.expected_string_literal(nv.value_span, Some(nv.value_as_lit()));
671+
expected_string_literal(cx, nv.value_span, Some(nv.value_as_lit()));
606672
} else {
607673
unreachable!(
608674
"Should have been handled at the same time as sugar-syntaxed doc comments"

compiler/rustc_lint/messages.ftl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,14 @@ lint_expectation = this lint expectation is unfulfilled
326326
.note = the `unfulfilled_lint_expectations` lint can't be expected and will always produce this message
327327
.rationale = {$rationale}
328328
329+
lint_expected_name_value =
330+
expected this to be of the form `... = "..."`
331+
.warn = {-lint_previously_accepted}
332+
333+
lint_expected_no_args =
334+
didn't expect any arguments here
335+
.warn = {-lint_previously_accepted}
336+
329337
lint_for_loops_over_fallibles =
330338
for loop over {$article} `{$ref_prefix}{$ty}`. This is more readably written as an `if let` statement
331339
.suggestion = consider using `if let` to clear intent
@@ -558,6 +566,10 @@ lint_macro_expr_fragment_specifier_2024_migration =
558566
559567
lint_malformed_attribute = malformed lint attribute input
560568
569+
lint_malformed_doc =
570+
malformed `doc` attribute input
571+
.warn = {-lint_previously_accepted}
572+
561573
lint_map_unit_fn = `Iterator::map` call that discard the iterator's values
562574
.note = `Iterator::map`, like many of the methods on `Iterator`, gets executed lazily, meaning that its effects won't be visible until it is iterated
563575
.function_label = this function returns `()`, which is likely not what you wanted

compiler/rustc_lint/src/early/diagnostics.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,5 +428,11 @@ pub fn decorate_attribute_lint(
428428
sugg: suggested.map(|s| lints::UnknownCrateTypesSuggestion { span, snippet: s }),
429429
}
430430
.decorate_lint(diag),
431+
432+
&AttributeLintKind::MalformedDoc => lints::MalformedDoc.decorate_lint(diag),
433+
434+
&AttributeLintKind::ExpectedNoArgs => lints::ExpectedNoArgs.decorate_lint(diag),
435+
436+
&AttributeLintKind::ExpectedNameValue => lints::ExpectedNameValue.decorate_lint(diag),
431437
}
432438
}

compiler/rustc_lint/src/lints.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3185,6 +3185,21 @@ pub(crate) struct UnusedDuplicate {
31853185
pub warning: bool,
31863186
}
31873187

3188+
#[derive(LintDiagnostic)]
3189+
#[diag(lint_malformed_doc)]
3190+
#[warning]
3191+
pub(crate) struct MalformedDoc;
3192+
3193+
#[derive(LintDiagnostic)]
3194+
#[diag(lint_expected_no_args)]
3195+
#[warning]
3196+
pub(crate) struct ExpectedNoArgs;
3197+
3198+
#[derive(LintDiagnostic)]
3199+
#[diag(lint_expected_name_value)]
3200+
#[warning]
3201+
pub(crate) struct ExpectedNameValue;
3202+
31883203
#[derive(LintDiagnostic)]
31893204
#[diag(lint_unsafe_attr_outside_unsafe)]
31903205
pub(crate) struct UnsafeAttrOutsideUnsafeLint {

compiler/rustc_lint_defs/src/builtin.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3458,7 +3458,7 @@ declare_lint! {
34583458
/// but this lint was introduced to avoid breaking any existing
34593459
/// crates which included them.
34603460
pub INVALID_DOC_ATTRIBUTES,
3461-
Deny,
3461+
Warn,
34623462
"detects invalid `#[doc(...)]` attributes",
34633463
}
34643464

compiler/rustc_lint_defs/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,9 @@ pub enum AttributeLintKind {
826826
span: Span,
827827
suggested: Option<Symbol>,
828828
},
829+
MalformedDoc,
830+
ExpectedNoArgs,
831+
ExpectedNameValue,
829832
}
830833

831834
pub type RegisteredTools = FxIndexSet<Ident>;
Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
// regression test for https://github.com/rust-lang/rust/issues/149187
2+
#![deny(invalid_doc_attributes)]
23

34
#![doc(html_favicon_url)]
4-
//~^ ERROR: malformed `doc` attribute
5-
//~| NOTE expected this to be of the form `html_favicon_url = "..."`
5+
//~^ ERROR
6+
//~| WARN
67
#![doc(html_logo_url)]
7-
//~^ ERROR: malformed `doc` attribute
8-
//~| NOTE expected this to be of the form `html_logo_url = "..."`
8+
//~^ ERROR
9+
//~| WARN
910
#![doc(html_playground_url)]
10-
//~^ ERROR: malformed `doc` attribute
11-
//~| NOTE expected this to be of the form `html_playground_url = "..."`
11+
//~^ ERROR
12+
//~| WARN
1213
#![doc(issue_tracker_base_url)]
13-
//~^ ERROR: malformed `doc` attribute
14-
//~| NOTE expected this to be of the form `issue_tracker_base_url = "..."`
14+
//~^ ERROR
15+
//~| WARN
1516
#![doc(html_favicon_url = 1)]
16-
//~^ ERROR malformed `doc` attribute
17-
//~| NOTE expected a string literal
17+
//~^ ERROR
18+
//~| WARN
1819
#![doc(html_logo_url = 2)]
19-
//~^ ERROR malformed `doc` attribute
20-
//~| NOTE expected a string literal
20+
//~^ ERROR
21+
//~| WARN
2122
#![doc(html_playground_url = 3)]
22-
//~^ ERROR malformed `doc` attribute
23-
//~| NOTE expected a string literal
23+
//~^ ERROR
24+
//~| WARN
2425
#![doc(issue_tracker_base_url = 4)]
25-
//~^ ERROR malformed `doc` attribute
26-
//~| NOTE expected a string literal
26+
//~^ ERROR
27+
//~| WARN
2728
#![doc(html_no_source = "asdf")]
28-
//~^ ERROR malformed `doc` attribute
29-
//~| NOTE didn't expect any arguments here
29+
//~^ ERROR
30+
//~| WARN

0 commit comments

Comments
 (0)