about summary refs log tree commit diff
path: root/src/comp/metadata
diff options
context:
space:
mode:
authorKevin Atkinson <kevina@cs.utah.edu>2012-01-16 02:36:47 -0700
committerMarijn Haverbeke <marijnh@gmail.com>2012-01-16 11:19:33 +0100
commite1c50c4410804dfce9fbe040f341f6104cc9ba7e (patch)
tree5afd49a9f0b209d2853f991532297a315d342b13 /src/comp/metadata
parentedf11ebf021dba897e5419cca53de3b652670799 (diff)
downloadrust-e1c50c4410804dfce9fbe040f341f6104cc9ba7e.tar.gz
rust-e1c50c4410804dfce9fbe040f341f6104cc9ba7e.zip
Don't evaluate discriminator value constants when parsing.
Remove disr_val from ast::variant_ and always use ty::variant_info
when the value is needed.  Move what was done during parsing into
other passes, primary typeck.rs.  This move also correctly type checks
the disr. value expression; thus, fixing rustc --pretty=typed when
disr. values are used.
Diffstat (limited to 'src/comp/metadata')
-rw-r--r--src/comp/metadata/encoder.rs9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/comp/metadata/encoder.rs b/src/comp/metadata/encoder.rs
index 537c420aa71..41235c01d3d 100644
--- a/src/comp/metadata/encoder.rs
+++ b/src/comp/metadata/encoder.rs
@@ -232,6 +232,8 @@ fn encode_tag_variant_info(ecx: @encode_ctxt, ebml_w: ebml::writer,
                            id: node_id, variants: [variant],
                            &index: [entry<int>], ty_params: [ty_param]) {
     let disr_val = 0;
+    let i = 0;
+    let vi = ty::tag_variants(ecx.ccx.tcx, {crate: local_crate, node: id});
     for variant: variant in variants {
         index += [{val: variant.node.id, pos: ebml_w.writer.tell()}];
         ebml::start_tag(ebml_w, tag_items_data_item);
@@ -244,13 +246,14 @@ fn encode_tag_variant_info(ecx: @encode_ctxt, ebml_w: ebml::writer,
             encode_symbol(ecx, ebml_w, variant.node.id);
         }
         encode_discriminant(ecx, ebml_w, variant.node.id);
-        if variant.node.disr_val != disr_val {
-            encode_disr_val(ecx, ebml_w, variant.node.disr_val);
-            disr_val = variant.node.disr_val;
+        if vi[i].disr_val != disr_val {
+            encode_disr_val(ecx, ebml_w, vi[i].disr_val);
+            disr_val = vi[i].disr_val;
         }
         encode_type_param_bounds(ebml_w, ecx, ty_params);
         ebml::end_tag(ebml_w);
         disr_val += 1;
+        i += 1;
     }
 }