diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2012-08-09 09:59:50 -0700 |
|---|---|---|
| committer | Niko Matsakis <niko@alum.mit.edu> | 2012-08-23 06:30:43 -0700 |
| commit | 511e7626aebe7a8a41c3be1c6fbd16c92e8f9386 (patch) | |
| tree | aea0830fc0eb00431d95c5b41550ee1e99e99da2 /src/rustc/metadata/decoder.rs | |
| parent | 8185ede1fad8312244e418b3c082f87386c40145 (diff) | |
| download | rust-511e7626aebe7a8a41c3be1c6fbd16c92e8f9386.tar.gz rust-511e7626aebe7a8a41c3be1c6fbd16c92e8f9386.zip | |
Infer variance of types with respect to the region parameter.
A similar approach could be used for type parameters. Fixes #2282.
Diffstat (limited to 'src/rustc/metadata/decoder.rs')
| -rw-r--r-- | src/rustc/metadata/decoder.rs | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs index a1a2b7245eb..b78be76dc69 100644 --- a/src/rustc/metadata/decoder.rs +++ b/src/rustc/metadata/decoder.rs @@ -237,11 +237,11 @@ fn item_ty_param_bounds(item: ebml::doc, tcx: ty::ctxt, cdata: cmd) @bounds } -fn item_ty_region_param(item: ebml::doc) -> bool { - match ebml::maybe_get_doc(item, tag_region_param) { - some(_) => true, - none => false - } +fn item_ty_region_param(item: ebml::doc) -> option<ty::region_variance> { + ebml::maybe_get_doc(item, tag_region_param).map(|doc| { + let d = ebml::ebml_deserializer(doc); + ty::deserialize_region_variance(d) + }) } fn item_ty_param_count(item: ebml::doc) -> uint { @@ -340,10 +340,14 @@ fn get_type(cdata: cmd, id: ast::node_id, tcx: ty::ctxt) item_ty_param_bounds(item, tcx, cdata) } else { @~[] }; let rp = item_ty_region_param(item); - return {bounds: tp_bounds, rp: rp, ty: t}; + return {bounds: tp_bounds, + region_param: rp, + ty: t}; } -fn get_region_param(cdata: cmd, id: ast::node_id) -> bool { +fn get_region_param(cdata: cmd, id: ast::node_id) + -> option<ty::region_variance> { + let item = lookup_item(id, cdata.data); return item_ty_region_param(item); } |
