Skip to content

Commit fc32ded

Browse files
Stabilize AFIT and RPITIT
1 parent e5fedce commit fc32ded

File tree

210 files changed

+282
-996
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

210 files changed

+282
-996
lines changed

compiler/rustc_ast_lowering/src/lib.rs

+17-53
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,6 @@ enum ImplTraitPosition {
271271
ClosureReturn,
272272
PointerReturn,
273273
FnTraitReturn,
274-
TraitReturn,
275-
ImplReturn,
276274
GenericDefault,
277275
ConstTy,
278276
StaticTy,
@@ -302,8 +300,6 @@ impl std::fmt::Display for ImplTraitPosition {
302300
ImplTraitPosition::ClosureReturn => "closure return types",
303301
ImplTraitPosition::PointerReturn => "`fn` pointer return types",
304302
ImplTraitPosition::FnTraitReturn => "`Fn` trait return types",
305-
ImplTraitPosition::TraitReturn => "trait method return types",
306-
ImplTraitPosition::ImplReturn => "`impl` method return types",
307303
ImplTraitPosition::GenericDefault => "generic parameter defaults",
308304
ImplTraitPosition::ConstTy => "const types",
309305
ImplTraitPosition::StaticTy => "static types",
@@ -334,20 +330,16 @@ impl FnDeclKind {
334330
matches!(self, FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl | FnDeclKind::Trait)
335331
}
336332

337-
fn return_impl_trait_allowed(&self, tcx: TyCtxt<'_>) -> bool {
333+
fn return_impl_trait_allowed(&self) -> bool {
338334
match self {
339-
FnDeclKind::Fn | FnDeclKind::Inherent => true,
340-
FnDeclKind::Impl if tcx.features().return_position_impl_trait_in_trait => true,
341-
FnDeclKind::Trait if tcx.features().return_position_impl_trait_in_trait => true,
335+
FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl | FnDeclKind::Trait => true,
342336
_ => false,
343337
}
344338
}
345339

346-
fn async_fn_allowed(&self, tcx: TyCtxt<'_>) -> bool {
340+
fn async_fn_allowed(&self) -> bool {
347341
match self {
348-
FnDeclKind::Fn | FnDeclKind::Inherent => true,
349-
FnDeclKind::Impl if tcx.features().async_fn_in_trait => true,
350-
FnDeclKind::Trait if tcx.features().async_fn_in_trait => true,
342+
FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl | FnDeclKind::Trait => true,
351343
_ => false,
352344
}
353345
}
@@ -1806,52 +1798,33 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
18061798
}));
18071799

18081800
let output = if let Some((ret_id, span)) = make_ret_async {
1809-
if !kind.async_fn_allowed(self.tcx) {
1810-
match kind {
1811-
FnDeclKind::Trait | FnDeclKind::Impl => {
1812-
self.tcx
1813-
.sess
1814-
.create_feature_err(
1815-
TraitFnAsync { fn_span, span },
1816-
sym::async_fn_in_trait,
1817-
)
1818-
.emit();
1819-
}
1820-
_ => {
1821-
self.tcx.sess.emit_err(TraitFnAsync { fn_span, span });
1822-
}
1823-
}
1801+
if !kind.async_fn_allowed() {
1802+
self.tcx.sess.emit_err(TraitFnAsync { fn_span, span });
18241803
}
18251804

18261805
let fn_def_id = self.local_def_id(fn_node_id);
18271806
self.lower_async_fn_ret_ty(&decl.output, fn_def_id, ret_id, kind)
18281807
} else {
18291808
match &decl.output {
18301809
FnRetTy::Ty(ty) => {
1831-
let context = if kind.return_impl_trait_allowed(self.tcx) {
1810+
let context = if kind.return_impl_trait_allowed() {
18321811
let fn_def_id = self.local_def_id(fn_node_id);
18331812
ImplTraitContext::ReturnPositionOpaqueTy {
18341813
origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
18351814
fn_kind: kind,
18361815
}
18371816
} else {
1838-
let position = match kind {
1839-
FnDeclKind::Fn | FnDeclKind::Inherent => {
1840-
unreachable!("fn should allow in-band lifetimes")
1817+
ImplTraitContext::Disallowed(match kind {
1818+
FnDeclKind::Fn
1819+
| FnDeclKind::Inherent
1820+
| FnDeclKind::Trait
1821+
| FnDeclKind::Impl => {
1822+
unreachable!("fn should allow return-position impl trait in traits")
18411823
}
18421824
FnDeclKind::ExternFn => ImplTraitPosition::ExternFnReturn,
18431825
FnDeclKind::Closure => ImplTraitPosition::ClosureReturn,
18441826
FnDeclKind::Pointer => ImplTraitPosition::PointerReturn,
1845-
FnDeclKind::Trait => ImplTraitPosition::TraitReturn,
1846-
FnDeclKind::Impl => ImplTraitPosition::ImplReturn,
1847-
};
1848-
match kind {
1849-
FnDeclKind::Trait | FnDeclKind::Impl => ImplTraitContext::FeatureGated(
1850-
position,
1851-
sym::return_position_impl_trait_in_trait,
1852-
),
1853-
_ => ImplTraitContext::Disallowed(position),
1854-
}
1827+
})
18551828
};
18561829
hir::FnRetTy::Return(self.lower_ty(ty, &context))
18571830
}
@@ -1923,18 +1896,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19231896
let future_bound = this.lower_async_fn_output_type_to_future_bound(
19241897
output,
19251898
span,
1926-
if let FnDeclKind::Trait = fn_kind
1927-
&& !this.tcx.features().return_position_impl_trait_in_trait
1928-
{
1929-
ImplTraitContext::FeatureGated(
1930-
ImplTraitPosition::TraitReturn,
1931-
sym::return_position_impl_trait_in_trait,
1932-
)
1933-
} else {
1934-
ImplTraitContext::ReturnPositionOpaqueTy {
1935-
origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
1936-
fn_kind,
1937-
}
1899+
ImplTraitContext::ReturnPositionOpaqueTy {
1900+
origin: hir::OpaqueTyOrigin::FnReturn(fn_def_id),
1901+
fn_kind,
19381902
},
19391903
);
19401904
arena_vec![this; future_bound]

compiler/rustc_feature/src/accepted.rs

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ declare_features! (
6767
(accepted, associated_types, "1.0.0", None, None),
6868
/// Allows free and inherent `async fn`s, `async` blocks, and `<expr>.await` expressions.
6969
(accepted, async_await, "1.39.0", Some(50547), None),
70+
/// Allows async functions to be declared, implemented, and used in traits.
71+
(accepted, async_fn_in_trait, "1.66.0", Some(91611), None),
7072
/// Allows all literals in attribute lists and values of key-value pairs.
7173
(accepted, attr_literals, "1.30.0", Some(34981), None),
7274
/// Allows overloading augmented assignment operations like `a += b`.
@@ -302,6 +304,8 @@ declare_features! (
302304
(accepted, repr_packed, "1.33.0", Some(33158), None),
303305
/// Allows `#[repr(transparent)]` attribute on newtype structs.
304306
(accepted, repr_transparent, "1.28.0", Some(43036), None),
307+
/// Allows return-position `impl Trait` in traits.
308+
(accepted, return_position_impl_trait_in_trait, "1.65.0", Some(91611), None),
305309
/// Allows code like `let x: &'static u32 = &42` to work (RFC 1414).
306310
(accepted, rvalue_static_promotion, "1.21.0", Some(38865), None),
307311
/// Allows `Self` in type definitions (RFC 2300).

compiler/rustc_feature/src/active.rs

-4
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,6 @@ declare_features! (
338338
(active, associated_type_defaults, "1.2.0", Some(29661), None),
339339
/// Allows `async || body` closures.
340340
(active, async_closure, "1.37.0", Some(62290), None),
341-
/// Allows async functions to be declared, implemented, and used in traits.
342-
(active, async_fn_in_trait, "1.66.0", Some(91611), None),
343341
/// Allows `#[track_caller]` on async functions.
344342
(active, async_fn_track_caller, "1.73.0", Some(110011), None),
345343
/// Allows builtin # foo() syntax
@@ -540,8 +538,6 @@ declare_features! (
540538
(incomplete, repr128, "1.16.0", Some(56071), None),
541539
/// Allows `repr(simd)` and importing the various simd intrinsics.
542540
(active, repr_simd, "1.4.0", Some(27731), None),
543-
/// Allows return-position `impl Trait` in traits.
544-
(active, return_position_impl_trait_in_trait, "1.65.0", Some(91611), None),
545541
/// Allows bounding the return type of AFIT/RPITIT.
546542
(incomplete, return_type_notation, "1.70.0", Some(109417), None),
547543
/// Allows `extern "rust-cold"`.

compiler/rustc_hir_analysis/src/check/check.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -904,21 +904,21 @@ fn check_impl_items_against_trait<'tcx>(
904904
let (msg, feature) = if tcx.asyncness(def_id).is_async() {
905905
(
906906
format!("async {descr} in trait cannot be specialized"),
907-
sym::async_fn_in_trait,
907+
"async functions in traits",
908908
)
909909
} else {
910910
(
911911
format!(
912912
"{descr} with return-position `impl Trait` in trait cannot be specialized"
913913
),
914-
sym::return_position_impl_trait_in_trait,
914+
"return position `impl Trait` in traits",
915915
)
916916
};
917917
tcx.sess
918918
.struct_span_err(tcx.def_span(def_id), msg)
919919
.note(format!(
920920
"specialization behaves in inconsistent and \
921-
surprising ways with `#![feature({feature})]`, \
921+
surprising ways with {feature}, \
922922
and for now is disallowed"
923923
))
924924
.emit();

compiler/rustc_hir_analysis/src/check/compare_impl_item.rs

-2
Original file line numberDiff line numberDiff line change
@@ -631,8 +631,6 @@ fn compare_asyncness<'tcx>(
631631
/// For example, given the sample code:
632632
///
633633
/// ```
634-
/// #![feature(return_position_impl_trait_in_trait)]
635-
///
636634
/// use std::ops::Deref;
637635
///
638636
/// trait Foo {

compiler/rustc_lint_defs/src/builtin.rs

-1
Original file line numberDiff line numberDiff line change
@@ -4491,7 +4491,6 @@ declare_lint! {
44914491
/// ### Example
44924492
///
44934493
/// ```rust,compile_fail
4494-
/// #![feature(return_position_impl_trait_in_trait)]
44954494
/// #![deny(refining_impl_trait)]
44964495
///
44974496
/// use std::fmt::Display;

src/tools/clippy/tests/ui/enum_clike_unportable_variant.stderr

+9-8
Original file line numberDiff line numberDiff line change
@@ -5,51 +5,52 @@ LL | X = 0x1_0000_0000,
55
| ^^^^^^^^^^^^^^^^^
66
|
77
= note: `-D clippy::enum-clike-unportable-variant` implied by `-D warnings`
8+
= help: to override `-D warnings` add `#[allow(clippy::enum_clike_unportable_variant)]`
89

910
error: C-like enum variant discriminant is not portable to 32-bit targets
10-
--> $DIR/enum_clike_unportable_variant.rs:15:5
11+
--> $DIR/enum_clike_unportable_variant.rs:17:5
1112
|
1213
LL | X = 0x1_0000_0000,
1314
| ^^^^^^^^^^^^^^^^^
1415

1516
error: C-like enum variant discriminant is not portable to 32-bit targets
16-
--> $DIR/enum_clike_unportable_variant.rs:18:5
17+
--> $DIR/enum_clike_unportable_variant.rs:21:5
1718
|
1819
LL | A = 0xFFFF_FFFF,
1920
| ^^^^^^^^^^^^^^^
2021

2122
error: C-like enum variant discriminant is not portable to 32-bit targets
22-
--> $DIR/enum_clike_unportable_variant.rs:25:5
23+
--> $DIR/enum_clike_unportable_variant.rs:29:5
2324
|
2425
LL | Z = 0xFFFF_FFFF,
2526
| ^^^^^^^^^^^^^^^
2627

2728
error: C-like enum variant discriminant is not portable to 32-bit targets
28-
--> $DIR/enum_clike_unportable_variant.rs:26:5
29+
--> $DIR/enum_clike_unportable_variant.rs:31:5
2930
|
3031
LL | A = 0x1_0000_0000,
3132
| ^^^^^^^^^^^^^^^^^
3233

3334
error: C-like enum variant discriminant is not portable to 32-bit targets
34-
--> $DIR/enum_clike_unportable_variant.rs:28:5
35+
--> $DIR/enum_clike_unportable_variant.rs:34:5
3536
|
3637
LL | C = (i32::MIN as isize) - 1,
3738
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
3839

3940
error: C-like enum variant discriminant is not portable to 32-bit targets
40-
--> $DIR/enum_clike_unportable_variant.rs:34:5
41+
--> $DIR/enum_clike_unportable_variant.rs:41:5
4142
|
4243
LL | Z = 0xFFFF_FFFF,
4344
| ^^^^^^^^^^^^^^^
4445

4546
error: C-like enum variant discriminant is not portable to 32-bit targets
46-
--> $DIR/enum_clike_unportable_variant.rs:35:5
47+
--> $DIR/enum_clike_unportable_variant.rs:43:5
4748
|
4849
LL | A = 0x1_0000_0000,
4950
| ^^^^^^^^^^^^^^^^^
5051

5152
error: C-like enum variant discriminant is not portable to 32-bit targets
52-
--> $DIR/enum_clike_unportable_variant.rs:40:5
53+
--> $DIR/enum_clike_unportable_variant.rs:49:5
5354
|
5455
LL | X = <usize as Trait>::Number,
5556
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

src/tools/clippy/tests/ui/implied_bounds_in_impls.fixed

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#![warn(clippy::implied_bounds_in_impls)]
22
#![allow(dead_code)]
3-
#![feature(return_position_impl_trait_in_trait)]
43

54
use std::ops::{Deref, DerefMut};
65

src/tools/clippy/tests/ui/implied_bounds_in_impls.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#![warn(clippy::implied_bounds_in_impls)]
22
#![allow(dead_code)]
3-
#![feature(return_position_impl_trait_in_trait)]
43

54
use std::ops::{Deref, DerefMut};
65

src/tools/clippy/tests/ui/implied_bounds_in_impls.stderr

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: this bound is already specified as the supertrait of `DerefMut<Target = T>`
2-
--> $DIR/implied_bounds_in_impls.rs:13:36
2+
--> $DIR/implied_bounds_in_impls.rs:12:36
33
|
44
LL | fn deref_derefmut<T>(x: T) -> impl Deref<Target = T> + DerefMut<Target = T> {
55
| ^^^^^^^^^^^^^^^^^
@@ -13,7 +13,7 @@ LL + fn deref_derefmut<T>(x: T) -> impl DerefMut<Target = T> {
1313
|
1414

1515
error: this bound is already specified as the supertrait of `GenericSubtrait<U, W, U>`
16-
--> $DIR/implied_bounds_in_impls.rs:30:37
16+
--> $DIR/implied_bounds_in_impls.rs:29:37
1717
|
1818
LL | fn generics_implied<U, W>() -> impl GenericTrait<W> + GenericSubtrait<U, W, U>
1919
| ^^^^^^^^^^^^^^^
@@ -25,7 +25,7 @@ LL + fn generics_implied<U, W>() -> impl GenericSubtrait<U, W, U>
2525
|
2626

2727
error: this bound is already specified as the supertrait of `GenericSubtrait<(), i32, V>`
28-
--> $DIR/implied_bounds_in_impls.rs:36:40
28+
--> $DIR/implied_bounds_in_impls.rs:35:40
2929
|
3030
LL | fn generics_implied_multi<V>() -> impl GenericTrait<i32> + GenericTrait2<V> + GenericSubtrait<(), i32, V> {}
3131
| ^^^^^^^^^^^^^^^^^
@@ -37,7 +37,7 @@ LL + fn generics_implied_multi<V>() -> impl GenericTrait2<V> + GenericSubtrait<(
3737
|
3838

3939
error: this bound is already specified as the supertrait of `GenericSubtrait<(), i32, V>`
40-
--> $DIR/implied_bounds_in_impls.rs:36:60
40+
--> $DIR/implied_bounds_in_impls.rs:35:60
4141
|
4242
LL | fn generics_implied_multi<V>() -> impl GenericTrait<i32> + GenericTrait2<V> + GenericSubtrait<(), i32, V> {}
4343
| ^^^^^^^^^^^^^^^^
@@ -49,7 +49,7 @@ LL + fn generics_implied_multi<V>() -> impl GenericTrait<i32> + GenericSubtrait<
4949
|
5050

5151
error: this bound is already specified as the supertrait of `GenericSubtrait<(), T, V>`
52-
--> $DIR/implied_bounds_in_impls.rs:38:44
52+
--> $DIR/implied_bounds_in_impls.rs:37:44
5353
|
5454
LL | fn generics_implied_multi2<T, V>() -> impl GenericTrait<T> + GenericTrait2<V> + GenericSubtrait<(), T, V>
5555
| ^^^^^^^^^^^^^^^
@@ -61,7 +61,7 @@ LL + fn generics_implied_multi2<T, V>() -> impl GenericTrait2<V> + GenericSubtra
6161
|
6262

6363
error: this bound is already specified as the supertrait of `GenericSubtrait<(), T, V>`
64-
--> $DIR/implied_bounds_in_impls.rs:38:62
64+
--> $DIR/implied_bounds_in_impls.rs:37:62
6565
|
6666
LL | fn generics_implied_multi2<T, V>() -> impl GenericTrait<T> + GenericTrait2<V> + GenericSubtrait<(), T, V>
6767
| ^^^^^^^^^^^^^^^^
@@ -73,7 +73,7 @@ LL + fn generics_implied_multi2<T, V>() -> impl GenericTrait<T> + GenericSubtrai
7373
|
7474

7575
error: this bound is already specified as the supertrait of `GenericSubtrait<(), i32, ()>`
76-
--> $DIR/implied_bounds_in_impls.rs:48:28
76+
--> $DIR/implied_bounds_in_impls.rs:47:28
7777
|
7878
LL | fn generics_same() -> impl GenericTrait<i32> + GenericSubtrait<(), i32, ()> {}
7979
| ^^^^^^^^^^^^^^^^^
@@ -85,7 +85,7 @@ LL + fn generics_same() -> impl GenericSubtrait<(), i32, ()> {}
8585
|
8686

8787
error: this bound is already specified as the supertrait of `DerefMut<Target = u8>`
88-
--> $DIR/implied_bounds_in_impls.rs:52:20
88+
--> $DIR/implied_bounds_in_impls.rs:51:20
8989
|
9090
LL | fn f() -> impl Deref + DerefMut<Target = u8>;
9191
| ^^^^^
@@ -97,7 +97,7 @@ LL + fn f() -> impl DerefMut<Target = u8>;
9797
|
9898

9999
error: this bound is already specified as the supertrait of `DerefMut<Target = u8>`
100-
--> $DIR/implied_bounds_in_impls.rs:57:20
100+
--> $DIR/implied_bounds_in_impls.rs:56:20
101101
|
102102
LL | fn f() -> impl Deref + DerefMut<Target = u8> {
103103
| ^^^^^
@@ -109,7 +109,7 @@ LL + fn f() -> impl DerefMut<Target = u8> {
109109
|
110110

111111
error: this bound is already specified as the supertrait of `DerefMut<Target = u8>`
112-
--> $DIR/implied_bounds_in_impls.rs:63:20
112+
--> $DIR/implied_bounds_in_impls.rs:62:20
113113
|
114114
LL | fn f() -> impl Deref + DerefMut<Target = u8> {
115115
| ^^^^^

src/tools/clippy/tests/ui/unused_async.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
#![warn(clippy::unused_async)]
2-
#![feature(async_fn_in_trait)]
32
#![allow(incomplete_features)]
43

54
use std::future::Future;

0 commit comments

Comments
 (0)