diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2016-06-11 18:47:47 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2016-07-08 12:42:57 +0300 |
| commit | 2cdd9f1c97652ee799f6bb0af7c063115ff368ea (patch) | |
| tree | 5cae86f91ec97f62e2a20eab2216e76bb887901b /src/librustc_metadata/decoder.rs | |
| parent | eb32440d4566346294cf2f10592d9657918245d1 (diff) | |
| download | rust-2cdd9f1c97652ee799f6bb0af7c063115ff368ea.tar.gz rust-2cdd9f1c97652ee799f6bb0af7c063115ff368ea.zip | |
Rewrite check_pat_enum, split it into check_pat_tuple_struct and check_pat_path
Update definitions in def_map for associated types written in unqualified form (like `Self::Output`) Cleanup finish_resolving_def_to_ty/resolve_ty_and_def_ufcs Make VariantDef's available through constructor IDs
Diffstat (limited to 'src/librustc_metadata/decoder.rs')
| -rw-r--r-- | src/librustc_metadata/decoder.rs | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index eada2a9cd7a..4ccfcd9e903 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -471,23 +471,29 @@ pub fn get_adt_def<'a, 'tcx>(intr: &IdentInterner, let doc = cdata.lookup_item(item_id); let did = DefId { krate: cdata.cnum, index: item_id }; + let mut ctor_did = None; let (kind, variants) = match item_family(doc) { Enum => { (ty::AdtKind::Enum, get_enum_variants(intr, cdata, doc)) } Struct(..) => { - let ctor_did = - reader::maybe_get_doc(doc, tag_items_data_item_struct_ctor). - map_or(did, |ctor_doc| translated_def_id(cdata, ctor_doc)); + // Use separate constructor id for unit/tuple structs and reuse did for braced structs. + ctor_did = reader::maybe_get_doc(doc, tag_items_data_item_struct_ctor).map(|ctor_doc| { + translated_def_id(cdata, ctor_doc) + }); (ty::AdtKind::Struct, - vec![get_struct_variant(intr, cdata, doc, ctor_did)]) + vec![get_struct_variant(intr, cdata, doc, ctor_did.unwrap_or(did))]) } _ => bug!("get_adt_def called on a non-ADT {:?} - {:?}", item_family(doc), did) }; let adt = tcx.intern_adt_def(did, kind, variants); + if let Some(ctor_did) = ctor_did { + // Make adt definition available through constructor id as well. + tcx.insert_adt_def(ctor_did, adt); + } // this needs to be done *after* the variant is interned, // to support recursive structures |
