mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 08:13:41 +00:00
Allow ~const
bounds on non-const functions
This commit is contained in:
parent
17e8752aca
commit
e4b08ab241
@ -1415,7 +1415,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||
if !self.is_tilde_const_allowed {
|
||||
self.err_handler()
|
||||
.struct_span_err(bound.span(), "`~const` is not allowed here")
|
||||
.note("only allowed on bounds on traits' associated types and functions, const fns, const impls and its associated functions")
|
||||
.note("only allowed on bounds on functions, traits' associated types and functions, const impls and its associated functions")
|
||||
.emit();
|
||||
}
|
||||
}
|
||||
@ -1523,9 +1523,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
||||
});
|
||||
}
|
||||
|
||||
let tilde_const_allowed =
|
||||
matches!(fk.header(), Some(FnHeader { constness: Const::Yes(_), .. }))
|
||||
|| matches!(fk.ctxt(), Some(FnCtxt::Assoc(_)));
|
||||
let tilde_const_allowed = matches!(fk.header(), Some(FnHeader { .. }))
|
||||
|| matches!(fk.ctxt(), Some(FnCtxt::Assoc(_)));
|
||||
|
||||
self.with_tilde_const(tilde_const_allowed, |this| visit::walk_fn(this, fk));
|
||||
}
|
||||
|
@ -0,0 +1,34 @@
|
||||
// check-pass
|
||||
#![feature(const_trait_impl)]
|
||||
#![feature(generic_arg_infer)]
|
||||
#![feature(generic_const_exprs)]
|
||||
#![allow(incomplete_features)]
|
||||
|
||||
struct Foo<const N: usize>;
|
||||
|
||||
impl<const N: usize> Foo<N> {
|
||||
fn add<A: ~const Add42>(self) -> Foo<{ A::add(N) }> {
|
||||
Foo
|
||||
}
|
||||
}
|
||||
|
||||
#[const_trait]
|
||||
trait Add42 {
|
||||
fn add(a: usize) -> usize;
|
||||
}
|
||||
|
||||
impl const Add42 for () {
|
||||
fn add(a: usize) -> usize {
|
||||
a + 42
|
||||
}
|
||||
}
|
||||
|
||||
fn bar<A: ~const Add42, const N: usize>(_: Foo<N>) -> Foo<{ A::add(N) }> {
|
||||
Foo
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let foo = Foo::<0>;
|
||||
let foo = bar::<(), _>(foo);
|
||||
let _foo = bar::<(), _>(foo);
|
||||
}
|
@ -17,12 +17,6 @@ fn rpit_assoc_bound() -> impl IntoIterator<Item: ~const T> { Some(S) }
|
||||
fn apit_assoc_bound(_: impl IntoIterator<Item: ~const T>) {}
|
||||
//~^ ERROR `~const` is not allowed
|
||||
|
||||
fn generic<P: ~const T>() {}
|
||||
//~^ ERROR `~const` is not allowed
|
||||
|
||||
fn where_clause<P>() where P: ~const T {}
|
||||
//~^ ERROR `~const` is not allowed
|
||||
|
||||
struct TildeQuestion<T: ~const ?Sized>(std::marker::PhantomData<T>);
|
||||
//~^ ERROR `~const` and `?` are mutually exclusive
|
||||
|
||||
|
@ -4,7 +4,7 @@ error: `~const` is not allowed here
|
||||
LL | fn rpit() -> impl ~const T { S }
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: only allowed on bounds on traits' associated types and functions, const fns, const impls and its associated functions
|
||||
= note: only allowed on bounds on functions, traits' associated types and functions, const impls and its associated functions
|
||||
|
||||
error: `~const` is not allowed here
|
||||
--> $DIR/tilde-const-invalid-places.rs:11:17
|
||||
@ -12,7 +12,7 @@ error: `~const` is not allowed here
|
||||
LL | fn apit(_: impl ~const T) {}
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: only allowed on bounds on traits' associated types and functions, const fns, const impls and its associated functions
|
||||
= note: only allowed on bounds on functions, traits' associated types and functions, const impls and its associated functions
|
||||
|
||||
error: `~const` is not allowed here
|
||||
--> $DIR/tilde-const-invalid-places.rs:14:50
|
||||
@ -20,7 +20,7 @@ error: `~const` is not allowed here
|
||||
LL | fn rpit_assoc_bound() -> impl IntoIterator<Item: ~const T> { Some(S) }
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: only allowed on bounds on traits' associated types and functions, const fns, const impls and its associated functions
|
||||
= note: only allowed on bounds on functions, traits' associated types and functions, const impls and its associated functions
|
||||
|
||||
error: `~const` is not allowed here
|
||||
--> $DIR/tilde-const-invalid-places.rs:17:48
|
||||
@ -28,29 +28,13 @@ error: `~const` is not allowed here
|
||||
LL | fn apit_assoc_bound(_: impl IntoIterator<Item: ~const T>) {}
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: only allowed on bounds on traits' associated types and functions, const fns, const impls and its associated functions
|
||||
|
||||
error: `~const` is not allowed here
|
||||
--> $DIR/tilde-const-invalid-places.rs:20:15
|
||||
|
|
||||
LL | fn generic<P: ~const T>() {}
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: only allowed on bounds on traits' associated types and functions, const fns, const impls and its associated functions
|
||||
|
||||
error: `~const` is not allowed here
|
||||
--> $DIR/tilde-const-invalid-places.rs:23:31
|
||||
|
|
||||
LL | fn where_clause<P>() where P: ~const T {}
|
||||
| ^^^^^^^^
|
||||
|
|
||||
= note: only allowed on bounds on traits' associated types and functions, const fns, const impls and its associated functions
|
||||
= note: only allowed on bounds on functions, traits' associated types and functions, const impls and its associated functions
|
||||
|
||||
error: `~const` and `?` are mutually exclusive
|
||||
--> $DIR/tilde-const-invalid-places.rs:26:25
|
||||
--> $DIR/tilde-const-invalid-places.rs:20:25
|
||||
|
|
||||
LL | struct TildeQuestion<T: ~const ?Sized>(std::marker::PhantomData<T>);
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user