Fix const_fn_trait_ref_impl, add test for it
This commit is contained in:
@@ -576,9 +576,10 @@ mod impls {
|
||||
use crate::marker::Tuple;
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<A: Tuple, F: ?Sized> Fn<A> for &F
|
||||
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
|
||||
impl<A: Tuple, F: ?Sized> const Fn<A> for &F
|
||||
where
|
||||
F: Fn<A>,
|
||||
F: ~const Fn<A>,
|
||||
{
|
||||
extern "rust-call" fn call(&self, args: A) -> F::Output {
|
||||
(**self).call(args)
|
||||
@@ -586,9 +587,10 @@ mod impls {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<A: Tuple, F: ?Sized> FnMut<A> for &F
|
||||
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
|
||||
impl<A: Tuple, F: ?Sized> const FnMut<A> for &F
|
||||
where
|
||||
F: Fn<A>,
|
||||
F: ~const Fn<A>,
|
||||
{
|
||||
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
|
||||
(**self).call(args)
|
||||
@@ -596,9 +598,10 @@ mod impls {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<A: Tuple, F: ?Sized> FnOnce<A> for &F
|
||||
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
|
||||
impl<A: Tuple, F: ?Sized> const FnOnce<A> for &F
|
||||
where
|
||||
F: Fn<A>,
|
||||
F: ~const Fn<A>,
|
||||
{
|
||||
type Output = F::Output;
|
||||
|
||||
@@ -608,9 +611,10 @@ mod impls {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<A: Tuple, F: ?Sized> FnMut<A> for &mut F
|
||||
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
|
||||
impl<A: Tuple, F: ?Sized> const FnMut<A> for &mut F
|
||||
where
|
||||
F: FnMut<A>,
|
||||
F: ~const FnMut<A>,
|
||||
{
|
||||
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
|
||||
(*self).call_mut(args)
|
||||
@@ -618,9 +622,10 @@ mod impls {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<A: Tuple, F: ?Sized> FnOnce<A> for &mut F
|
||||
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
|
||||
impl<A: Tuple, F: ?Sized> const FnOnce<A> for &mut F
|
||||
where
|
||||
F: FnMut<A>,
|
||||
F: ~const FnMut<A>,
|
||||
{
|
||||
type Output = F::Output;
|
||||
extern "rust-call" fn call_once(self, args: A) -> F::Output {
|
||||
|
||||
35
src/test/ui/consts/fn_trait_refs.rs
Normal file
35
src/test/ui/consts/fn_trait_refs.rs
Normal file
@@ -0,0 +1,35 @@
|
||||
// run-pass
|
||||
#![feature(const_fn_trait_ref_impls)]
|
||||
#![feature(fn_traits)]
|
||||
#![feature(unboxed_closures)]
|
||||
#![feature(const_trait_impl)]
|
||||
#![feature(const_mut_refs)]
|
||||
|
||||
use std::marker::Destruct;
|
||||
|
||||
const fn test(i: i32) -> i32 {
|
||||
i + 1
|
||||
}
|
||||
|
||||
const fn call<F: ~const FnMut(i32) -> i32 + ~const Destruct>(mut f: F) -> F::Output {
|
||||
f(5)
|
||||
}
|
||||
|
||||
const fn use_fn<F: ~const FnMut(i32) -> i32 + ~const Destruct>(mut f: F) -> F::Output {
|
||||
call(&mut f)
|
||||
}
|
||||
|
||||
const fn test_fn() {}
|
||||
|
||||
const fn tester<T>(_fn: T)
|
||||
where
|
||||
T: ~const Fn() + ~const Destruct,
|
||||
{
|
||||
}
|
||||
|
||||
const fn main() {
|
||||
tester(test_fn);
|
||||
let test_ref = &test_fn;
|
||||
tester(test_ref);
|
||||
assert!(use_fn(test) == 6);
|
||||
}
|
||||
Reference in New Issue
Block a user