Skip to content

Commit 3d2e019

Browse files
authored
Unrolled build for #145243
Rollup merge of #145243 - jdonszelmann:inner-attr-errors, r=petrochenkov take attr style into account in diagnostics when the original attribute was specified as an inner attribute, the suggestion will now match that attribute style
2 parents b96868f + 70e26c1 commit 3d2e019

File tree

13 files changed

+53
-37
lines changed

13 files changed

+53
-37
lines changed

compiler/rustc_attr_parsing/src/attributes/inline.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ impl<S: Stage> SingleAttributeParser<S> for InlineParser {
6262
}
6363
}
6464
ArgParser::NameValue(_) => {
65-
let suggestions =
66-
<Self as SingleAttributeParser<S>>::TEMPLATE.suggestions(false, "inline");
65+
let suggestions = <Self as SingleAttributeParser<S>>::TEMPLATE
66+
.suggestions(cx.attr_style, "inline");
6767
let span = cx.attr_span;
6868
cx.emit_lint(AttributeLintKind::IllFormedAttributeInput { suggestions }, span);
6969
return None;

compiler/rustc_attr_parsing/src/attributes/macro_attrs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ impl<S: Stage> AttributeParser<S> for MacroUseParser {
107107
}
108108
}
109109
ArgParser::NameValue(_) => {
110-
let suggestions = MACRO_USE_TEMPLATE.suggestions(false, sym::macro_use);
110+
let suggestions = MACRO_USE_TEMPLATE.suggestions(cx.attr_style, sym::macro_use);
111111
cx.emit_err(session_diagnostics::IllFormedAttributeInputLint {
112112
num_suggestions: suggestions.len(),
113113
suggestions: DiagArgValue::StrListSepByAnd(

compiler/rustc_attr_parsing/src/attributes/must_use.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ impl<S: Stage> SingleAttributeParser<S> for MustUseParser {
3535
Some(value_str)
3636
}
3737
ArgParser::List(_) => {
38-
let suggestions =
39-
<Self as SingleAttributeParser<S>>::TEMPLATE.suggestions(false, "must_use");
38+
let suggestions = <Self as SingleAttributeParser<S>>::TEMPLATE
39+
.suggestions(cx.attr_style, "must_use");
4040
cx.emit_err(session_diagnostics::IllFormedAttributeInputLint {
4141
num_suggestions: suggestions.len(),
4242
suggestions: DiagArgValue::StrListSepByAnd(

compiler/rustc_attr_parsing/src/attributes/test_attrs.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ impl<S: Stage> SingleAttributeParser<S> for IgnoreParser {
2929
ArgParser::NameValue(name_value) => {
3030
let Some(str_value) = name_value.value_as_str() else {
3131
let suggestions = <Self as SingleAttributeParser<S>>::TEMPLATE
32-
.suggestions(false, "ignore");
32+
.suggestions(cx.attr_style, "ignore");
3333
let span = cx.attr_span;
3434
cx.emit_lint(
3535
AttributeLintKind::IllFormedAttributeInput { suggestions },
@@ -40,8 +40,8 @@ impl<S: Stage> SingleAttributeParser<S> for IgnoreParser {
4040
Some(str_value)
4141
}
4242
ArgParser::List(_) => {
43-
let suggestions =
44-
<Self as SingleAttributeParser<S>>::TEMPLATE.suggestions(false, "ignore");
43+
let suggestions = <Self as SingleAttributeParser<S>>::TEMPLATE
44+
.suggestions(cx.attr_style, "ignore");
4545
let span = cx.attr_span;
4646
cx.emit_lint(AttributeLintKind::IllFormedAttributeInput { suggestions }, span);
4747
return None;

compiler/rustc_attr_parsing/src/context.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::sync::LazyLock;
55

66
use itertools::Itertools;
77
use private::Sealed;
8-
use rustc_ast::{self as ast, LitKind, MetaItemLit, NodeId};
8+
use rustc_ast::{self as ast, AttrStyle, LitKind, MetaItemLit, NodeId};
99
use rustc_errors::{DiagCtxtHandle, Diagnostic};
1010
use rustc_feature::{AttributeTemplate, Features};
1111
use rustc_hir::attrs::AttributeKind;
@@ -315,6 +315,7 @@ pub struct AcceptContext<'f, 'sess, S: Stage> {
315315
/// The span of the attribute currently being parsed
316316
pub(crate) attr_span: Span,
317317

318+
pub(crate) attr_style: AttrStyle,
318319
/// The expected structure of the attribute.
319320
///
320321
/// Used in reporting errors to give a hint to users what the attribute *should* look like.
@@ -396,6 +397,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
396397
i.kind.is_bytestr().then(|| self.sess().source_map().start_point(i.span))
397398
}),
398399
},
400+
attr_style: self.attr_style,
399401
})
400402
}
401403

@@ -406,6 +408,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
406408
template: self.template.clone(),
407409
attribute: self.attr_path.clone(),
408410
reason: AttributeParseErrorReason::ExpectedIntegerLiteral,
411+
attr_style: self.attr_style,
409412
})
410413
}
411414

@@ -416,6 +419,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
416419
template: self.template.clone(),
417420
attribute: self.attr_path.clone(),
418421
reason: AttributeParseErrorReason::ExpectedList,
422+
attr_style: self.attr_style,
419423
})
420424
}
421425

@@ -426,6 +430,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
426430
template: self.template.clone(),
427431
attribute: self.attr_path.clone(),
428432
reason: AttributeParseErrorReason::ExpectedNoArgs,
433+
attr_style: self.attr_style,
429434
})
430435
}
431436

@@ -437,6 +442,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
437442
template: self.template.clone(),
438443
attribute: self.attr_path.clone(),
439444
reason: AttributeParseErrorReason::ExpectedIdentifier,
445+
attr_style: self.attr_style,
440446
})
441447
}
442448

@@ -449,6 +455,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
449455
template: self.template.clone(),
450456
attribute: self.attr_path.clone(),
451457
reason: AttributeParseErrorReason::ExpectedNameValue(name),
458+
attr_style: self.attr_style,
452459
})
453460
}
454461

@@ -460,6 +467,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
460467
template: self.template.clone(),
461468
attribute: self.attr_path.clone(),
462469
reason: AttributeParseErrorReason::DuplicateKey(key),
470+
attr_style: self.attr_style,
463471
})
464472
}
465473

@@ -472,6 +480,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
472480
template: self.template.clone(),
473481
attribute: self.attr_path.clone(),
474482
reason: AttributeParseErrorReason::UnexpectedLiteral,
483+
attr_style: self.attr_style,
475484
})
476485
}
477486

@@ -482,6 +491,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
482491
template: self.template.clone(),
483492
attribute: self.attr_path.clone(),
484493
reason: AttributeParseErrorReason::ExpectedSingleArgument,
494+
attr_style: self.attr_style,
485495
})
486496
}
487497

@@ -492,6 +502,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
492502
template: self.template.clone(),
493503
attribute: self.attr_path.clone(),
494504
reason: AttributeParseErrorReason::ExpectedAtLeastOneArgument,
505+
attr_style: self.attr_style,
495506
})
496507
}
497508

@@ -510,6 +521,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
510521
strings: false,
511522
list: false,
512523
},
524+
attr_style: self.attr_style,
513525
})
514526
}
515527

@@ -528,6 +540,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
528540
strings: false,
529541
list: true,
530542
},
543+
attr_style: self.attr_style,
531544
})
532545
}
533546

@@ -546,6 +559,7 @@ impl<'f, 'sess: 'f, S: Stage> AcceptContext<'f, 'sess, S> {
546559
strings: true,
547560
list: false,
548561
},
562+
attr_style: self.attr_style,
549563
})
550564
}
551565

@@ -804,6 +818,7 @@ impl<'sess> AttributeParser<'sess, Early> {
804818
},
805819
},
806820
attr_span: attr.span,
821+
attr_style: attr.style,
807822
template,
808823
attr_path: path.get_attribute_path(),
809824
};
@@ -914,6 +929,7 @@ impl<'sess, S: Stage> AttributeParser<'sess, S> {
914929
emit_lint: &mut emit_lint,
915930
},
916931
attr_span: lower_span(attr.span),
932+
attr_style: attr.style,
917933
template: &accept.template,
918934
attr_path: path.get_attribute_path(),
919935
};

compiler/rustc_attr_parsing/src/session_diagnostics.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::num::IntErrorKind;
22

3-
use rustc_ast as ast;
3+
use rustc_ast::{self as ast, AttrStyle};
44
use rustc_errors::codes::*;
55
use rustc_errors::{
66
Applicability, Diag, DiagArgValue, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level,
@@ -579,6 +579,7 @@ pub(crate) enum AttributeParseErrorReason {
579579
pub(crate) struct AttributeParseError {
580580
pub(crate) span: Span,
581581
pub(crate) attr_span: Span,
582+
pub(crate) attr_style: AttrStyle,
582583
pub(crate) template: AttributeTemplate,
583584
pub(crate) attribute: AttrPath,
584585
pub(crate) reason: AttributeParseErrorReason,
@@ -717,7 +718,8 @@ impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for AttributeParseError {
717718
if let Some(link) = self.template.docs {
718719
diag.note(format!("for more information, visit <{link}>"));
719720
}
720-
let suggestions = self.template.suggestions(false, &name);
721+
let suggestions = self.template.suggestions(self.attr_style, &name);
722+
721723
diag.span_suggestions(
722724
self.attr_span,
723725
if suggestions.len() == 1 {

compiler/rustc_feature/src/builtin_attrs.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use AttributeDuplicates::*;
66
use AttributeGate::*;
77
use AttributeType::*;
88
use rustc_data_structures::fx::FxHashMap;
9+
use rustc_hir::AttrStyle;
910
use rustc_hir::attrs::EncodeCrossCrate;
1011
use rustc_span::edition::Edition;
1112
use rustc_span::{Symbol, sym};
@@ -132,9 +133,12 @@ pub struct AttributeTemplate {
132133
}
133134

134135
impl AttributeTemplate {
135-
pub fn suggestions(&self, inner: bool, name: impl std::fmt::Display) -> Vec<String> {
136+
pub fn suggestions(&self, style: AttrStyle, name: impl std::fmt::Display) -> Vec<String> {
136137
let mut suggestions = vec![];
137-
let inner = if inner { "!" } else { "" };
138+
let inner = match style {
139+
AttrStyle::Outer => "",
140+
AttrStyle::Inner => "!",
141+
};
138142
if self.word {
139143
suggestions.push(format!("#{inner}[{name}]"));
140144
}

tests/ui/attributes/lint_on_root.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// NOTE: this used to panic in debug builds (by a sanity assertion)
22
// and not emit any lint on release builds. See https://github.com/rust-lang/rust/issues/142891.
33
#![inline = ""]
4-
//~^ ERROR: valid forms for the attribute are `#[inline(always)]`, `#[inline(never)]`, and `#[inline]` [ill_formed_attribute_input]
4+
//~^ ERROR: valid forms for the attribute are `#![inline(always)]`, `#![inline(never)]`, and `#![inline]` [ill_formed_attribute_input]
55
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
66
//~| ERROR attribute cannot be used on
77

tests/ui/attributes/lint_on_root.stderr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ LL | #![inline = ""]
66
|
77
= help: `#[inline]` can only be applied to functions
88

9-
error: valid forms for the attribute are `#[inline(always)]`, `#[inline(never)]`, and `#[inline]`
9+
error: valid forms for the attribute are `#![inline(always)]`, `#![inline(never)]`, and `#![inline]`
1010
--> $DIR/lint_on_root.rs:3:1
1111
|
1212
LL | #![inline = ""]
@@ -19,7 +19,7 @@ LL | #![inline = ""]
1919
error: aborting due to 2 previous errors
2020

2121
Future incompatibility report: Future breakage diagnostic:
22-
error: valid forms for the attribute are `#[inline(always)]`, `#[inline(never)]`, and `#[inline]`
22+
error: valid forms for the attribute are `#![inline(always)]`, `#![inline(never)]`, and `#![inline]`
2323
--> $DIR/lint_on_root.rs:3:1
2424
|
2525
LL | #![inline = ""]

tests/ui/attributes/malformed-reprs.stderr

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,14 @@ LL | #![repr]
77
= note: for more information, visit <https://doc.rust-lang.org/reference/type-layout.html#representations>
88
help: try changing it to one of the following valid forms of the attribute
99
|
10-
LL - #![repr]
11-
LL + #[repr(<integer type>)]
12-
|
13-
LL - #![repr]
14-
LL + #[repr(C)]
15-
|
16-
LL - #![repr]
17-
LL + #[repr(Rust)]
18-
|
19-
LL - #![repr]
20-
LL + #[repr(align(...))]
21-
|
10+
LL | #![repr(<integer type>)]
11+
| ++++++++++++++++
12+
LL | #![repr(C)]
13+
| +++
14+
LL | #![repr(Rust)]
15+
| ++++++
16+
LL | #![repr(align(...))]
17+
| ++++++++++++
2218
= and 2 other candidates
2319

2420
error[E0589]: invalid `repr(align)` attribute: not a power of two

0 commit comments

Comments
 (0)