Skip to content

Commit 88ea7e5

Browse files
committed
Use min_specialization in the remaining rustc crates
1 parent feb3536 commit 88ea7e5

File tree

22 files changed

+373
-248
lines changed

22 files changed

+373
-248
lines changed

src/librustc_arena/lib.rs

+19-10
Original file line numberDiff line numberDiff line change
@@ -610,7 +610,7 @@ macro_rules! which_arena_for_type {
610610

611611
#[macro_export]
612612
macro_rules! declare_arena {
613-
([], [$($a:tt $name:ident: $ty:ty,)*], $tcx:lifetime) => {
613+
([], [$($a:tt $name:ident: $ty:ty, $gen_ty:ty;)*], $tcx:lifetime) => {
614614
#[derive(Default)]
615615
pub struct Arena<$tcx> {
616616
pub dropless: $crate::DroplessArena,
@@ -619,17 +619,17 @@ macro_rules! declare_arena {
619619
}
620620

621621
#[marker]
622-
pub trait ArenaAllocatable {}
622+
pub trait ArenaAllocatable<'tcx> {}
623623

624-
impl<T: Copy> ArenaAllocatable for T {}
624+
impl<'tcx, T: Copy> ArenaAllocatable<'tcx> for T {}
625625

626-
unsafe trait ArenaField<'tcx>: Sized {
626+
unsafe trait ArenaField<'tcx>: Sized + ArenaAllocatable<'tcx> {
627627
/// Returns a specific arena to allocate from.
628628
/// If `None` is returned, the `DropArena` will be used.
629629
fn arena<'a>(arena: &'a Arena<'tcx>) -> Option<&'a $crate::TypedArena<Self>>;
630630
}
631631

632-
unsafe impl<'tcx, T> ArenaField<'tcx> for T {
632+
unsafe impl<'tcx, T: ArenaAllocatable<'tcx>> ArenaField<'tcx> for T {
633633
#[inline]
634634
default fn arena<'a>(_: &'a Arena<'tcx>) -> Option<&'a $crate::TypedArena<Self>> {
635635
panic!()
@@ -638,18 +638,27 @@ macro_rules! declare_arena {
638638

639639
$(
640640
#[allow(unused_lifetimes)]
641-
impl<$tcx> ArenaAllocatable for $ty {}
642-
unsafe impl<$tcx> ArenaField<$tcx> for $ty {
641+
impl<$tcx> ArenaAllocatable<$tcx> for $ty {}
642+
unsafe impl<$tcx, '_x, '_y, '_z, '_w> ArenaField<$tcx> for $gen_ty where Self: ArenaAllocatable<$tcx> {
643643
#[inline]
644644
fn arena<'a>(_arena: &'a Arena<$tcx>) -> Option<&'a $crate::TypedArena<Self>> {
645-
$crate::which_arena_for_type!($a[&_arena.$name])
645+
// SAFETY: We only implement `ArenaAllocatable<$tcx>` for
646+
// `$ty`, so `$ty` and Self are the same type
647+
unsafe {
648+
::std::mem::transmute::<
649+
Option<&'a $crate::TypedArena<$ty>>,
650+
Option<&'a $crate::TypedArena<Self>>,
651+
>(
652+
$crate::which_arena_for_type!($a[&_arena.$name])
653+
)
654+
}
646655
}
647656
}
648657
)*
649658

650659
impl<'tcx> Arena<'tcx> {
651660
#[inline]
652-
pub fn alloc<T: ArenaAllocatable>(&self, value: T) -> &mut T {
661+
pub fn alloc<T: ArenaAllocatable<'tcx>>(&self, value: T) -> &mut T {
653662
if !::std::mem::needs_drop::<T>() {
654663
return self.dropless.alloc(value);
655664
}
@@ -667,7 +676,7 @@ macro_rules! declare_arena {
667676
self.dropless.alloc_slice(value)
668677
}
669678

670-
pub fn alloc_from_iter<'a, T: ArenaAllocatable>(
679+
pub fn alloc_from_iter<'a, T: ArenaAllocatable<'tcx>>(
671680
&'a self,
672681
iter: impl ::std::iter::IntoIterator<Item = T>,
673682
) -> &'a mut [T] {

src/librustc_ast_lowering/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#![feature(array_value_iter)]
3434
#![feature(crate_visibility_modifier)]
3535
#![feature(marker_trait_attr)]
36-
#![feature(specialization)] // FIXME: min_specialization does not work
36+
#![feature(min_specialization)]
3737
#![feature(or_patterns)]
3838
#![recursion_limit = "256"]
3939

src/librustc_hir/arena.rs

+35-35
Original file line numberDiff line numberDiff line change
@@ -12,41 +12,41 @@ macro_rules! arena_types {
1212
($macro:path, $args:tt, $tcx:lifetime) => (
1313
$macro!($args, [
1414
// HIR types
15-
[few] hir_krate: rustc_hir::Crate<$tcx>,
16-
[] arm: rustc_hir::Arm<$tcx>,
17-
[] asm_operand: rustc_hir::InlineAsmOperand<$tcx>,
18-
[] asm_template: rustc_ast::ast::InlineAsmTemplatePiece,
19-
[] attribute: rustc_ast::ast::Attribute,
20-
[] block: rustc_hir::Block<$tcx>,
21-
[] bare_fn_ty: rustc_hir::BareFnTy<$tcx>,
22-
[few] global_asm: rustc_hir::GlobalAsm,
23-
[] generic_arg: rustc_hir::GenericArg<$tcx>,
24-
[] generic_args: rustc_hir::GenericArgs<$tcx>,
25-
[] generic_bound: rustc_hir::GenericBound<$tcx>,
26-
[] generic_param: rustc_hir::GenericParam<$tcx>,
27-
[] expr: rustc_hir::Expr<$tcx>,
28-
[] field: rustc_hir::Field<$tcx>,
29-
[] field_pat: rustc_hir::FieldPat<$tcx>,
30-
[] fn_decl: rustc_hir::FnDecl<$tcx>,
31-
[] foreign_item: rustc_hir::ForeignItem<$tcx>,
32-
[] impl_item_ref: rustc_hir::ImplItemRef<$tcx>,
33-
[few] inline_asm: rustc_hir::InlineAsm<$tcx>,
34-
[few] llvm_inline_asm: rustc_hir::LlvmInlineAsm<$tcx>,
35-
[] local: rustc_hir::Local<$tcx>,
36-
[few] macro_def: rustc_hir::MacroDef<$tcx>,
37-
[] param: rustc_hir::Param<$tcx>,
38-
[] pat: rustc_hir::Pat<$tcx>,
39-
[] path: rustc_hir::Path<$tcx>,
40-
[] path_segment: rustc_hir::PathSegment<$tcx>,
41-
[] poly_trait_ref: rustc_hir::PolyTraitRef<$tcx>,
42-
[] qpath: rustc_hir::QPath<$tcx>,
43-
[] stmt: rustc_hir::Stmt<$tcx>,
44-
[] struct_field: rustc_hir::StructField<$tcx>,
45-
[] trait_item_ref: rustc_hir::TraitItemRef,
46-
[] ty: rustc_hir::Ty<$tcx>,
47-
[] type_binding: rustc_hir::TypeBinding<$tcx>,
48-
[] variant: rustc_hir::Variant<$tcx>,
49-
[] where_predicate: rustc_hir::WherePredicate<$tcx>,
15+
[few] hir_krate: rustc_hir::Crate<$tcx>, rustc_hir::Crate<'_x>;
16+
[] arm: rustc_hir::Arm<$tcx>, rustc_hir::Arm<'_x>;
17+
[] asm_operand: rustc_hir::InlineAsmOperand<$tcx>, rustc_hir::InlineAsmOperand<'_x>;
18+
[] asm_template: rustc_ast::ast::InlineAsmTemplatePiece, rustc_ast::ast::InlineAsmTemplatePiece;
19+
[] attribute: rustc_ast::ast::Attribute, rustc_ast::ast::Attribute;
20+
[] block: rustc_hir::Block<$tcx>, rustc_hir::Block<'_x>;
21+
[] bare_fn_ty: rustc_hir::BareFnTy<$tcx>, rustc_hir::BareFnTy<'_x>;
22+
[few] global_asm: rustc_hir::GlobalAsm, rustc_hir::GlobalAsm;
23+
[] generic_arg: rustc_hir::GenericArg<$tcx>, rustc_hir::GenericArg<'_x>;
24+
[] generic_args: rustc_hir::GenericArgs<$tcx>, rustc_hir::GenericArgs<'_x>;
25+
[] generic_bound: rustc_hir::GenericBound<$tcx>, rustc_hir::GenericBound<'_x>;
26+
[] generic_param: rustc_hir::GenericParam<$tcx>, rustc_hir::GenericParam<'_x>;
27+
[] expr: rustc_hir::Expr<$tcx>, rustc_hir::Expr<'_x>;
28+
[] field: rustc_hir::Field<$tcx>, rustc_hir::Field<'_x>;
29+
[] field_pat: rustc_hir::FieldPat<$tcx>, rustc_hir::FieldPat<'_x>;
30+
[] fn_decl: rustc_hir::FnDecl<$tcx>, rustc_hir::FnDecl<'_x>;
31+
[] foreign_item: rustc_hir::ForeignItem<$tcx>, rustc_hir::ForeignItem<'_x>;
32+
[] impl_item_ref: rustc_hir::ImplItemRef<$tcx>, rustc_hir::ImplItemRef<'_x>;
33+
[few] inline_asm: rustc_hir::InlineAsm<$tcx>, rustc_hir::InlineAsm<'_x>;
34+
[few] llvm_inline_asm: rustc_hir::LlvmInlineAsm<$tcx>, rustc_hir::LlvmInlineAsm<'_x>;
35+
[] local: rustc_hir::Local<$tcx>, rustc_hir::Local<'_x>;
36+
[few] macro_def: rustc_hir::MacroDef<$tcx>, rustc_hir::MacroDef<'_x>;
37+
[] param: rustc_hir::Param<$tcx>, rustc_hir::Param<'_x>;
38+
[] pat: rustc_hir::Pat<$tcx>, rustc_hir::Pat<'_x>;
39+
[] path: rustc_hir::Path<$tcx>, rustc_hir::Path<'_x>;
40+
[] path_segment: rustc_hir::PathSegment<$tcx>, rustc_hir::PathSegment<'_x>;
41+
[] poly_trait_ref: rustc_hir::PolyTraitRef<$tcx>, rustc_hir::PolyTraitRef<'_x>;
42+
[] qpath: rustc_hir::QPath<$tcx>, rustc_hir::QPath<'_x>;
43+
[] stmt: rustc_hir::Stmt<$tcx>, rustc_hir::Stmt<'_x>;
44+
[] struct_field: rustc_hir::StructField<$tcx>, rustc_hir::StructField<'_x>;
45+
[] trait_item_ref: rustc_hir::TraitItemRef, rustc_hir::TraitItemRef;
46+
[] ty: rustc_hir::Ty<$tcx>, rustc_hir::Ty<'_x>;
47+
[] type_binding: rustc_hir::TypeBinding<$tcx>, rustc_hir::TypeBinding<'_x>;
48+
[] variant: rustc_hir::Variant<$tcx>, rustc_hir::Variant<'_x>;
49+
[] where_predicate: rustc_hir::WherePredicate<$tcx>, rustc_hir::WherePredicate<'_x>;
5050
], $tcx);
5151
)
5252
}

src/librustc_infer/infer/canonical/query_response.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> {
5656
) -> Fallible<CanonicalizedQueryResponse<'tcx, T>>
5757
where
5858
T: Debug + TypeFoldable<'tcx>,
59-
Canonical<'tcx, QueryResponse<'tcx, T>>: ArenaAllocatable,
59+
Canonical<'tcx, QueryResponse<'tcx, T>>: ArenaAllocatable<'tcx>,
6060
{
6161
let query_response = self.make_query_response(inference_vars, answer, fulfill_cx)?;
6262
let canonical_result = self.canonicalize_response(&query_response);

src/librustc_macros/src/query.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
433433

434434
try_load_from_on_disk_cache_stream.extend(quote! {
435435
::rustc_middle::dep_graph::DepKind::#name => {
436-
if <#arg as DepNodeParams<TyCtxt<'_>>>::CAN_RECONSTRUCT_QUERY_KEY {
436+
if <#arg as DepNodeParams<TyCtxt<'_>>>::can_reconstruct_query_key() {
437437
debug_assert!($tcx.dep_graph
438438
.node_color($dep_node)
439439
.map(|c| c.is_green())
@@ -490,7 +490,7 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
490490
// Add a match arm to force the query given the dep node
491491
dep_node_force_stream.extend(quote! {
492492
::rustc_middle::dep_graph::DepKind::#name => {
493-
if <#arg as DepNodeParams<TyCtxt<'_>>>::CAN_RECONSTRUCT_QUERY_KEY {
493+
if <#arg as DepNodeParams<TyCtxt<'_>>>::can_reconstruct_query_key() {
494494
if let Some(key) = <#arg as DepNodeParams<TyCtxt<'_>>>::recover($tcx, $dep_node) {
495495
force_query::<crate::ty::query::queries::#name<'_>, _>(
496496
$tcx,

src/librustc_metadata/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#![feature(nll)]
88
#![feature(or_patterns)]
99
#![feature(proc_macro_internals)]
10-
#![feature(specialization)] // FIXME: min_specialization ICEs
10+
#![feature(min_specialization)]
1111
#![feature(stmt_expr_attributes)]
1212
#![recursion_limit = "256"]
1313

src/librustc_metadata/rmeta/decoder.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use rustc_middle::mir::{self, interpret, Body, Promoted};
3030
use rustc_middle::ty::codec::TyDecoder;
3131
use rustc_middle::ty::{self, Ty, TyCtxt};
3232
use rustc_middle::util::common::record_time;
33-
use rustc_serialize::{opaque, Decodable, Decoder, SpecializedDecoder};
33+
use rustc_serialize::{opaque, Decodable, Decoder, SpecializedDecoder, UseSpecializedDecodable};
3434
use rustc_session::Session;
3535
use rustc_span::source_map::{respan, Spanned};
3636
use rustc_span::symbol::{sym, Ident, Symbol};
@@ -218,15 +218,15 @@ impl<'a, 'tcx> Metadata<'a, 'tcx> for (&'a CrateMetadataRef<'a>, TyCtxt<'tcx>) {
218218
}
219219
}
220220

221-
impl<'a, 'tcx, T: Decodable> Lazy<T> {
221+
impl<'a, 'tcx, T: Decodable> Lazy<T, ()> {
222222
fn decode<M: Metadata<'a, 'tcx>>(self, metadata: M) -> T {
223223
let mut dcx = metadata.decoder(self.position.get());
224224
dcx.lazy_state = LazyState::NodeStart(self.position);
225225
T::decode(&mut dcx).unwrap()
226226
}
227227
}
228228

229-
impl<'a: 'x, 'tcx: 'x, 'x, T: Decodable> Lazy<[T]> {
229+
impl<'a: 'x, 'tcx: 'x, 'x, T: Decodable> Lazy<[T], usize> {
230230
fn decode<M: Metadata<'a, 'tcx>>(
231231
self,
232232
metadata: M,
@@ -321,20 +321,20 @@ impl<'a, 'tcx> TyDecoder<'tcx> for DecodeContext<'a, 'tcx> {
321321
}
322322
}
323323

324-
impl<'a, 'tcx, T> SpecializedDecoder<Lazy<T>> for DecodeContext<'a, 'tcx> {
324+
impl<'a, 'tcx, T> SpecializedDecoder<Lazy<T, ()>> for DecodeContext<'a, 'tcx> {
325325
fn specialized_decode(&mut self) -> Result<Lazy<T>, Self::Error> {
326326
self.read_lazy_with_meta(())
327327
}
328328
}
329329

330-
impl<'a, 'tcx, T> SpecializedDecoder<Lazy<[T]>> for DecodeContext<'a, 'tcx> {
330+
impl<'a, 'tcx, T> SpecializedDecoder<Lazy<[T], usize>> for DecodeContext<'a, 'tcx> {
331331
fn specialized_decode(&mut self) -> Result<Lazy<[T]>, Self::Error> {
332332
let len = self.read_usize()?;
333333
if len == 0 { Ok(Lazy::empty()) } else { self.read_lazy_with_meta(len) }
334334
}
335335
}
336336

337-
impl<'a, 'tcx, I: Idx, T> SpecializedDecoder<Lazy<Table<I, T>>> for DecodeContext<'a, 'tcx>
337+
impl<'a, 'tcx, I: Idx, T> SpecializedDecoder<Lazy<Table<I, T>, usize>> for DecodeContext<'a, 'tcx>
338338
where
339339
Option<T>: FixedSizeEncoding,
340340
{
@@ -515,8 +515,9 @@ impl<'a, 'tcx> SpecializedDecoder<Fingerprint> for DecodeContext<'a, 'tcx> {
515515
}
516516
}
517517

518-
impl<'a, 'tcx, T: Decodable> SpecializedDecoder<mir::ClearCrossCrate<T>>
519-
for DecodeContext<'a, 'tcx>
518+
impl<'a, 'tcx, T> SpecializedDecoder<mir::ClearCrossCrate<T>> for DecodeContext<'a, 'tcx>
519+
where
520+
mir::ClearCrossCrate<T>: UseSpecializedDecodable,
520521
{
521522
#[inline]
522523
fn specialized_decode(&mut self) -> Result<mir::ClearCrossCrate<T>, Self::Error> {

src/librustc_metadata/rmeta/encoder.rs

+25-10
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use rustc_middle::mir::{self, interpret};
2727
use rustc_middle::traits::specialization_graph;
2828
use rustc_middle::ty::codec::{self as ty_codec, TyEncoder};
2929
use rustc_middle::ty::{self, SymbolName, Ty, TyCtxt};
30-
use rustc_serialize::{opaque, Encodable, Encoder, SpecializedEncoder};
30+
use rustc_serialize::{opaque, Encodable, Encoder, SpecializedEncoder, UseSpecializedEncodable};
3131
use rustc_session::config::CrateType;
3232
use rustc_span::source_map::Spanned;
3333
use rustc_span::symbol::{kw, sym, Ident, Symbol};
@@ -93,13 +93,13 @@ impl<'tcx> Encoder for EncodeContext<'tcx> {
9393
}
9494
}
9595

96-
impl<'tcx, T> SpecializedEncoder<Lazy<T>> for EncodeContext<'tcx> {
96+
impl<'tcx, T> SpecializedEncoder<Lazy<T, ()>> for EncodeContext<'tcx> {
9797
fn specialized_encode(&mut self, lazy: &Lazy<T>) -> Result<(), Self::Error> {
9898
self.emit_lazy_distance(*lazy)
9999
}
100100
}
101101

102-
impl<'tcx, T> SpecializedEncoder<Lazy<[T]>> for EncodeContext<'tcx> {
102+
impl<'tcx, T> SpecializedEncoder<Lazy<[T], usize>> for EncodeContext<'tcx> {
103103
fn specialized_encode(&mut self, lazy: &Lazy<[T]>) -> Result<(), Self::Error> {
104104
self.emit_usize(lazy.meta)?;
105105
if lazy.meta == 0 {
@@ -109,7 +109,7 @@ impl<'tcx, T> SpecializedEncoder<Lazy<[T]>> for EncodeContext<'tcx> {
109109
}
110110
}
111111

112-
impl<'tcx, I: Idx, T> SpecializedEncoder<Lazy<Table<I, T>>> for EncodeContext<'tcx>
112+
impl<'tcx, I: Idx, T> SpecializedEncoder<Lazy<Table<I, T>, usize>> for EncodeContext<'tcx>
113113
where
114114
Option<T>: FixedSizeEncoding,
115115
{
@@ -228,8 +228,13 @@ impl<'tcx> SpecializedEncoder<LocalDefId> for EncodeContext<'tcx> {
228228
}
229229
}
230230

231-
impl<'tcx> SpecializedEncoder<Ty<'tcx>> for EncodeContext<'tcx> {
232-
fn specialized_encode(&mut self, ty: &Ty<'tcx>) -> Result<(), Self::Error> {
231+
impl<'a, 'b, 'tcx> SpecializedEncoder<&'a ty::TyS<'b>> for EncodeContext<'tcx>
232+
where
233+
&'a ty::TyS<'b>: UseSpecializedEncodable,
234+
{
235+
fn specialized_encode(&mut self, ty: &&'a ty::TyS<'b>) -> Result<(), Self::Error> {
236+
debug_assert!(self.tcx.lift(ty).is_some());
237+
let ty = unsafe { std::mem::transmute::<&&'a ty::TyS<'b>, &&'tcx ty::TyS<'tcx>>(ty) };
233238
ty_codec::encode_with_shorthand(self, ty, |ecx| &mut ecx.type_shorthands)
234239
}
235240
}
@@ -251,12 +256,19 @@ impl<'tcx> SpecializedEncoder<interpret::AllocId> for EncodeContext<'tcx> {
251256
}
252257
}
253258

254-
impl<'tcx> SpecializedEncoder<&'tcx [(ty::Predicate<'tcx>, Span)]> for EncodeContext<'tcx> {
259+
impl<'a, 'b, 'tcx> SpecializedEncoder<&'a [(ty::Predicate<'b>, Span)]> for EncodeContext<'tcx> {
255260
fn specialized_encode(
256261
&mut self,
257-
predicates: &&'tcx [(ty::Predicate<'tcx>, Span)],
262+
predicates: &&'a [(ty::Predicate<'b>, Span)],
258263
) -> Result<(), Self::Error> {
259-
ty_codec::encode_spanned_predicates(self, predicates, |ecx| &mut ecx.predicate_shorthands)
264+
debug_assert!(self.tcx.lift(*predicates).is_some());
265+
let predicates = unsafe {
266+
std::mem::transmute::<
267+
&&'a [(ty::Predicate<'b>, Span)],
268+
&&'tcx [(ty::Predicate<'tcx>, Span)],
269+
>(predicates)
270+
};
271+
ty_codec::encode_spanned_predicates(self, &predicates, |ecx| &mut ecx.predicate_shorthands)
260272
}
261273
}
262274

@@ -266,7 +278,10 @@ impl<'tcx> SpecializedEncoder<Fingerprint> for EncodeContext<'tcx> {
266278
}
267279
}
268280

269-
impl<'tcx, T: Encodable> SpecializedEncoder<mir::ClearCrossCrate<T>> for EncodeContext<'tcx> {
281+
impl<'tcx, T> SpecializedEncoder<mir::ClearCrossCrate<T>> for EncodeContext<'tcx>
282+
where
283+
mir::ClearCrossCrate<T>: UseSpecializedEncodable,
284+
{
270285
fn specialized_encode(&mut self, _: &mir::ClearCrossCrate<T>) -> Result<(), Self::Error> {
271286
Ok(())
272287
}

0 commit comments

Comments
 (0)