Skip to content

Commit acb832d

Browse files
committed
Use associative type defaults in {Layout,FnAbi}OfHelpers.
This avoids some repetitive boilerplate code.
1 parent a8d22eb commit acb832d

File tree

8 files changed

+5
-34
lines changed

8 files changed

+5
-34
lines changed

compiler/rustc_codegen_cranelift/src/common.rs

-8
Original file line numberDiff line numberDiff line change
@@ -309,17 +309,13 @@ pub(crate) struct FunctionCx<'m, 'clif, 'tcx: 'm> {
309309
}
310310

311311
impl<'tcx> LayoutOfHelpers<'tcx> for FunctionCx<'_, '_, 'tcx> {
312-
type LayoutOfResult = TyAndLayout<'tcx>;
313-
314312
#[inline]
315313
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
316314
RevealAllLayoutCx(self.tcx).handle_layout_err(err, span, ty)
317315
}
318316
}
319317

320318
impl<'tcx> FnAbiOfHelpers<'tcx> for FunctionCx<'_, '_, 'tcx> {
321-
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>;
322-
323319
#[inline]
324320
fn handle_fn_abi_err(
325321
&self,
@@ -450,8 +446,6 @@ impl<'tcx> FunctionCx<'_, '_, 'tcx> {
450446
pub(crate) struct RevealAllLayoutCx<'tcx>(pub(crate) TyCtxt<'tcx>);
451447

452448
impl<'tcx> LayoutOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
453-
type LayoutOfResult = TyAndLayout<'tcx>;
454-
455449
#[inline]
456450
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
457451
if let LayoutError::SizeOverflow(_) | LayoutError::ReferencesError(_) = err {
@@ -466,8 +460,6 @@ impl<'tcx> LayoutOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
466460
}
467461

468462
impl<'tcx> FnAbiOfHelpers<'tcx> for RevealAllLayoutCx<'tcx> {
469-
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>;
470-
471463
#[inline]
472464
fn handle_fn_abi_err(
473465
&self,

compiler/rustc_codegen_gcc/src/builder.rs

-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use rustc_middle::bug;
2323
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
2424
use rustc_middle::ty::layout::{
2525
FnAbiError, FnAbiOfHelpers, FnAbiRequest, HasParamEnv, HasTyCtxt, LayoutError, LayoutOfHelpers,
26-
TyAndLayout,
2726
};
2827
use rustc_middle::ty::{Instance, ParamEnv, Ty, TyCtxt};
2928
use rustc_span::def_id::DefId;
@@ -473,17 +472,13 @@ impl HasDataLayout for Builder<'_, '_, '_> {
473472
}
474473

475474
impl<'tcx> LayoutOfHelpers<'tcx> for Builder<'_, '_, 'tcx> {
476-
type LayoutOfResult = TyAndLayout<'tcx>;
477-
478475
#[inline]
479476
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
480477
self.cx.handle_layout_err(err, span, ty)
481478
}
482479
}
483480

484481
impl<'tcx> FnAbiOfHelpers<'tcx> for Builder<'_, '_, 'tcx> {
485-
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>;
486-
487482
#[inline]
488483
fn handle_fn_abi_err(
489484
&self,

compiler/rustc_codegen_gcc/src/context.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,12 @@ use rustc_middle::mir::mono::CodegenUnit;
1212
use rustc_middle::span_bug;
1313
use rustc_middle::ty::layout::{
1414
FnAbiError, FnAbiOf, FnAbiOfHelpers, FnAbiRequest, HasParamEnv, HasTyCtxt, LayoutError,
15-
LayoutOfHelpers, TyAndLayout,
15+
LayoutOfHelpers,
1616
};
1717
use rustc_middle::ty::{self, Instance, ParamEnv, PolyExistentialTraitRef, Ty, TyCtxt};
1818
use rustc_session::Session;
1919
use rustc_span::source_map::respan;
2020
use rustc_span::{Span, DUMMY_SP};
21-
use rustc_target::abi::call::FnAbi;
2221
use rustc_target::abi::{HasDataLayout, PointeeInfo, Size, TargetDataLayout, VariantIdx};
2322
use rustc_target::spec::{HasTargetSpec, HasWasmCAbiOpt, Target, TlsModel, WasmCAbi};
2423

@@ -572,8 +571,6 @@ impl<'gcc, 'tcx> HasWasmCAbiOpt for CodegenCx<'gcc, 'tcx> {
572571
}
573572

574573
impl<'gcc, 'tcx> LayoutOfHelpers<'tcx> for CodegenCx<'gcc, 'tcx> {
575-
type LayoutOfResult = TyAndLayout<'tcx>;
576-
577574
#[inline]
578575
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
579576
if let LayoutError::SizeOverflow(_) | LayoutError::ReferencesError(_) = err {
@@ -585,8 +582,6 @@ impl<'gcc, 'tcx> LayoutOfHelpers<'tcx> for CodegenCx<'gcc, 'tcx> {
585582
}
586583

587584
impl<'gcc, 'tcx> FnAbiOfHelpers<'tcx> for CodegenCx<'gcc, 'tcx> {
588-
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>;
589-
590585
#[inline]
591586
fn handle_fn_abi_err(
592587
&self,

compiler/rustc_codegen_llvm/src/builder.rs

-4
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,13 @@ impl HasTargetSpec for Builder<'_, '_, '_> {
9393
}
9494

9595
impl<'tcx> LayoutOfHelpers<'tcx> for Builder<'_, '_, 'tcx> {
96-
type LayoutOfResult = TyAndLayout<'tcx>;
97-
9896
#[inline]
9997
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
10098
self.cx.handle_layout_err(err, span, ty)
10199
}
102100
}
103101

104102
impl<'tcx> FnAbiOfHelpers<'tcx> for Builder<'_, '_, 'tcx> {
105-
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>;
106-
107103
#[inline]
108104
fn handle_fn_abi_err(
109105
&self,

compiler/rustc_codegen_llvm/src/context.rs

-6
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use rustc_middle::middle::codegen_fn_attrs::PatchableFunctionEntry;
1515
use rustc_middle::mir::mono::CodegenUnit;
1616
use rustc_middle::ty::layout::{
1717
FnAbiError, FnAbiOfHelpers, FnAbiRequest, HasParamEnv, LayoutError, LayoutOfHelpers,
18-
TyAndLayout,
1918
};
2019
use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
2120
use rustc_middle::{bug, span_bug};
@@ -25,7 +24,6 @@ use rustc_session::config::{
2524
use rustc_session::Session;
2625
use rustc_span::source_map::Spanned;
2726
use rustc_span::{Span, DUMMY_SP};
28-
use rustc_target::abi::call::FnAbi;
2927
use rustc_target::abi::{HasDataLayout, TargetDataLayout, VariantIdx};
3028
use rustc_target::spec::{HasTargetSpec, RelocModel, SmallDataThresholdSupport, Target, TlsModel};
3129
use smallvec::SmallVec;
@@ -1158,8 +1156,6 @@ impl<'tcx, 'll> HasParamEnv<'tcx> for CodegenCx<'ll, 'tcx> {
11581156
}
11591157

11601158
impl<'tcx> LayoutOfHelpers<'tcx> for CodegenCx<'_, 'tcx> {
1161-
type LayoutOfResult = TyAndLayout<'tcx>;
1162-
11631159
#[inline]
11641160
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
11651161
if let LayoutError::SizeOverflow(_) | LayoutError::ReferencesError(_) = err {
@@ -1171,8 +1167,6 @@ impl<'tcx> LayoutOfHelpers<'tcx> for CodegenCx<'_, 'tcx> {
11711167
}
11721168

11731169
impl<'tcx> FnAbiOfHelpers<'tcx> for CodegenCx<'_, 'tcx> {
1174-
type FnAbiOfResult = &'tcx FnAbi<'tcx, Ty<'tcx>>;
1175-
11761170
#[inline]
11771171
fn handle_fn_abi_err(
11781172
&self,

compiler/rustc_middle/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#![feature(allocator_api)]
3434
#![feature(array_windows)]
3535
#![feature(assert_matches)]
36+
#![feature(associated_type_defaults)]
3637
#![feature(box_as_ptr)]
3738
#![feature(box_patterns)]
3839
#![feature(closure_track_caller)]

compiler/rustc_middle/src/ty/layout.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,7 @@ pub type TyAndLayout<'tcx> = rustc_target::abi::TyAndLayout<'tcx, Ty<'tcx>>;
634634
pub trait LayoutOfHelpers<'tcx>: HasDataLayout + HasTyCtxt<'tcx> + HasParamEnv<'tcx> {
635635
/// The `TyAndLayout`-wrapping type (or `TyAndLayout` itself), which will be
636636
/// returned from `layout_of` (see also `handle_layout_err`).
637-
type LayoutOfResult: MaybeResult<TyAndLayout<'tcx>>;
637+
type LayoutOfResult: MaybeResult<TyAndLayout<'tcx>> = TyAndLayout<'tcx>;
638638

639639
/// `Span` to use for `tcx.at(span)`, from `layout_of`.
640640
// FIXME(eddyb) perhaps make this mandatory to get contexts to track it better?
@@ -1259,7 +1259,7 @@ pub enum FnAbiRequest<'tcx> {
12591259
pub trait FnAbiOfHelpers<'tcx>: LayoutOfHelpers<'tcx> {
12601260
/// The `&FnAbi`-wrapping type (or `&FnAbi` itself), which will be
12611261
/// returned from `fn_abi_of_*` (see also `handle_fn_abi_err`).
1262-
type FnAbiOfResult: MaybeResult<&'tcx FnAbi<'tcx, Ty<'tcx>>>;
1262+
type FnAbiOfResult: MaybeResult<&'tcx FnAbi<'tcx, Ty<'tcx>>> = &'tcx FnAbi<'tcx, Ty<'tcx>>;
12631263

12641264
/// Helper used for `fn_abi_of_*`, to adapt `tcx.fn_abi_of_*(...)` into a
12651265
/// `Self::FnAbiOfResult` (which does not need to be a `Result<...>`).

compiler/rustc_passes/src/layout_test.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use rustc_ast::Attribute;
22
use rustc_hir::def::DefKind;
33
use rustc_hir::def_id::LocalDefId;
44
use rustc_middle::span_bug;
5-
use rustc_middle::ty::layout::{HasParamEnv, HasTyCtxt, LayoutError, LayoutOfHelpers, TyAndLayout};
5+
use rustc_middle::ty::layout::{HasParamEnv, HasTyCtxt, LayoutError, LayoutOfHelpers};
66
use rustc_middle::ty::{self, ParamEnv, Ty, TyCtxt};
77
use rustc_span::source_map::Spanned;
88
use rustc_span::symbol::sym;
@@ -139,8 +139,6 @@ struct UnwrapLayoutCx<'tcx> {
139139
}
140140

141141
impl<'tcx> LayoutOfHelpers<'tcx> for UnwrapLayoutCx<'tcx> {
142-
type LayoutOfResult = TyAndLayout<'tcx>;
143-
144142
fn handle_layout_err(&self, err: LayoutError<'tcx>, span: Span, ty: Ty<'tcx>) -> ! {
145143
span_bug!(span, "`#[rustc_layout(..)]` test resulted in `layout_of({ty}) = Err({err})`",);
146144
}

0 commit comments

Comments
 (0)