don't suggest turning crate-level attributes into outer style
This commit is contained in:
parent
70591dc15d
commit
22aa104bce
@ -2898,6 +2898,17 @@ pub struct AttrItem {
|
|||||||
pub tokens: Option<LazyAttrTokenStream>,
|
pub tokens: Option<LazyAttrTokenStream>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl AttrItem {
|
||||||
|
pub fn is_valid_for_outer_style(&self) -> bool {
|
||||||
|
self.path == sym::cfg_attr
|
||||||
|
|| self.path == sym::cfg
|
||||||
|
|| self.path == sym::forbid
|
||||||
|
|| self.path == sym::warn
|
||||||
|
|| self.path == sym::allow
|
||||||
|
|| self.path == sym::deny
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// `TraitRef`s appear in impls.
|
/// `TraitRef`s appear in impls.
|
||||||
///
|
///
|
||||||
/// Resolution maps each `TraitRef`'s `ref_id` to its defining trait; that's all
|
/// Resolution maps each `TraitRef`'s `ref_id` to its defining trait; that's all
|
||||||
|
@ -67,6 +67,7 @@ pub(super) fn parse_outer_attributes(&mut self) -> PResult<'a, AttrWrapper> {
|
|||||||
token::CommentKind::Line => OuterAttributeType::DocComment,
|
token::CommentKind::Line => OuterAttributeType::DocComment,
|
||||||
token::CommentKind::Block => OuterAttributeType::DocBlockComment,
|
token::CommentKind::Block => OuterAttributeType::DocBlockComment,
|
||||||
},
|
},
|
||||||
|
true,
|
||||||
) {
|
) {
|
||||||
err.note(fluent::parse_note);
|
err.note(fluent::parse_note);
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
@ -130,7 +131,11 @@ pub fn parse_attribute(
|
|||||||
|
|
||||||
// Emit error if inner attribute is encountered and forbidden.
|
// Emit error if inner attribute is encountered and forbidden.
|
||||||
if style == ast::AttrStyle::Inner {
|
if style == ast::AttrStyle::Inner {
|
||||||
this.error_on_forbidden_inner_attr(attr_sp, inner_parse_policy);
|
this.error_on_forbidden_inner_attr(
|
||||||
|
attr_sp,
|
||||||
|
inner_parse_policy,
|
||||||
|
item.is_valid_for_outer_style(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(attr::mk_attr_from_item(&self.psess.attr_id_generator, item, None, style, attr_sp))
|
Ok(attr::mk_attr_from_item(&self.psess.attr_id_generator, item, None, style, attr_sp))
|
||||||
@ -142,6 +147,7 @@ fn annotate_following_item_if_applicable(
|
|||||||
err: &mut Diag<'_>,
|
err: &mut Diag<'_>,
|
||||||
span: Span,
|
span: Span,
|
||||||
attr_type: OuterAttributeType,
|
attr_type: OuterAttributeType,
|
||||||
|
suggest_to_outer: bool,
|
||||||
) -> Option<Span> {
|
) -> Option<Span> {
|
||||||
let mut snapshot = self.create_snapshot_for_diagnostic();
|
let mut snapshot = self.create_snapshot_for_diagnostic();
|
||||||
let lo = span.lo()
|
let lo = span.lo()
|
||||||
@ -176,16 +182,18 @@ fn annotate_following_item_if_applicable(
|
|||||||
// FIXME(#100717)
|
// FIXME(#100717)
|
||||||
err.arg("item", item.kind.descr());
|
err.arg("item", item.kind.descr());
|
||||||
err.span_label(item.span, fluent::parse_label_does_not_annotate_this);
|
err.span_label(item.span, fluent::parse_label_does_not_annotate_this);
|
||||||
err.span_suggestion_verbose(
|
if suggest_to_outer {
|
||||||
replacement_span,
|
err.span_suggestion_verbose(
|
||||||
fluent::parse_sugg_change_inner_to_outer,
|
replacement_span,
|
||||||
match attr_type {
|
fluent::parse_sugg_change_inner_to_outer,
|
||||||
OuterAttributeType::Attribute => "",
|
match attr_type {
|
||||||
OuterAttributeType::DocBlockComment => "*",
|
OuterAttributeType::Attribute => "",
|
||||||
OuterAttributeType::DocComment => "/",
|
OuterAttributeType::DocBlockComment => "*",
|
||||||
},
|
OuterAttributeType::DocComment => "/",
|
||||||
rustc_errors::Applicability::MachineApplicable,
|
},
|
||||||
);
|
rustc_errors::Applicability::MachineApplicable,
|
||||||
|
);
|
||||||
|
}
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
Err(item_err) => {
|
Err(item_err) => {
|
||||||
@ -196,7 +204,12 @@ fn annotate_following_item_if_applicable(
|
|||||||
Some(replacement_span)
|
Some(replacement_span)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn error_on_forbidden_inner_attr(&self, attr_sp: Span, policy: InnerAttrPolicy) {
|
pub(super) fn error_on_forbidden_inner_attr(
|
||||||
|
&self,
|
||||||
|
attr_sp: Span,
|
||||||
|
policy: InnerAttrPolicy,
|
||||||
|
suggest_to_outer: bool,
|
||||||
|
) {
|
||||||
if let InnerAttrPolicy::Forbidden(reason) = policy {
|
if let InnerAttrPolicy::Forbidden(reason) = policy {
|
||||||
let mut diag = match reason.as_ref().copied() {
|
let mut diag = match reason.as_ref().copied() {
|
||||||
Some(InnerAttrForbiddenReason::AfterOuterDocComment { prev_doc_comment_span }) => {
|
Some(InnerAttrForbiddenReason::AfterOuterDocComment { prev_doc_comment_span }) => {
|
||||||
@ -230,6 +243,7 @@ pub(super) fn error_on_forbidden_inner_attr(&self, attr_sp: Span, policy: InnerA
|
|||||||
&mut diag,
|
&mut diag,
|
||||||
attr_sp,
|
attr_sp,
|
||||||
OuterAttributeType::Attribute,
|
OuterAttributeType::Attribute,
|
||||||
|
suggest_to_outer,
|
||||||
)
|
)
|
||||||
.is_some()
|
.is_some()
|
||||||
{
|
{
|
||||||
|
@ -439,11 +439,16 @@ fn parse_initializer(&mut self, eq_optional: bool) -> PResult<'a, Option<P<Expr>
|
|||||||
pub fn parse_block(&mut self) -> PResult<'a, P<Block>> {
|
pub fn parse_block(&mut self) -> PResult<'a, P<Block>> {
|
||||||
let (attrs, block) = self.parse_inner_attrs_and_block()?;
|
let (attrs, block) = self.parse_inner_attrs_and_block()?;
|
||||||
if let [.., last] = &*attrs {
|
if let [.., last] = &*attrs {
|
||||||
|
let suggest_to_outer = match &last.kind {
|
||||||
|
ast::AttrKind::Normal(attr) => attr.item.is_valid_for_outer_style(),
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
self.error_on_forbidden_inner_attr(
|
self.error_on_forbidden_inner_attr(
|
||||||
last.span,
|
last.span,
|
||||||
super::attr::InnerAttrPolicy::Forbidden(Some(
|
super::attr::InnerAttrPolicy::Forbidden(Some(
|
||||||
InnerAttrForbiddenReason::InCodeBlock,
|
InnerAttrForbiddenReason::InCodeBlock,
|
||||||
)),
|
)),
|
||||||
|
suggest_to_outer,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Ok(block)
|
Ok(block)
|
||||||
|
@ -8,11 +8,6 @@ LL | fn main() {}
|
|||||||
| ------------ the inner attribute doesn't annotate this function
|
| ------------ the inner attribute doesn't annotate this function
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the function, change the attribute from inner to outer style
|
|
||||||
|
|
|
||||||
LL - reuse a as b { #![rustc_dummy] self }
|
|
||||||
LL + reuse a as b { #[rustc_dummy] self }
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -359,11 +359,6 @@ LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!(); }
|
|||||||
| previous outer attribute
|
| previous outer attribute
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the item macro invocation, change the attribute from inner to outer style
|
|
||||||
|
|
|
||||||
LL - #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!(); }
|
|
||||||
LL + #[cfg(FALSE)] fn s() { #[attr] #[attr] foo!(); }
|
|
||||||
|
|
|
||||||
|
|
||||||
error: an inner attribute is not permitted following an outer attribute
|
error: an inner attribute is not permitted following an outer attribute
|
||||||
--> $DIR/attr-stmt-expr-attr-bad.rs:77:32
|
--> $DIR/attr-stmt-expr-attr-bad.rs:77:32
|
||||||
@ -375,11 +370,6 @@ LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo![]; }
|
|||||||
| previous outer attribute
|
| previous outer attribute
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the item macro invocation, change the attribute from inner to outer style
|
|
||||||
|
|
|
||||||
LL - #[cfg(FALSE)] fn s() { #[attr] #![attr] foo![]; }
|
|
||||||
LL + #[cfg(FALSE)] fn s() { #[attr] #[attr] foo![]; }
|
|
||||||
|
|
|
||||||
|
|
||||||
error: an inner attribute is not permitted following an outer attribute
|
error: an inner attribute is not permitted following an outer attribute
|
||||||
--> $DIR/attr-stmt-expr-attr-bad.rs:79:32
|
--> $DIR/attr-stmt-expr-attr-bad.rs:79:32
|
||||||
@ -391,11 +381,6 @@ LL | #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!{}; }
|
|||||||
| previous outer attribute
|
| previous outer attribute
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the item macro invocation, change the attribute from inner to outer style
|
|
||||||
|
|
|
||||||
LL - #[cfg(FALSE)] fn s() { #[attr] #![attr] foo!{}; }
|
|
||||||
LL + #[cfg(FALSE)] fn s() { #[attr] #[attr] foo!{}; }
|
|
||||||
|
|
|
||||||
|
|
||||||
error[E0586]: inclusive range with no end
|
error[E0586]: inclusive range with no end
|
||||||
--> $DIR/attr-stmt-expr-attr-bad.rs:85:35
|
--> $DIR/attr-stmt-expr-attr-bad.rs:85:35
|
||||||
|
@ -7,11 +7,6 @@ LL | fn foo() {}
|
|||||||
| ----------- the inner attribute doesn't annotate this function
|
| ----------- the inner attribute doesn't annotate this function
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the function, change the attribute from inner to outer style
|
|
||||||
|
|
|
||||||
LL - #![lang = "foo"]
|
|
||||||
LL + #[lang = "foo"]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -13,11 +13,6 @@ LL | fn main() {}
|
|||||||
| ------------ the inner attribute doesn't annotate this function
|
| ------------ the inner attribute doesn't annotate this function
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the function, change the attribute from inner to outer style
|
|
||||||
|
|
|
||||||
LL - #![recursion_limit="100"]
|
|
||||||
LL + #[recursion_limit="100"]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -10,11 +10,6 @@ LL | fn main() {}
|
|||||||
| ------------ the inner attribute doesn't annotate this function
|
| ------------ the inner attribute doesn't annotate this function
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the function, change the attribute from inner to outer style
|
|
||||||
|
|
|
||||||
LL - #![recursion_limit="100"]
|
|
||||||
LL + #[recursion_limit="100"]
|
|
||||||
|
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
#![allow(dead_code)]
|
||||||
|
fn foo() {}
|
||||||
|
|
||||||
|
#![feature(iter_array_chunks)] //~ ERROR an inner attribute is not permitted in this context
|
||||||
|
fn bar() {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo();
|
||||||
|
bar();
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
error: an inner attribute is not permitted in this context
|
||||||
|
--> $DIR/isgg-invalid-outer-attttr-issue-127930.rs:4:1
|
||||||
|
|
|
||||||
|
LL | #![feature(iter_array_chunks)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
LL | fn bar() {}
|
||||||
|
| ----------- the inner attribute doesn't annotate this function
|
||||||
|
|
|
||||||
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
@ -6,7 +6,7 @@ fn foo() { }
|
|||||||
//~^ ERROR expected outer doc comment
|
//~^ ERROR expected outer doc comment
|
||||||
fn bar() { } //~ NOTE the inner doc comment doesn't annotate this function
|
fn bar() { } //~ NOTE the inner doc comment doesn't annotate this function
|
||||||
|
|
||||||
#[test] //~ ERROR an inner attribute is not permitted in this context
|
#[cfg(test)] //~ ERROR an inner attribute is not permitted in this context
|
||||||
fn baz() { } //~ NOTE the inner attribute doesn't annotate this function
|
fn baz() { } //~ NOTE the inner attribute doesn't annotate this function
|
||||||
//~^^ NOTE inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually
|
//~^^ NOTE inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ fn foo() { }
|
|||||||
//~^ ERROR expected outer doc comment
|
//~^ ERROR expected outer doc comment
|
||||||
fn bar() { } //~ NOTE the inner doc comment doesn't annotate this function
|
fn bar() { } //~ NOTE the inner doc comment doesn't annotate this function
|
||||||
|
|
||||||
#![test] //~ ERROR an inner attribute is not permitted in this context
|
#![cfg(test)] //~ ERROR an inner attribute is not permitted in this context
|
||||||
fn baz() { } //~ NOTE the inner attribute doesn't annotate this function
|
fn baz() { } //~ NOTE the inner attribute doesn't annotate this function
|
||||||
//~^^ NOTE inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually
|
//~^^ NOTE inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually
|
||||||
|
|
||||||
|
@ -15,16 +15,16 @@ LL | /// Misplaced comment...
|
|||||||
error: an inner attribute is not permitted in this context
|
error: an inner attribute is not permitted in this context
|
||||||
--> $DIR/issue-30318.rs:9:1
|
--> $DIR/issue-30318.rs:9:1
|
||||||
|
|
|
|
||||||
LL | #![test]
|
LL | #![cfg(test)]
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^^^^^^
|
||||||
LL | fn baz() { }
|
LL | fn baz() { }
|
||||||
| ------------ the inner attribute doesn't annotate this function
|
| ------------ the inner attribute doesn't annotate this function
|
||||||
|
|
|
|
||||||
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files
|
||||||
help: to annotate the function, change the attribute from inner to outer style
|
help: to annotate the function, change the attribute from inner to outer style
|
||||||
|
|
|
|
||||||
LL - #![test]
|
LL - #![cfg(test)]
|
||||||
LL + #[test]
|
LL + #[cfg(test)]
|
||||||
|
|
|
|
||||||
|
|
||||||
error[E0753]: expected outer doc comment
|
error[E0753]: expected outer doc comment
|
||||||
|
Loading…
Reference in New Issue
Block a user