Skip to content

Commit 9ac4831

Browse files
committed
Revert "Rollup merge of #80538 - JulianKnodt:err_usize, r=lcnr"
This reverts commit be2a3f8, reversing changes made to 4c4e8e7.
1 parent c8915ee commit 9ac4831

File tree

7 files changed

+41
-95
lines changed

7 files changed

+41
-95
lines changed

Cargo.lock

-1
Original file line numberDiff line numberDiff line change
@@ -3745,7 +3745,6 @@ version = "0.0.0"
37453745
dependencies = [
37463746
"rustc_ast",
37473747
"rustc_data_structures",
3748-
"rustc_feature",
37493748
"rustc_index",
37503749
"rustc_macros",
37513750
"rustc_serialize",

compiler/rustc_hir/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ doctest = false
99

1010
[dependencies]
1111
rustc_target = { path = "../rustc_target" }
12-
rustc_feature = { path = "../rustc_feature" }
1312
rustc_macros = { path = "../rustc_macros" }
1413
rustc_data_structures = { path = "../rustc_data_structures" }
1514
rustc_index = { path = "../rustc_index" }

compiler/rustc_hir/src/hir.rs

-8
Original file line numberDiff line numberDiff line change
@@ -290,14 +290,6 @@ impl GenericArg<'_> {
290290
GenericArg::Const(_) => "const",
291291
}
292292
}
293-
294-
pub fn to_ord(&self, feats: &rustc_feature::Features) -> ast::ParamKindOrd {
295-
match self {
296-
GenericArg::Lifetime(_) => ast::ParamKindOrd::Lifetime,
297-
GenericArg::Type(_) => ast::ParamKindOrd::Type,
298-
GenericArg::Const(_) => ast::ParamKindOrd::Const { unordered: feats.const_generics },
299-
}
300-
}
301293
}
302294

303295
#[derive(Debug, HashStable_Generic)]

compiler/rustc_middle/src/ty/mod.rs

-9
Original file line numberDiff line numberDiff line change
@@ -801,15 +801,6 @@ impl GenericParamDefKind {
801801
GenericParamDefKind::Const => "constant",
802802
}
803803
}
804-
pub fn to_ord(&self, tcx: TyCtxt<'_>) -> ast::ParamKindOrd {
805-
match self {
806-
GenericParamDefKind::Lifetime => ast::ParamKindOrd::Lifetime,
807-
GenericParamDefKind::Type { .. } => ast::ParamKindOrd::Type,
808-
GenericParamDefKind::Const => {
809-
ast::ParamKindOrd::Const { unordered: tcx.features().const_generics }
810-
}
811-
}
812-
}
813804
}
814805

815806
#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)]

compiler/rustc_typeck/src/astconv/generics.rs

+41-51
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rustc_hir::GenericArg;
1111
use rustc_middle::ty::{
1212
self, subst, subst::SubstsRef, GenericParamDef, GenericParamDefKind, Ty, TyCtxt,
1313
};
14-
use rustc_session::lint::builtin::LATE_BOUND_LIFETIME_ARGUMENTS;
14+
use rustc_session::{lint::builtin::LATE_BOUND_LIFETIME_ARGUMENTS, Session};
1515
use rustc_span::{symbol::kw, MultiSpan, Span};
1616

1717
use smallvec::SmallVec;
@@ -20,72 +20,62 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
2020
/// Report an error that a generic argument did not match the generic parameter that was
2121
/// expected.
2222
fn generic_arg_mismatch_err(
23-
tcx: TyCtxt<'_>,
23+
sess: &Session,
2424
arg: &GenericArg<'_>,
25-
param: &GenericParamDef,
25+
kind: &'static str,
2626
possible_ordering_error: bool,
2727
help: Option<&str>,
2828
) {
29-
let sess = tcx.sess;
3029
let mut err = struct_span_err!(
3130
sess,
3231
arg.span(),
3332
E0747,
3433
"{} provided when a {} was expected",
3534
arg.descr(),
36-
param.kind.descr(),
35+
kind,
3736
);
3837

39-
if let GenericParamDefKind::Const { .. } = param.kind {
38+
let unordered = sess.features_untracked().const_generics;
39+
let kind_ord = match kind {
40+
"lifetime" => ParamKindOrd::Lifetime,
41+
"type" => ParamKindOrd::Type,
42+
"constant" => ParamKindOrd::Const { unordered },
43+
// It's more concise to match on the string representation, though it means
44+
// the match is non-exhaustive.
45+
_ => bug!("invalid generic parameter kind {}", kind),
46+
};
47+
48+
if let ParamKindOrd::Const { .. } = kind_ord {
4049
if let GenericArg::Type(hir::Ty { kind: hir::TyKind::Infer, .. }) = arg {
4150
err.help("const arguments cannot yet be inferred with `_`");
4251
}
4352
}
4453

45-
// Specific suggestion set for diagnostics
46-
match (arg, &param.kind) {
47-
(
48-
GenericArg::Type(hir::Ty { kind: hir::TyKind::Path { .. }, .. }),
49-
GenericParamDefKind::Const { .. },
50-
) => {
51-
let suggestions = vec![
52-
(arg.span().shrink_to_lo(), String::from("{ ")),
53-
(arg.span().shrink_to_hi(), String::from(" }")),
54-
];
55-
err.multipart_suggestion(
56-
"if this generic argument was intended as a const parameter, \
54+
let arg_ord = match arg {
55+
GenericArg::Lifetime(_) => ParamKindOrd::Lifetime,
56+
GenericArg::Type(_) => ParamKindOrd::Type,
57+
GenericArg::Const(_) => ParamKindOrd::Const { unordered },
58+
};
59+
60+
if matches!(arg, GenericArg::Type(hir::Ty { kind: hir::TyKind::Path { .. }, .. }))
61+
&& matches!(kind_ord, ParamKindOrd::Const { .. })
62+
{
63+
let suggestions = vec![
64+
(arg.span().shrink_to_lo(), String::from("{ ")),
65+
(arg.span().shrink_to_hi(), String::from(" }")),
66+
];
67+
err.multipart_suggestion(
68+
"if this generic argument was intended as a const parameter, \
5769
try surrounding it with braces:",
58-
suggestions,
59-
Applicability::MaybeIncorrect,
60-
);
61-
}
62-
(
63-
GenericArg::Type(hir::Ty { kind: hir::TyKind::Array(_, len), .. }),
64-
GenericParamDefKind::Const { .. },
65-
) if tcx.type_of(param.def_id) == tcx.types.usize => {
66-
let snippet = sess.source_map().span_to_snippet(tcx.hir().span(len.hir_id));
67-
if let Ok(snippet) = snippet {
68-
err.span_suggestion(
69-
arg.span(),
70-
"array type provided where a `usize` was expected, try",
71-
format!("{{ {} }}", snippet),
72-
Applicability::MaybeIncorrect,
73-
);
74-
}
75-
}
76-
_ => {}
70+
suggestions,
71+
Applicability::MaybeIncorrect,
72+
);
7773
}
7874

79-
let kind_ord = param.kind.to_ord(tcx);
80-
let arg_ord = arg.to_ord(&tcx.features());
81-
8275
// This note is only true when generic parameters are strictly ordered by their kind.
8376
if possible_ordering_error && kind_ord.cmp(&arg_ord) != core::cmp::Ordering::Equal {
84-
let (first, last) = if kind_ord < arg_ord {
85-
(param.kind.descr(), arg.descr())
86-
} else {
87-
(arg.descr(), param.kind.descr())
88-
};
77+
let (first, last) =
78+
if kind_ord < arg_ord { (kind, arg.descr()) } else { (arg.descr(), kind) };
8979
err.note(&format!("{} arguments must be provided before {} arguments", first, last));
9080
if let Some(help) = help {
9181
err.help(help);
@@ -213,7 +203,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
213203
// We expected a lifetime argument, but got a type or const
214204
// argument. That means we're inferring the lifetimes.
215205
substs.push(ctx.inferred_kind(None, param, infer_args));
216-
force_infer_lt = Some((arg, param));
206+
force_infer_lt = Some(arg);
217207
params.next();
218208
}
219209
(GenericArg::Lifetime(_), _, ExplicitLateBound::Yes) => {
@@ -223,7 +213,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
223213
// ignore it.
224214
args.next();
225215
}
226-
(_, _, _) => {
216+
(_, kind, _) => {
227217
// We expected one kind of parameter, but the user provided
228218
// another. This is an error. However, if we already know that
229219
// the arguments don't match up with the parameters, we won't issue
@@ -266,9 +256,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
266256
param_types_present.dedup();
267257

268258
Self::generic_arg_mismatch_err(
269-
tcx,
259+
tcx.sess,
270260
arg,
271-
param,
261+
kind.descr(),
272262
!args_iter.clone().is_sorted_by_key(|arg| match arg {
273263
GenericArg::Lifetime(_) => ParamKindOrd::Lifetime,
274264
GenericArg::Type(_) => ParamKindOrd::Type,
@@ -325,9 +315,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
325315
{
326316
let kind = arg.descr();
327317
assert_eq!(kind, "lifetime");
328-
let (provided_arg, param) =
318+
let provided =
329319
force_infer_lt.expect("lifetimes ought to have been inferred");
330-
Self::generic_arg_mismatch_err(tcx, provided_arg, param, false, None);
320+
Self::generic_arg_mismatch_err(tcx.sess, provided, kind, false, None);
331321
}
332322

333323
break;

src/test/ui/const-generics/suggest_const_for_array.rs

-10
This file was deleted.

src/test/ui/const-generics/suggest_const_for_array.stderr

-15
This file was deleted.

0 commit comments

Comments
 (0)