Skip to content

Commit 6f22f61

Browse files
committed
Auto merge of #154273 - JonathanBrouwer:rollup-TJZsnIo, r=JonathanBrouwer
Rollup of 8 pull requests Successful merges: - #122668 (Add APIs for dealing with titlecase) - #153041 (Remove `ATTRIBUTE_ORDER`) - #153912 (Avoid prematurely choosing a glob import) - #154093 (const validity checking: do not recurse to references inside MaybeDangling) - #154257 (Revert eagerly normalize in generalize) - #154179 (tests/ui/async-await/gat-is-send-across-await.rs: New regression test) - #154224 (Remove more `BuiltinLintDiag` variants) - #154245 (Allow applying autodiff macros to trait functions.)
2 parents f66622c + a9b4849 commit 6f22f61

85 files changed

Lines changed: 1118 additions & 883 deletions

File tree

Some content is hidden

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

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,9 @@ use rustc_ast::*;
2727
use rustc_ast_pretty::pprust::{self, State};
2828
use rustc_attr_parsing::validate_attr;
2929
use rustc_data_structures::fx::FxIndexMap;
30-
use rustc_errors::{DiagCtxtHandle, LintBuffer};
30+
use rustc_errors::{DiagCtxtHandle, Diagnostic, LintBuffer};
3131
use rustc_feature::Features;
3232
use rustc_session::Session;
33-
use rustc_session::lint::BuiltinLintDiag;
3433
use rustc_session::lint::builtin::{
3534
DEPRECATED_WHERE_CLAUSE_LOCATION, MISSING_ABI, MISSING_UNSAFE_ON_EXTERN,
3635
PATTERNS_IN_FNS_WITHOUT_BODY, UNUSED_VISIBILITIES,
@@ -1424,7 +1423,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
14241423
UNUSED_VISIBILITIES,
14251424
item.id,
14261425
item.vis.span,
1427-
BuiltinLintDiag::UnusedVisibility(item.vis.span),
1426+
errors::UnusedVisibility { span: item.vis.span },
14281427
)
14291428
}
14301429

@@ -1731,14 +1730,19 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
17311730
Self::check_decl_no_pat(&sig.decl, |span, ident, mut_ident| {
17321731
if mut_ident && matches!(ctxt, FnCtxt::Assoc(_)) {
17331732
if let Some(ident) = ident {
1734-
self.lint_buffer.buffer_lint(
1733+
let is_foreign = matches!(ctxt, FnCtxt::Foreign);
1734+
self.lint_buffer.dyn_buffer_lint(
17351735
PATTERNS_IN_FNS_WITHOUT_BODY,
17361736
id,
17371737
span,
1738-
BuiltinLintDiag::PatternsInFnsWithoutBody {
1739-
span,
1740-
ident,
1741-
is_foreign: matches!(ctxt, FnCtxt::Foreign),
1738+
move |dcx, level| {
1739+
let sub = errors::PatternsInFnsWithoutBodySub { ident, span };
1740+
if is_foreign {
1741+
errors::PatternsInFnsWithoutBody::Foreign { sub }
1742+
} else {
1743+
errors::PatternsInFnsWithoutBody::Bodiless { sub }
1744+
}
1745+
.into_diag(dcx, level)
17421746
},
17431747
)
17441748
}
@@ -1828,11 +1832,26 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
18281832
Some((right, snippet))
18291833
}
18301834
};
1831-
self.lint_buffer.buffer_lint(
1835+
let left_sp = err.span;
1836+
self.lint_buffer.dyn_buffer_lint(
18321837
DEPRECATED_WHERE_CLAUSE_LOCATION,
18331838
item.id,
18341839
err.span,
1835-
BuiltinLintDiag::DeprecatedWhereclauseLocation(err.span, sugg),
1840+
move |dcx, level| {
1841+
let suggestion = match sugg {
1842+
Some((right_sp, sugg)) => {
1843+
errors::DeprecatedWhereClauseLocationSugg::MoveToEnd {
1844+
left: left_sp,
1845+
right: right_sp,
1846+
sugg,
1847+
}
1848+
}
1849+
None => {
1850+
errors::DeprecatedWhereClauseLocationSugg::RemoveWhere { span: left_sp }
1851+
}
1852+
};
1853+
errors::DeprecatedWhereClauseLocation { suggestion }.into_diag(dcx, level)
1854+
},
18361855
);
18371856
}
18381857

compiler/rustc_ast_passes/src/errors.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,3 +1150,72 @@ pub(crate) struct RequiresRustAbi {
11501150
#[label("not using the Rust ABI because of this")]
11511151
pub extern_abi_span: Span,
11521152
}
1153+
1154+
#[derive(Diagnostic)]
1155+
#[diag("visibility qualifiers have no effect on `const _` declarations")]
1156+
#[note("`const _` does not declare a name, so there is nothing for the qualifier to apply to")]
1157+
pub(crate) struct UnusedVisibility {
1158+
#[suggestion(
1159+
"remove the qualifier",
1160+
style = "short",
1161+
code = "",
1162+
applicability = "machine-applicable"
1163+
)]
1164+
pub span: Span,
1165+
}
1166+
1167+
#[derive(Subdiagnostic)]
1168+
#[suggestion(
1169+
"remove `mut` from the parameter",
1170+
code = "{ident}",
1171+
applicability = "machine-applicable"
1172+
)]
1173+
pub(crate) struct PatternsInFnsWithoutBodySub {
1174+
#[primary_span]
1175+
pub span: Span,
1176+
1177+
pub ident: Ident,
1178+
}
1179+
1180+
#[derive(Diagnostic)]
1181+
pub(crate) enum PatternsInFnsWithoutBody {
1182+
#[diag("patterns aren't allowed in foreign function declarations")]
1183+
Foreign {
1184+
#[subdiagnostic]
1185+
sub: PatternsInFnsWithoutBodySub,
1186+
},
1187+
#[diag("patterns aren't allowed in functions without bodies")]
1188+
Bodiless {
1189+
#[subdiagnostic]
1190+
sub: PatternsInFnsWithoutBodySub,
1191+
},
1192+
}
1193+
1194+
#[derive(Diagnostic)]
1195+
#[diag("where clause not allowed here")]
1196+
#[note("see issue #89122 <https://github.com/rust-lang/rust/issues/89122> for more information")]
1197+
pub(crate) struct DeprecatedWhereClauseLocation {
1198+
#[subdiagnostic]
1199+
pub suggestion: DeprecatedWhereClauseLocationSugg,
1200+
}
1201+
1202+
#[derive(Subdiagnostic)]
1203+
pub(crate) enum DeprecatedWhereClauseLocationSugg {
1204+
#[multipart_suggestion(
1205+
"move it to the end of the type declaration",
1206+
applicability = "machine-applicable"
1207+
)]
1208+
MoveToEnd {
1209+
#[suggestion_part(code = "")]
1210+
left: Span,
1211+
#[suggestion_part(code = "{sugg}")]
1212+
right: Span,
1213+
1214+
sugg: String,
1215+
},
1216+
#[suggestion("remove this `where`", code = "", applicability = "machine-applicable")]
1217+
RemoveWhere {
1218+
#[primary_span]
1219+
span: Span,
1220+
},
1221+
}

compiler/rustc_attr_parsing/src/attributes/autodiff.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rustc_span::{Symbol, sym};
99
use thin_vec::ThinVec;
1010

1111
use crate::attributes::prelude::Allow;
12-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
12+
use crate::attributes::{OnDuplicate, SingleAttributeParser};
1313
use crate::context::{AcceptContext, Stage};
1414
use crate::parser::{ArgParser, MetaItemOrLitParser};
1515
use crate::target_checking::AllowedTargets;
@@ -18,12 +18,12 @@ pub(crate) struct RustcAutodiffParser;
1818

1919
impl<S: Stage> SingleAttributeParser<S> for RustcAutodiffParser {
2020
const PATH: &[Symbol] = &[sym::rustc_autodiff];
21-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
2221
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
2322
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
2423
Allow(Target::Fn),
2524
Allow(Target::Method(MethodKind::Inherent)),
2625
Allow(Target::Method(MethodKind::Trait { body: true })),
26+
Allow(Target::Method(MethodKind::Trait { body: false })),
2727
Allow(Target::Method(MethodKind::TraitImpl)),
2828
]);
2929
const TEMPLATE: AttributeTemplate = template!(

compiler/rustc_attr_parsing/src/attributes/cfi_encoding.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ impl<S: Stage> SingleAttributeParser<S> for CfiEncodingParser {
88
Allow(Target::Enum),
99
Allow(Target::Union),
1010
]);
11-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
1211
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
1312
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "encoding");
1413

compiler/rustc_attr_parsing/src/attributes/codegen_attrs.rs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ pub(crate) struct OptimizeParser;
1212

1313
impl<S: Stage> SingleAttributeParser<S> for OptimizeParser {
1414
const PATH: &[Symbol] = &[sym::optimize];
15-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
1615
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
1716
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
1817
Allow(Target::Fn),
@@ -68,7 +67,6 @@ pub(crate) struct CoverageParser;
6867

6968
impl<S: Stage> SingleAttributeParser<S> for CoverageParser {
7069
const PATH: &[Symbol] = &[sym::coverage];
71-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
7270
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
7371
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
7472
Allow(Target::Fn),
@@ -119,7 +117,6 @@ pub(crate) struct ExportNameParser;
119117

120118
impl<S: Stage> SingleAttributeParser<S> for ExportNameParser {
121119
const PATH: &[rustc_span::Symbol] = &[sym::export_name];
122-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
123120
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
124121
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
125122
Allow(Target::Static),
@@ -157,7 +154,6 @@ pub(crate) struct RustcObjcClassParser;
157154

158155
impl<S: Stage> SingleAttributeParser<S> for RustcObjcClassParser {
159156
const PATH: &[rustc_span::Symbol] = &[sym::rustc_objc_class];
160-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
161157
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
162158
const ALLOWED_TARGETS: AllowedTargets =
163159
AllowedTargets::AllowList(&[Allow(Target::ForeignStatic)]);
@@ -189,7 +185,6 @@ pub(crate) struct RustcObjcSelectorParser;
189185

190186
impl<S: Stage> SingleAttributeParser<S> for RustcObjcSelectorParser {
191187
const PATH: &[rustc_span::Symbol] = &[sym::rustc_objc_selector];
192-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
193188
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
194189
const ALLOWED_TARGETS: AllowedTargets =
195190
AllowedTargets::AllowList(&[Allow(Target::ForeignStatic)]);
@@ -595,7 +590,6 @@ impl<S: Stage> SingleAttributeParser<S> for SanitizeParser {
595590
r#"realtime = "nonblocking|blocking|caller""#,
596591
]);
597592

598-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
599593
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
600594

601595
fn convert(cx: &mut AcceptContext<'_, '_, S>, args: &ArgParser) -> Option<AttributeKind> {
@@ -724,7 +718,6 @@ pub(crate) struct PatchableFunctionEntryParser;
724718
impl<S: Stage> SingleAttributeParser<S> for PatchableFunctionEntryParser {
725719
const PATH: &[Symbol] = &[sym::patchable_function_entry];
726720
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
727-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
728721
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Fn)]);
729722
const TEMPLATE: AttributeTemplate = template!(List: &["prefix_nops = m, entry_nops = n"]);
730723

compiler/rustc_attr_parsing/src/attributes/crate_level.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ pub(crate) struct CrateNameParser;
1010

1111
impl<S: Stage> SingleAttributeParser<S> for CrateNameParser {
1212
const PATH: &[Symbol] = &[sym::crate_name];
13-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
1413
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
1514
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "name");
1615
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
@@ -84,7 +83,6 @@ pub(crate) struct RecursionLimitParser;
8483

8584
impl<S: Stage> SingleAttributeParser<S> for RecursionLimitParser {
8685
const PATH: &[Symbol] = &[sym::recursion_limit];
87-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
8886
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
8987
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N", "https://doc.rust-lang.org/reference/attributes/limits.html#the-recursion_limit-attribute");
9088
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
@@ -107,7 +105,6 @@ pub(crate) struct MoveSizeLimitParser;
107105

108106
impl<S: Stage> SingleAttributeParser<S> for MoveSizeLimitParser {
109107
const PATH: &[Symbol] = &[sym::move_size_limit];
110-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
111108
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
112109
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N");
113110
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
@@ -130,7 +127,6 @@ pub(crate) struct TypeLengthLimitParser;
130127

131128
impl<S: Stage> SingleAttributeParser<S> for TypeLengthLimitParser {
132129
const PATH: &[Symbol] = &[sym::type_length_limit];
133-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
134130
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
135131
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N");
136132
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
@@ -153,7 +149,6 @@ pub(crate) struct PatternComplexityLimitParser;
153149

154150
impl<S: Stage> SingleAttributeParser<S> for PatternComplexityLimitParser {
155151
const PATH: &[Symbol] = &[sym::pattern_complexity_limit];
156-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
157152
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
158153
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "N");
159154
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
@@ -213,7 +208,6 @@ pub(crate) struct WindowsSubsystemParser;
213208
impl<S: Stage> SingleAttributeParser<S> for WindowsSubsystemParser {
214209
const PATH: &[Symbol] = &[sym::windows_subsystem];
215210
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
216-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
217211
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Crate)]);
218212
const TEMPLATE: AttributeTemplate = template!(NameValueStr: ["windows", "console"], "https://doc.rust-lang.org/reference/runtime.html#the-windows_subsystem-attribute");
219213

compiler/rustc_attr_parsing/src/attributes/deprecation.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ fn get<S: Stage>(
3434
pub(crate) struct DeprecatedParser;
3535
impl<S: Stage> SingleAttributeParser<S> for DeprecatedParser {
3636
const PATH: &[Symbol] = &[sym::deprecated];
37-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
3837
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
3938
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowListWarnRest(&[
4039
Allow(Target::Fn),

compiler/rustc_attr_parsing/src/attributes/diagnostic/do_not_recommend.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,14 @@ use rustc_hir::lints::AttributeLintKind;
44
use rustc_session::lint::builtin::MALFORMED_DIAGNOSTIC_ATTRIBUTES;
55
use rustc_span::{Symbol, sym};
66

7-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
7+
use crate::attributes::{OnDuplicate, SingleAttributeParser};
88
use crate::context::{AcceptContext, Stage};
99
use crate::parser::ArgParser;
1010
use crate::target_checking::{ALL_TARGETS, AllowedTargets};
1111

1212
pub(crate) struct DoNotRecommendParser;
1313
impl<S: Stage> SingleAttributeParser<S> for DoNotRecommendParser {
1414
const PATH: &[Symbol] = &[sym::diagnostic, sym::do_not_recommend];
15-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
1615
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Warn;
1716
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(ALL_TARGETS); // Checked in check_attr.
1817
const TEMPLATE: AttributeTemplate = template!(Word /*doesn't matter */);

compiler/rustc_attr_parsing/src/attributes/dummy.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@ use rustc_feature::{AttributeTemplate, template};
22
use rustc_hir::attrs::AttributeKind;
33
use rustc_span::{Symbol, sym};
44

5-
use crate::attributes::{AttributeOrder, OnDuplicate, SingleAttributeParser};
5+
use crate::attributes::{OnDuplicate, SingleAttributeParser};
66
use crate::context::{AcceptContext, Stage};
77
use crate::parser::ArgParser;
88
use crate::target_checking::{ALL_TARGETS, AllowedTargets};
99

1010
pub(crate) struct RustcDummyParser;
1111
impl<S: Stage> SingleAttributeParser<S> for RustcDummyParser {
1212
const PATH: &[Symbol] = &[sym::rustc_dummy];
13-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepInnermost;
1413
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Ignore;
1514
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(ALL_TARGETS);
1615
const TEMPLATE: AttributeTemplate = template!(Word); // Anything, really

compiler/rustc_attr_parsing/src/attributes/inline.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ pub(crate) struct InlineParser;
1111

1212
impl<S: Stage> SingleAttributeParser<S> for InlineParser {
1313
const PATH: &[Symbol] = &[sym::inline];
14-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
1514
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
1615
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
1716
Allow(Target::Fn),
@@ -68,7 +67,6 @@ pub(crate) struct RustcForceInlineParser;
6867

6968
impl<S: Stage> SingleAttributeParser<S> for RustcForceInlineParser {
7069
const PATH: &[Symbol] = &[sym::rustc_force_inline];
71-
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
7270
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::WarnButFutureError;
7371
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
7472
Allow(Target::Fn),

0 commit comments

Comments
 (0)