diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2020-06-19 19:43:05 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-19 19:43:05 -0700 |
| commit | db7203d6f82e277ba1cedfd78730b1f6ab0f2ba9 (patch) | |
| tree | 37a1591cab5bdd8d58ca4f1c99e5c1cccbc51927 /src/librustc_middle/ty | |
| parent | d69d4c39ed76de7513082aaa50358e596adae4dd (diff) | |
| parent | 6fa7dc65272c63a9e8dc1483d176433f39e18575 (diff) | |
| download | rust-db7203d6f82e277ba1cedfd78730b1f6ab0f2ba9.tar.gz rust-db7203d6f82e277ba1cedfd78730b1f6ab0f2ba9.zip | |
Rollup merge of #73442 - davidtwco:issue-72181-pretty-print-const-val-enum-no-variants, r=oli-obk
pretty/mir: const value enums with no variants Fixes #72181. This PR modifies the pretty printer and const eval in the MIR so that `destructure_const` (used in `pretty_print_const_value`) can handle enums with no variants (or types containing enums with no variants). I'm not convinced that this is the correct approach, folks more familiar with `destructure_const` would be able to say - happy to adjust the PR. Looking through `destructure_const` and the functions that it invokes, it didn't seem like it was written to handle zero-variant-enums - I assume that case is handled earlier in some way so `destructure_const` doesn't need to under normal circumstances. It didn't seem like it would be straightforward to make `destructure_const` handle this case in a first-class-feeling way (e.g. adding a `Variants::None` variant), so this PR makes some minimal changes to avoid ICEs.
Diffstat (limited to 'src/librustc_middle/ty')
| -rw-r--r-- | src/librustc_middle/ty/layout.rs | 2 | ||||
| -rw-r--r-- | src/librustc_middle/ty/mod.rs | 1 | ||||
| -rw-r--r-- | src/librustc_middle/ty/print/pretty.rs | 7 | ||||
| -rw-r--r-- | src/librustc_middle/ty/sty.rs | 3 |
4 files changed, 12 insertions, 1 deletions
diff --git a/src/librustc_middle/ty/layout.rs b/src/librustc_middle/ty/layout.rs index 80f919d0c03..68af22569e3 100644 --- a/src/librustc_middle/ty/layout.rs +++ b/src/librustc_middle/ty/layout.rs @@ -2001,6 +2001,8 @@ where } let fields = match this.ty.kind { + ty::Adt(def, _) if def.variants.is_empty() => + bug!("for_variant called on zero-variant enum"), ty::Adt(def, _) => def.variants[variant_index].fields.len(), _ => bug!(), }; diff --git a/src/librustc_middle/ty/mod.rs b/src/librustc_middle/ty/mod.rs index e26e09ae6a9..ca0a1ac71c6 100644 --- a/src/librustc_middle/ty/mod.rs +++ b/src/librustc_middle/ty/mod.rs @@ -2352,6 +2352,7 @@ impl<'tcx> AdtDef { /// Alternatively, if there is no explicit discriminant, returns the /// inferred discriminant directly. pub fn discriminant_def_for_variant(&self, variant_index: VariantIdx) -> (Option<DefId>, u32) { + assert!(!self.variants.is_empty()); let mut explicit_index = variant_index.as_u32(); let expr_did; loop { diff --git a/src/librustc_middle/ty/print/pretty.rs b/src/librustc_middle/ty/print/pretty.rs index 17203fcce5e..1a08639a533 100644 --- a/src/librustc_middle/ty/print/pretty.rs +++ b/src/librustc_middle/ty/print/pretty.rs @@ -1177,8 +1177,13 @@ pub trait PrettyPrinter<'tcx>: } p!(write(")")); } + ty::Adt(def, substs) if def.variants.is_empty() => { + p!(print_value_path(def.did, substs)); + } ty::Adt(def, substs) => { - let variant_def = &def.variants[contents.variant]; + let variant_id = + contents.variant.expect("destructed const of adt without variant id"); + let variant_def = &def.variants[variant_id]; p!(print_value_path(variant_def.def_id, substs)); match variant_def.ctor_kind { diff --git a/src/librustc_middle/ty/sty.rs b/src/librustc_middle/ty/sty.rs index cf11adb0285..b0addcb2bb6 100644 --- a/src/librustc_middle/ty/sty.rs +++ b/src/librustc_middle/ty/sty.rs @@ -2099,6 +2099,9 @@ impl<'tcx> TyS<'tcx> { variant_index: VariantIdx, ) -> Option<Discr<'tcx>> { match self.kind { + TyKind::Adt(adt, _) if adt.variants.is_empty() => { + bug!("discriminant_for_variant called on zero variant enum"); + } TyKind::Adt(adt, _) if adt.is_enum() => { Some(adt.discriminant_for_variant(tcx, variant_index)) } |
