Skip to content

Commit 586951c

Browse files
committedSep 13, 2023
Stabilize AFIT and RPITIT
1 parent e5fedce commit 586951c

File tree

203 files changed

+258
-693
lines changed

Some content is hidden

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

203 files changed

+258
-693
lines changed
 

‎compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 17 additions & 53 deletions
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

Lines changed: 4 additions & 0 deletions
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).

0 commit comments

Comments
 (0)