Skip to content

Commit 02db37a

Browse files
Rollup merge of #104113 - ink-feather-org:fix_const_fn_ref_impls, r=compiler-errors
Fix `const_fn_trait_ref_impl`, add test for it #99943 broke `#[feature(const_fn_trait_ref_impl)]`, this PR fixes this and adds a test for it. r? ````@fee1-dead````
2 parents c39cf7a + 87c190c commit 02db37a

File tree

2 files changed

+95
-10
lines changed

2 files changed

+95
-10
lines changed

library/core/src/ops/function.rs

+15-10
Original file line numberDiff line numberDiff line change
@@ -576,29 +576,32 @@ mod impls {
576576
use crate::marker::Tuple;
577577

578578
#[stable(feature = "rust1", since = "1.0.0")]
579-
impl<A: Tuple, F: ?Sized> Fn<A> for &F
579+
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
580+
impl<A: Tuple, F: ?Sized> const Fn<A> for &F
580581
where
581-
F: Fn<A>,
582+
F: ~const Fn<A>,
582583
{
583584
extern "rust-call" fn call(&self, args: A) -> F::Output {
584585
(**self).call(args)
585586
}
586587
}
587588

588589
#[stable(feature = "rust1", since = "1.0.0")]
589-
impl<A: Tuple, F: ?Sized> FnMut<A> for &F
590+
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
591+
impl<A: Tuple, F: ?Sized> const FnMut<A> for &F
590592
where
591-
F: Fn<A>,
593+
F: ~const Fn<A>,
592594
{
593595
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
594596
(**self).call(args)
595597
}
596598
}
597599

598600
#[stable(feature = "rust1", since = "1.0.0")]
599-
impl<A: Tuple, F: ?Sized> FnOnce<A> for &F
601+
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
602+
impl<A: Tuple, F: ?Sized> const FnOnce<A> for &F
600603
where
601-
F: Fn<A>,
604+
F: ~const Fn<A>,
602605
{
603606
type Output = F::Output;
604607

@@ -608,19 +611,21 @@ mod impls {
608611
}
609612

610613
#[stable(feature = "rust1", since = "1.0.0")]
611-
impl<A: Tuple, F: ?Sized> FnMut<A> for &mut F
614+
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
615+
impl<A: Tuple, F: ?Sized> const FnMut<A> for &mut F
612616
where
613-
F: FnMut<A>,
617+
F: ~const FnMut<A>,
614618
{
615619
extern "rust-call" fn call_mut(&mut self, args: A) -> F::Output {
616620
(*self).call_mut(args)
617621
}
618622
}
619623

620624
#[stable(feature = "rust1", since = "1.0.0")]
621-
impl<A: Tuple, F: ?Sized> FnOnce<A> for &mut F
625+
#[rustc_const_unstable(feature = "const_fn_trait_ref_impls", issue = "101803")]
626+
impl<A: Tuple, F: ?Sized> const FnOnce<A> for &mut F
622627
where
623-
F: FnMut<A>,
628+
F: ~const FnMut<A>,
624629
{
625630
type Output = F::Output;
626631
extern "rust-call" fn call_once(self, args: A) -> F::Output {

src/test/ui/consts/fn_trait_refs.rs

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// build-pass
2+
3+
#![feature(const_fn_trait_ref_impls)]
4+
#![feature(fn_traits)]
5+
#![feature(unboxed_closures)]
6+
#![feature(const_trait_impl)]
7+
#![feature(const_mut_refs)]
8+
#![feature(const_cmp)]
9+
#![feature(const_refs_to_cell)]
10+
11+
use std::marker::Destruct;
12+
13+
const fn tester_fn<T>(f: T) -> T::Output
14+
where
15+
T: ~const Fn<()> + ~const Destruct,
16+
{
17+
f()
18+
}
19+
20+
const fn tester_fn_mut<T>(mut f: T) -> T::Output
21+
where
22+
T: ~const FnMut<()> + ~const Destruct,
23+
{
24+
f()
25+
}
26+
27+
const fn tester_fn_once<T>(f: T) -> T::Output
28+
where
29+
T: ~const FnOnce<()>,
30+
{
31+
f()
32+
}
33+
34+
const fn test_fn<T>(mut f: T) -> (T::Output, T::Output, T::Output)
35+
where
36+
T: ~const Fn<()> + ~const Destruct,
37+
{
38+
(
39+
// impl<A: Tuple, F: ~const Fn + ?Sized> const Fn<A> for &F
40+
tester_fn(&f),
41+
// impl<A: Tuple, F: ~const Fn + ?Sized> const FnMut<A> for &F
42+
tester_fn_mut(&f),
43+
// impl<A: Tuple, F: ~const Fn + ?Sized> const FnOnce<A> for &F
44+
tester_fn_once(&f),
45+
)
46+
}
47+
48+
const fn test_fn_mut<T>(mut f: T) -> (T::Output, T::Output)
49+
where
50+
T: ~const FnMut<()> + ~const Destruct,
51+
{
52+
(
53+
// impl<A: Tuple, F: ~const FnMut + ?Sized> const FnMut<A> for &mut F
54+
tester_fn_mut(&mut f),
55+
// impl<A: Tuple, F: ~const FnMut + ?Sized> const FnOnce<A> for &mut F
56+
tester_fn_once(&mut f),
57+
)
58+
}
59+
const fn test(i: i32) -> i32 {
60+
i + 1
61+
}
62+
63+
const fn main() {
64+
const fn one() -> i32 {
65+
1
66+
};
67+
const fn two() -> i32 {
68+
2
69+
};
70+
71+
// FIXME(const_cmp_tuple)
72+
let test_one = test_fn(one);
73+
assert!(test_one.0 == 1);
74+
assert!(test_one.1 == 1);
75+
assert!(test_one.2 == 1);
76+
77+
let test_two = test_fn_mut(two);
78+
assert!(test_two.0 == 1);
79+
assert!(test_two.1 == 1);
80+
}

0 commit comments

Comments
 (0)