Skip to content

Commit 36ea8c5

Browse files
committed
Place bounds on fields in rustc_macros derives.
1 parent 0940040 commit 36ea8c5

File tree

6 files changed

+48
-424
lines changed

6 files changed

+48
-424
lines changed

compiler/rustc_macros/src/hash_stable.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn parse_attributes(field: &syn::Field) -> Attributes {
4343

4444
pub fn hash_stable_generic_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
4545
let generic: syn::GenericParam = parse_quote!(__CTX);
46-
s.add_bounds(synstructure::AddBounds::Generics);
46+
s.add_bounds(synstructure::AddBounds::Fields);
4747
s.add_impl_generic(generic);
4848
s.add_where_predicate(parse_quote! { __CTX: crate::HashStableContext });
4949
let body = s.each(|bi| {
@@ -86,7 +86,7 @@ pub fn hash_stable_generic_derive(mut s: synstructure::Structure<'_>) -> proc_ma
8686

8787
pub fn hash_stable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
8888
let generic: syn::GenericParam = parse_quote!('__ctx);
89-
s.add_bounds(synstructure::AddBounds::Generics);
89+
s.add_bounds(synstructure::AddBounds::Fields);
9090
s.add_impl_generic(generic);
9191
let body = s.each(|bi| {
9292
let attrs = parse_attributes(bi.ast());

compiler/rustc_macros/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ decl_derive!([Decodable] => serialize::decodable_derive);
120120
decl_derive!([Encodable] => serialize::encodable_derive);
121121
decl_derive!([TyDecodable] => serialize::type_decodable_derive);
122122
decl_derive!([TyEncodable] => serialize::type_encodable_derive);
123+
decl_derive!([IrTyDecodable] => serialize::ir_type_decodable_derive);
124+
decl_derive!([IrTyEncodable] => serialize::ir_type_encodable_derive);
123125
decl_derive!([MetadataDecodable] => serialize::meta_decodable_derive);
124126
decl_derive!([MetadataEncodable] => serialize::meta_encodable_derive);
125127
decl_derive!([TypeFoldable, attributes(type_foldable)] => type_foldable::type_foldable_derive);

compiler/rustc_macros/src/serialize.rs

+22-6
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,21 @@ use quote::{quote, quote_spanned};
33
use syn::parse_quote;
44
use syn::spanned::Spanned;
55

6+
pub fn ir_type_decodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
7+
let decoder_ty = quote! { __D };
8+
s.add_impl_generic(parse_quote! {#decoder_ty: crate::codec::TyDecoder});
9+
s.add_bounds(synstructure::AddBounds::Fields);
10+
11+
decodable_body(s, decoder_ty)
12+
}
13+
614
pub fn type_decodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
715
let decoder_ty = quote! { __D };
816
if !s.ast().generics.lifetimes().any(|lt| lt.lifetime.ident == "tcx") {
917
s.add_impl_generic(parse_quote! { 'tcx });
1018
}
1119
s.add_impl_generic(parse_quote! {#decoder_ty: ::rustc_type_ir::codec::TyDecoder<I = ::rustc_middle::ty::TyCtxt<'tcx>>});
12-
s.add_bounds(synstructure::AddBounds::Generics);
20+
s.add_bounds(synstructure::AddBounds::Fields);
1321

1422
decodable_body(s, decoder_ty)
1523
}
@@ -20,15 +28,15 @@ pub fn meta_decodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2:
2028
}
2129
s.add_impl_generic(parse_quote! { '__a });
2230
let decoder_ty = quote! { DecodeContext<'__a, 'tcx> };
23-
s.add_bounds(synstructure::AddBounds::Generics);
31+
s.add_bounds(synstructure::AddBounds::Fields);
2432

2533
decodable_body(s, decoder_ty)
2634
}
2735

2836
pub fn decodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
2937
let decoder_ty = quote! { __D };
3038
s.add_impl_generic(parse_quote! {#decoder_ty: ::rustc_serialize::Decoder});
31-
s.add_bounds(synstructure::AddBounds::Generics);
39+
s.add_bounds(synstructure::AddBounds::Fields);
3240

3341
decodable_body(s, decoder_ty)
3442
}
@@ -90,13 +98,21 @@ fn decode_field(field: &syn::Field) -> proc_macro2::TokenStream {
9098
quote_spanned! {field_span=> #decode_inner_method(#__decoder) }
9199
}
92100

101+
pub fn ir_type_encodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
102+
let encoder_ty = quote! { __E };
103+
s.add_impl_generic(parse_quote! {#encoder_ty: crate::codec::TyEncoder});
104+
s.add_bounds(synstructure::AddBounds::Fields);
105+
106+
encodable_body(s, encoder_ty, false)
107+
}
108+
93109
pub fn type_encodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
94110
if !s.ast().generics.lifetimes().any(|lt| lt.lifetime.ident == "tcx") {
95111
s.add_impl_generic(parse_quote! {'tcx});
96112
}
97113
let encoder_ty = quote! { __E };
98114
s.add_impl_generic(parse_quote! {#encoder_ty: ::rustc_type_ir::codec::TyEncoder<I = ::rustc_middle::ty::TyCtxt<'tcx>>});
99-
s.add_bounds(synstructure::AddBounds::Generics);
115+
s.add_bounds(synstructure::AddBounds::Fields);
100116

101117
encodable_body(s, encoder_ty, false)
102118
}
@@ -107,15 +123,15 @@ pub fn meta_encodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2:
107123
}
108124
s.add_impl_generic(parse_quote! { '__a });
109125
let encoder_ty = quote! { EncodeContext<'__a, 'tcx> };
110-
s.add_bounds(synstructure::AddBounds::Generics);
126+
s.add_bounds(synstructure::AddBounds::Fields);
111127

112128
encodable_body(s, encoder_ty, true)
113129
}
114130

115131
pub fn encodable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::TokenStream {
116132
let encoder_ty = quote! { __E };
117133
s.add_impl_generic(parse_quote! { #encoder_ty: ::rustc_serialize::Encoder});
118-
s.add_bounds(synstructure::AddBounds::Generics);
134+
s.add_bounds(synstructure::AddBounds::Fields);
119135

120136
encodable_body(s, encoder_ty, false)
121137
}

compiler/rustc_middle/src/ty/sty.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use hir::def::DefKind;
1515
use polonius_engine::Atom;
1616
use rustc_data_structures::captures::Captures;
1717
use rustc_data_structures::intern::Interned;
18+
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
1819
use rustc_hir as hir;
1920
use rustc_hir::def_id::DefId;
2021
use rustc_index::vec::Idx;
@@ -1337,20 +1338,31 @@ impl fmt::Debug for EarlyBoundRegion {
13371338

13381339
/// A **`const`** **v**ariable **ID**.
13391340
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
1340-
#[derive(HashStable, TyEncodable, TyDecodable)]
1341+
#[derive(TyEncodable, TyDecodable)]
13411342
pub struct ConstVid<'tcx> {
13421343
pub index: u32,
13431344
pub phantom: PhantomData<&'tcx ()>,
13441345
}
13451346

1347+
impl<CTX> HashStable<CTX> for ConstVid<'_> {
1348+
fn hash_stable(&self, _: &mut CTX, _: &mut StableHasher) {
1349+
panic!("const variables should not be hashed: {self:?}")
1350+
}
1351+
}
1352+
13461353
rustc_index::newtype_index! {
13471354
/// A **region** (lifetime) **v**ariable **ID**.
1348-
#[derive(HashStable)]
13491355
pub struct RegionVid {
13501356
DEBUG_FORMAT = custom,
13511357
}
13521358
}
13531359

1360+
impl<CTX> HashStable<CTX> for RegionVid {
1361+
fn hash_stable(&self, _: &mut CTX, _: &mut StableHasher) {
1362+
panic!("region variables should not be hashed: {self:?}")
1363+
}
1364+
}
1365+
13541366
impl Atom for RegionVid {
13551367
fn index(self) -> usize {
13561368
Idx::index(self)

compiler/rustc_type_ir/src/lib.rs

+6
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,12 @@ rustc_index::newtype_index! {
502502
}
503503
}
504504

505+
impl<CTX> HashStable<CTX> for TyVid {
506+
fn hash_stable(&self, _: &mut CTX, _: &mut StableHasher) {
507+
panic!("type variables should not be hashed: {self:?}")
508+
}
509+
}
510+
505511
/// An **int**egral (`u32`, `i32`, `usize`, etc.) type **v**ariable **ID**.
506512
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Encodable, Decodable)]
507513
pub struct IntVid {

0 commit comments

Comments
 (0)