Just totally fully deny late-bound consts
This commit is contained in:
parent
2e6fc42541
commit
3862095bd2
18 changed files with 110 additions and 30 deletions
|
@ -120,6 +120,9 @@ ast_passes_fn_without_body =
|
||||||
ast_passes_forbidden_bound =
|
ast_passes_forbidden_bound =
|
||||||
bounds cannot be used in this context
|
bounds cannot be used in this context
|
||||||
|
|
||||||
|
ast_passes_forbidden_const_param =
|
||||||
|
late-bound const parameters cannot be used currently
|
||||||
|
|
||||||
ast_passes_forbidden_default =
|
ast_passes_forbidden_default =
|
||||||
`default` is only allowed on items in trait impls
|
`default` is only allowed on items in trait impls
|
||||||
.label = `default` because of this
|
.label = `default` because of this
|
||||||
|
|
|
@ -69,6 +69,13 @@ pub struct ForbiddenBound {
|
||||||
pub spans: Vec<Span>,
|
pub spans: Vec<Span>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(ast_passes_forbidden_const_param)]
|
||||||
|
pub struct ForbiddenConstParam {
|
||||||
|
#[primary_span]
|
||||||
|
pub const_param_spans: Vec<Span>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(ast_passes_fn_param_too_many)]
|
#[diag(ast_passes_fn_param_too_many)]
|
||||||
pub struct FnParamTooMany {
|
pub struct FnParamTooMany {
|
||||||
|
|
|
@ -162,6 +162,22 @@ impl<'a> PostExpansionVisitor<'a> {
|
||||||
crate::fluent_generated::ast_passes_forbidden_non_lifetime_param
|
crate::fluent_generated::ast_passes_forbidden_non_lifetime_param
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// FIXME(non_lifetime_binders): Const bound params are pretty broken.
|
||||||
|
// Let's keep users from using this feature accidentally.
|
||||||
|
if self.features.non_lifetime_binders {
|
||||||
|
let const_param_spans: Vec<_> = params
|
||||||
|
.iter()
|
||||||
|
.filter_map(|param| match param.kind {
|
||||||
|
ast::GenericParamKind::Const { .. } => Some(param.ident.span),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
if !const_param_spans.is_empty() {
|
||||||
|
self.sess.dcx().emit_err(errors::ForbiddenConstParam { const_param_spans });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for param in params {
|
for param in params {
|
||||||
if !param.bounds.is_empty() {
|
if !param.bounds.is_empty() {
|
||||||
let spans: Vec<_> = param.bounds.iter().map(|b| b.span()).collect();
|
let spans: Vec<_> = param.bounds.iter().map(|b| b.span()).collect();
|
||||||
|
|
|
@ -2094,11 +2094,7 @@ pub fn deny_non_region_late_bound(
|
||||||
format!("late-bound {what} parameter not allowed on {where_}"),
|
format!("late-bound {what} parameter not allowed on {where_}"),
|
||||||
);
|
);
|
||||||
|
|
||||||
let guar = if tcx.features().non_lifetime_binders && first {
|
let guar = diag.emit_unless(!tcx.features().non_lifetime_binders || !first);
|
||||||
diag.emit()
|
|
||||||
} else {
|
|
||||||
diag.delay_as_bug()
|
|
||||||
};
|
|
||||||
|
|
||||||
first = false;
|
first = false;
|
||||||
*arg = ResolvedArg::Error(guar);
|
*arg = ResolvedArg::Error(guar);
|
||||||
|
|
|
@ -2763,7 +2763,11 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
|
||||||
let res = match kind {
|
let res = match kind {
|
||||||
RibKind::Item(..) | RibKind::AssocItem => Res::Def(def_kind, def_id.to_def_id()),
|
RibKind::Item(..) | RibKind::AssocItem => Res::Def(def_kind, def_id.to_def_id()),
|
||||||
RibKind::Normal => {
|
RibKind::Normal => {
|
||||||
if self.r.tcx.features().non_lifetime_binders {
|
// FIXME(non_lifetime_binders): Stop special-casing
|
||||||
|
// const params to error out here.
|
||||||
|
if self.r.tcx.features().non_lifetime_binders
|
||||||
|
&& matches!(param.kind, GenericParamKind::Type { .. })
|
||||||
|
{
|
||||||
Res::Def(def_kind, def_id.to_def_id())
|
Res::Def(def_kind, def_id.to_def_id())
|
||||||
} else {
|
} else {
|
||||||
Res::Err
|
Res::Err
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
//@ known-bug: #127009
|
|
||||||
|
|
||||||
#![feature(non_lifetime_binders)]
|
|
||||||
|
|
||||||
fn b()
|
|
||||||
where
|
|
||||||
for<const C: usize> [(); C]: Copy,
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
|
|
@ -3,5 +3,6 @@
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
for<const N: i32> || -> () {};
|
for<const N: i32> || -> () {};
|
||||||
//~^ ERROR late-bound const parameter not allowed on closures
|
//~^ ERROR late-bound const parameters cannot be used currently
|
||||||
|
//~| ERROR late-bound const parameter not allowed on closures
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
error: late-bound const parameters cannot be used currently
|
||||||
|
--> $DIR/const-bound.rs:5:15
|
||||||
|
|
|
||||||
|
LL | for<const N: i32> || -> () {};
|
||||||
|
| ^
|
||||||
|
|
||||||
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
|
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
--> $DIR/const-bound.rs:1:37
|
--> $DIR/const-bound.rs:1:37
|
||||||
|
|
|
|
||||||
|
@ -13,5 +19,5 @@ error: late-bound const parameter not allowed on closures
|
||||||
LL | for<const N: i32> || -> () {};
|
LL | for<const N: i32> || -> () {};
|
||||||
| ^^^^^^^^^^^^
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 1 previous error; 1 warning emitted
|
error: aborting due to 2 previous errors; 1 warning emitted
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,8 @@
|
||||||
pub fn foo()
|
pub fn foo()
|
||||||
where
|
where
|
||||||
for<const N: usize = { const fn bar() {} bar(); 1 }> ():,
|
for<const N: usize = { const fn bar() {} bar(); 1 }> ():,
|
||||||
//~^ ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
//~^ ERROR late-bound const parameters cannot be used currently
|
||||||
|
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
{}
|
{}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
|
error: late-bound const parameters cannot be used currently
|
||||||
|
--> $DIR/no-entry-found-for-key-ice-gce-nlb-113133.rs:9:15
|
||||||
|
|
|
||||||
|
LL | for<const N: usize = { const fn bar() {} bar(); 1 }> ():,
|
||||||
|
| ^
|
||||||
|
|
||||||
error: defaults for generic parameters are not allowed in `for<...>` binders
|
error: defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
--> $DIR/no-entry-found-for-key-ice-gce-nlb-113133.rs:9:9
|
--> $DIR/no-entry-found-for-key-ice-gce-nlb-113133.rs:9:9
|
||||||
|
|
|
|
||||||
LL | for<const N: usize = { const fn bar() {} bar(); 1 }> ():,
|
LL | for<const N: usize = { const fn bar() {} bar(); 1 }> ():,
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,8 @@ trait TraitC {}
|
||||||
fn foo<T>()
|
fn foo<T>()
|
||||||
where
|
where
|
||||||
for<const N: u8 = { T::A }> T: TraitA<AsA = impl TraitB<AsB = impl TraitC>>,
|
for<const N: u8 = { T::A }> T: TraitA<AsA = impl TraitB<AsB = impl TraitC>>,
|
||||||
//~^ ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
//~^ ERROR late-bound const parameters cannot be used currently
|
||||||
|
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
//~| ERROR `impl Trait` is not allowed in bounds
|
//~| ERROR `impl Trait` is not allowed in bounds
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
error: late-bound const parameters cannot be used currently
|
||||||
|
--> $DIR/bad-suggestion-on-missing-assoc.rs:20:15
|
||||||
|
|
|
||||||
|
LL | for<const N: u8 = { T::A }> T: TraitA<AsA = impl TraitB<AsB = impl TraitC>>,
|
||||||
|
| ^
|
||||||
|
|
||||||
warning: the feature `generic_const_exprs` is incomplete and may not be safe to use and/or cause compiler crashes
|
warning: the feature `generic_const_exprs` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
--> $DIR/bad-suggestion-on-missing-assoc.rs:1:12
|
--> $DIR/bad-suggestion-on-missing-assoc.rs:1:12
|
||||||
|
|
|
|
||||||
|
@ -29,6 +35,6 @@ LL | for<const N: u8 = { T::A }> T: TraitA<AsA = impl TraitB<AsB = impl Trai
|
||||||
|
|
|
|
||||||
= note: `impl Trait` is only allowed in arguments and return types of functions and methods
|
= note: `impl Trait` is only allowed in arguments and return types of functions and methods
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 2 warnings emitted
|
error: aborting due to 3 previous errors; 2 warnings emitted
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0562`.
|
For more information about this error, try `rustc --explain E0562`.
|
||||||
|
|
|
@ -4,10 +4,11 @@
|
||||||
pub fn bar()
|
pub fn bar()
|
||||||
where
|
where
|
||||||
for<const N: usize = {
|
for<const N: usize = {
|
||||||
|
//~^ ERROR late-bound const parameters cannot be used currently
|
||||||
|
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
(||1usize)()
|
(||1usize)()
|
||||||
}> V: IntoIterator
|
}> V: IntoIterator
|
||||||
//~^^^ ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
//~^ ERROR cannot find type `V` in this scope
|
||||||
//~^^ ERROR cannot find type `V` in this scope
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0412]: cannot find type `V` in this scope
|
error[E0412]: cannot find type `V` in this scope
|
||||||
--> $DIR/binder-defaults-112547.rs:8:4
|
--> $DIR/binder-defaults-112547.rs:10:4
|
||||||
|
|
|
|
||||||
LL | }> V: IntoIterator
|
LL | }> V: IntoIterator
|
||||||
| ^ not found in this scope
|
| ^ not found in this scope
|
||||||
|
@ -9,6 +9,12 @@ help: you might be missing a type parameter
|
||||||
LL | pub fn bar<V>()
|
LL | pub fn bar<V>()
|
||||||
| +++
|
| +++
|
||||||
|
|
||||||
|
error: late-bound const parameters cannot be used currently
|
||||||
|
--> $DIR/binder-defaults-112547.rs:6:15
|
||||||
|
|
|
||||||
|
LL | for<const N: usize = {
|
||||||
|
| ^
|
||||||
|
|
||||||
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
|
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
--> $DIR/binder-defaults-112547.rs:1:12
|
--> $DIR/binder-defaults-112547.rs:1:12
|
||||||
|
|
|
|
||||||
|
@ -23,10 +29,12 @@ error: defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
|
|
|
|
||||||
LL | for<const N: usize = {
|
LL | for<const N: usize = {
|
||||||
| _________^
|
| _________^
|
||||||
|
LL | |
|
||||||
|
LL | |
|
||||||
LL | | (||1usize)()
|
LL | | (||1usize)()
|
||||||
LL | | }> V: IntoIterator
|
LL | | }> V: IntoIterator
|
||||||
| |_^
|
| |_^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 1 warning emitted
|
error: aborting due to 3 previous errors; 1 warning emitted
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0412`.
|
For more information about this error, try `rustc --explain E0412`.
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
fn fun()
|
fn fun()
|
||||||
where
|
where
|
||||||
for<T = (), const N: usize = 1> ():,
|
for<T = (), const N: usize = 1> ():,
|
||||||
//~^ ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
//~^ ERROR late-bound const parameters cannot be used currently
|
||||||
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
|
//~| ERROR defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
{}
|
{}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
error: late-bound const parameters cannot be used currently
|
||||||
|
--> $DIR/binder-defaults-119489.rs:7:23
|
||||||
|
|
|
||||||
|
LL | for<T = (), const N: usize = 1> ():,
|
||||||
|
| ^
|
||||||
|
|
||||||
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
|
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
--> $DIR/binder-defaults-119489.rs:1:12
|
--> $DIR/binder-defaults-119489.rs:1:12
|
||||||
|
|
|
|
||||||
|
@ -27,5 +33,5 @@ error: defaults for generic parameters are not allowed in `for<...>` binders
|
||||||
LL | for<T = (), const N: usize = 1> ():,
|
LL | for<T = (), const N: usize = 1> ():,
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: aborting due to 2 previous errors; 2 warnings emitted
|
error: aborting due to 3 previous errors; 2 warnings emitted
|
||||||
|
|
||||||
|
|
11
tests/ui/traits/non_lifetime_binders/late-const-param-wf.rs
Normal file
11
tests/ui/traits/non_lifetime_binders/late-const-param-wf.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#![feature(non_lifetime_binders)]
|
||||||
|
//~^ WARN the feature `non_lifetime_binders` is incomplete
|
||||||
|
|
||||||
|
fn b()
|
||||||
|
where
|
||||||
|
for<const C: usize> [(); C]: Copy,
|
||||||
|
//~^ ERROR late-bound const parameters cannot be used currently
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,17 @@
|
||||||
|
error: late-bound const parameters cannot be used currently
|
||||||
|
--> $DIR/late-const-param-wf.rs:6:15
|
||||||
|
|
|
||||||
|
LL | for<const C: usize> [(); C]: Copy,
|
||||||
|
| ^
|
||||||
|
|
||||||
|
warning: the feature `non_lifetime_binders` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/late-const-param-wf.rs:1:12
|
||||||
|
|
|
||||||
|
LL | #![feature(non_lifetime_binders)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #108185 <https://github.com/rust-lang/rust/issues/108185> for more information
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error; 1 warning emitted
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue