Skip to content

Commit f08767a

Browse files
committed
add AnonConstKind to non_trivial_const_arg diagnostics
1 parent 9982d64 commit f08767a

File tree

7 files changed

+41
-18
lines changed

7 files changed

+41
-18
lines changed

compiler/rustc_resolve/messages.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ resolve_const_param_in_enum_discriminant =
119119
const parameters may not be used in enum discriminant values
120120
121121
resolve_const_param_in_non_trivial_anon_const =
122-
const parameters may only be used as standalone arguments here, i.e. `{$name}`
122+
const parameters may only be used as standalone arguments in {$place}, i.e. `{$name}`
123123
124124
resolve_constructor_private_if_any_field_private =
125125
a constructor is private if any of the fields is private

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
900900
ResolutionError::ParamInTyOfConstParam { name } => {
901901
self.dcx().create_err(errs::ParamInTyOfConstParam { span, name })
902902
}
903-
ResolutionError::ParamInNonTrivialAnonConst { name, param_kind: is_type } => {
903+
ResolutionError::ParamInNonTrivialAnonConst { name, param_kind: is_type , place} => {
904904
self.dcx().create_err(errs::ParamInNonTrivialAnonConst {
905905
span,
906906
name,
@@ -910,6 +910,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
910910
.sess
911911
.is_nightly_build()
912912
.then_some(errs::ParamInNonTrivialAnonConstHelp),
913+
place: place.unwrap(),
913914
})
914915
}
915916
ResolutionError::ParamInEnumDiscriminant { name, param_kind: is_type } => self

compiler/rustc_resolve/src/errors.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_macros::{Diagnostic, Subdiagnostic};
44
use rustc_span::{Ident, Span, Symbol};
55

66
use crate::Res;
7-
use crate::late::PatternSource;
7+
use crate::late::{AnonConstKind, PatternSource};
88

99
#[derive(Diagnostic)]
1010
#[diag(resolve_generic_params_from_outer_item, code = E0401)]
@@ -384,6 +384,7 @@ pub(crate) struct ParamInNonTrivialAnonConst {
384384
pub(crate) param_kind: ParamKindInNonTrivialAnonConst,
385385
#[subdiagnostic]
386386
pub(crate) help: Option<ParamInNonTrivialAnonConstHelp>,
387+
pub(crate) place: AnonConstKind
387388
}
388389

389390
#[derive(Subdiagnostic)]

compiler/rustc_resolve/src/ident.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,7 +1175,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
11751175
res_err = Some((span, CannotCaptureDynamicEnvironmentInFnItem));
11761176
}
11771177
}
1178-
RibKind::ConstantItem(_, item) => {
1178+
RibKind::ConstantItem(_, item, _) => {
11791179
// Still doesn't deal with upvars
11801180
if let Some(span) = finalize {
11811181
let (span, resolution_error) = match item {
@@ -1275,7 +1275,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
12751275
}
12761276
}
12771277

1278-
RibKind::ConstantItem(trivial, _) => {
1278+
RibKind::ConstantItem(trivial, _, kind) => {
12791279
if let ConstantHasGenerics::No(cause) = trivial {
12801280
// HACK(min_const_generics): If we encounter `Self` in an anonymous
12811281
// constant we can't easily tell if it's generic at this stage, so
@@ -1306,6 +1306,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
13061306
name: rib_ident.name,
13071307
param_kind:
13081308
ParamKindInNonTrivialAnonConst::Type,
1309+
place: kind,
1310+
13091311
}
13101312
}
13111313
};
@@ -1365,7 +1367,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
13651367
}
13661368
}
13671369

1368-
RibKind::ConstantItem(trivial, _) => {
1370+
RibKind::ConstantItem(trivial, _, kind) => {
13691371
if let ConstantHasGenerics::No(cause) = trivial {
13701372
if let Some(span) = finalize {
13711373
let error = match cause {
@@ -1381,6 +1383,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
13811383
param_kind: ParamKindInNonTrivialAnonConst::Const {
13821384
name: rib_ident.name,
13831385
},
1386+
place: kind,
13841387
}
13851388
}
13861389
};

compiler/rustc_resolve/src/late.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ pub(crate) enum PatternSource {
6666
}
6767

6868
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
69-
enum IsRepeatExpr {
69+
pub(crate) enum IsRepeatExpr {
7070
No,
7171
Yes,
7272
}
@@ -76,13 +76,28 @@ struct IsNeverPattern;
7676
/// Describes whether an `AnonConst` is a type level const arg or
7777
/// some other form of anon const (i.e. inline consts or enum discriminants)
7878
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
79-
enum AnonConstKind {
79+
pub(crate) enum AnonConstKind {
8080
EnumDiscriminant,
8181
FieldDefaultValue,
8282
InlineConst,
8383
ConstArg(IsRepeatExpr),
8484
}
8585

86+
impl IntoDiagArg for AnonConstKind {
87+
fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
88+
DiagArgValue::Str(Cow::Borrowed(match self {
89+
AnonConstKind::EnumDiscriminant => "enum discriminant",
90+
AnonConstKind::FieldDefaultValue => "field default value",
91+
AnonConstKind::InlineConst => "inline const",
92+
AnonConstKind::ConstArg(is_repeat_expr) => match is_repeat_expr {
93+
IsRepeatExpr::No => "array repeat expression",
94+
IsRepeatExpr::Yes => "const generic args",
95+
}
96+
},
97+
))
98+
}
99+
}
100+
86101
impl PatternSource {
87102
fn descr(self) -> &'static str {
88103
match self {
@@ -209,7 +224,7 @@ pub(crate) enum RibKind<'ra> {
209224
///
210225
/// The item may reference generic parameters in trivial constant expressions.
211226
/// All other constants aren't allowed to use generic params at all.
212-
ConstantItem(ConstantHasGenerics, Option<(Ident, ConstantItemKind)>),
227+
ConstantItem(ConstantHasGenerics, Option<(Ident, ConstantItemKind)>, Option<AnonConstKind>),
213228

214229
/// We passed through a module.
215230
Module(Module<'ra>),
@@ -3017,19 +3032,21 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
30173032
&mut self,
30183033
is_repeat: IsRepeatExpr,
30193034
may_use_generics: ConstantHasGenerics,
3035+
anon_const_kind: Option<AnonConstKind>,
30203036
item: Option<(Ident, ConstantItemKind)>,
30213037
f: impl FnOnce(&mut Self),
30223038
) {
30233039
let f = |this: &mut Self| {
3024-
this.with_rib(ValueNS, RibKind::ConstantItem(may_use_generics, item), |this| {
3040+
this.with_rib(ValueNS, RibKind::ConstantItem(may_use_generics, item, anon_const_kind), |this| {
30253041
this.with_rib(
30263042
TypeNS,
30273043
RibKind::ConstantItem(
30283044
may_use_generics.force_yes_if(is_repeat == IsRepeatExpr::Yes),
30293045
item,
3046+
anon_const_kind,
30303047
),
30313048
|this| {
3032-
this.with_label_rib(RibKind::ConstantItem(may_use_generics, item), f);
3049+
this.with_label_rib(RibKind::ConstantItem(may_use_generics, item, anon_const_kind), f);
30333050
},
30343051
)
30353052
})
@@ -3548,7 +3565,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
35483565

35493566
fn resolve_const_body(&mut self, expr: &'ast Expr, item: Option<(Ident, ConstantItemKind)>) {
35503567
self.with_lifetime_rib(LifetimeRibKind::Elided(LifetimeRes::Infer), |this| {
3551-
this.with_constant_rib(IsRepeatExpr::No, ConstantHasGenerics::Yes, item, |this| {
3568+
this.with_constant_rib(IsRepeatExpr::No, ConstantHasGenerics::Yes, None, item, |this| {
35523569
this.visit_expr(expr)
35533570
});
35543571
})
@@ -4757,7 +4774,7 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
47574774
}
47584775
};
47594776

4760-
self.with_constant_rib(is_repeat_expr, may_use_generics, None, |this| {
4777+
self.with_constant_rib(is_repeat_expr, may_use_generics, Some(anon_const_kind), None, |this| {
47614778
this.with_lifetime_rib(LifetimeRibKind::Elided(LifetimeRes::Infer), |this| {
47624779
resolve_expr(this);
47634780
});

compiler/rustc_resolve/src/late/diagnostics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@ use tracing::debug;
3535
use super::NoConstantGenericsReason;
3636
use crate::diagnostics::{ImportSuggestion, LabelSuggestion, TypoSuggestion};
3737
use crate::late::{
38-
AliasPossibility, LateResolutionVisitor, LifetimeBinderKind, LifetimeRes, LifetimeRibKind,
39-
LifetimeUseSet, QSelf, RibKind,
38+
AliasPossibility, AnonConstKind, LateResolutionVisitor, LifetimeBinderKind, LifetimeRes, LifetimeRibKind, LifetimeUseSet, QSelf, RibKind
4039
};
4140
use crate::ty::fast_reject::SimplifiedType;
4241
use crate::{
@@ -3337,6 +3336,7 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
33373336
.sess
33383337
.is_nightly_build()
33393338
.then_some(errors::ParamInNonTrivialAnonConstHelp),
3339+
place: AnonConstKind::InlineConst,
33403340
})
33413341
.emit();
33423342
}

compiler/rustc_resolve/src/lib.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ use rustc_middle::middle::privacy::EffectiveVisibilities;
6464
use rustc_middle::query::Providers;
6565
use rustc_middle::span_bug;
6666
use rustc_middle::ty::{
67-
self, DelegationFnSig, Feed, MainDefinition, RegisteredTools, ResolverGlobalCtxt,
68-
ResolverOutputs, TyCtxt, TyCtxtFeed, Visibility,
67+
self, DelegationFnSig, Feed, MainDefinition, RegisteredTools, ResolverGlobalCtxt, ResolverOutputs, TyCtxt, TyCtxtFeed, Visibility
6968
};
7069
use rustc_query_system::ich::StableHashingContext;
7170
use rustc_session::lint::builtin::PRIVATE_MACRO_USE;
@@ -91,6 +90,8 @@ pub mod rustdoc;
9190

9291
pub use macros::registered_tools_ast;
9392

93+
use crate::late::AnonConstKind;
94+
9495
rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
9596

9697
#[derive(Debug)]
@@ -286,7 +287,7 @@ enum ResolutionError<'ra> {
286287
/// generic parameters must not be used inside const evaluations.
287288
///
288289
/// This error is only emitted when using `min_const_generics`.
289-
ParamInNonTrivialAnonConst { name: Symbol, param_kind: ParamKindInNonTrivialAnonConst },
290+
ParamInNonTrivialAnonConst { name: Symbol, param_kind: ParamKindInNonTrivialAnonConst, place: Option<AnonConstKind> },
290291
/// generic parameters must not be used inside enum discriminants.
291292
///
292293
/// This error is emitted even with `generic_const_exprs`.

0 commit comments

Comments
 (0)