about summary refs log tree commit diff
path: root/src/rustc/metadata/decoder.rs
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2012-08-09 09:59:50 -0700
committerNiko Matsakis <niko@alum.mit.edu>2012-08-23 06:30:43 -0700
commit511e7626aebe7a8a41c3be1c6fbd16c92e8f9386 (patch)
treeaea0830fc0eb00431d95c5b41550ee1e99e99da2 /src/rustc/metadata/decoder.rs
parent8185ede1fad8312244e418b3c082f87386c40145 (diff)
downloadrust-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.rs18
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);
 }