diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-08-07 18:54:44 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-08-07 18:55:19 -0700 |
| commit | 5ce3281a624c0620f1b6f4e21c15e4a6a17a1dc5 (patch) | |
| tree | 148f8334840c3005d551c1d0b5d83be953422945 /src/rustc | |
| parent | 8c95feda3961efaffe4461d775b029f92a1744c4 (diff) | |
| download | rust-5ce3281a624c0620f1b6f4e21c15e4a6a17a1dc5.tar.gz rust-5ce3281a624c0620f1b6f4e21c15e4a6a17a1dc5.zip | |
rustc: Parse variant structs; add a trivial test case
Diffstat (limited to 'src/rustc')
| -rw-r--r-- | src/rustc/metadata/encoder.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/trans/base.rs | 11 | ||||
| -rw-r--r-- | src/rustc/middle/ty.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/typeck/check.rs | 2 | ||||
| -rw-r--r-- | src/rustc/middle/typeck/collect.rs | 2 |
5 files changed, 12 insertions, 7 deletions
diff --git a/src/rustc/metadata/encoder.rs b/src/rustc/metadata/encoder.rs index a0e9c875f06..07d12a12866 100644 --- a/src/rustc/metadata/encoder.rs +++ b/src/rustc/metadata/encoder.rs @@ -398,7 +398,7 @@ fn encode_enum_variant_info(ecx: @encode_ctxt, ebml_w: ebml::writer, if args.len() > 0 && ty_params.len() == 0 => { encode_symbol(ecx, ebml_w, variant.node.id); } - ast::tuple_variant_kind(_) | ast::struct_variant_kind => {} + ast::tuple_variant_kind(_) | ast::struct_variant_kind(_) => {} } encode_discriminant(ecx, ebml_w, variant.node.id); if vi[i].disr_val != disr_val { diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index 2c7885a3f0c..fd13d8fa1ef 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -2187,7 +2187,8 @@ fn monomorphic_fn(ccx: @crate_ctxt, fn_id: ast::def_id, this_tv.disr_val, (*tvs).len() == 1u, psubsts, d); } - ast::struct_variant_kind => {} + ast::struct_variant_kind(_) => + ccx.tcx.sess.bug(~"can't monomorphize struct variants") } d } @@ -4894,9 +4895,13 @@ fn trans_item(ccx: @crate_ctxt, item: ast::item) { vi[i].disr_val, degen, none, llfn); } - ast::tuple_variant_kind(_) | ast::struct_variant_kind => { + ast::tuple_variant_kind(_) => { // Nothing to do. } + ast::struct_variant_kind(struct_def) => { + trans_struct_def(ccx, struct_def, tps, path, + variant.node.name, variant.node.id); + } } i += 1; } @@ -5210,7 +5215,7 @@ fn get_item_val(ccx: @crate_ctxt, id: ast::node_id) -> ValueRef { } }; } - ast::struct_variant_kind => { + ast::struct_variant_kind(_) => { fail ~"struct unexpected in get_item_val" } } diff --git a/src/rustc/middle/ty.rs b/src/rustc/middle/ty.rs index aa33f355f22..ad7824fabe5 100644 --- a/src/rustc/middle/ty.rs +++ b/src/rustc/middle/ty.rs @@ -2868,7 +2868,7 @@ fn enum_variants(cx: ctxt, id: ast::def_id) -> @~[variant_info] { disr_val: disr_val } } - ast::struct_variant_kind => + ast::struct_variant_kind(_) => fail ~"struct variant kinds unimpl in enum_variants" } }) diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs index 0c59559db76..ec7e642c09d 100644 --- a/src/rustc/middle/typeck/check.rs +++ b/src/rustc/middle/typeck/check.rs @@ -2081,7 +2081,7 @@ fn check_enum_variants(ccx: @crate_ctxt, match v.node.kind { ast::tuple_variant_kind(args) if args.len() > 0u => arg_tys = ty::ty_fn_args(ctor_ty).map(|a| a.ty), - ast::tuple_variant_kind(_) | ast::struct_variant_kind => + ast::tuple_variant_kind(_) | ast::struct_variant_kind(_) => arg_tys = ~[] }; vec::push(variants, @{args: arg_tys, ctor_ty: ctor_ty, diff --git a/src/rustc/middle/typeck/collect.rs b/src/rustc/middle/typeck/collect.rs index abbe5eb40ee..64021f216c3 100644 --- a/src/rustc/middle/typeck/collect.rs +++ b/src/rustc/middle/typeck/collect.rs @@ -131,7 +131,7 @@ fn get_enum_variant_types(ccx: @crate_ctxt, output: enum_ty, ret_style: ast::return_val}); } - ast::tuple_variant_kind(_) | ast::struct_variant_kind => + ast::tuple_variant_kind(_) | ast::struct_variant_kind(_) => result_ty = enum_ty }; let tpt = {bounds: ty_param_bounds(ccx, ty_params), |
