about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2017-08-23 12:54:36 -0700
committerAlex Crichton <alex@alexcrichton.com>2017-08-25 16:08:35 -0700
commitecb29c11bbcfac40218b6b35e9ccf26b4a7db151 (patch)
treea2879b00e65a2a6189c48b313cf2d4f54aa8ce76 /src
parent97f2c37435b76c59ff60164b30a02f09641f798f (diff)
downloadrust-ecb29c11bbcfac40218b6b35e9ccf26b4a7db151.tar.gz
rust-ecb29c11bbcfac40218b6b35e9ccf26b4a7db151.zip
rustc: Fix two instances of `try_get`
The `sized_constraint` and `needs_drop_raw` queries both use `try_get` to detect
cycles, but in both of these cases the cycle indicates an error has happened
elsewhere in compilation. In these cases we can just delay the diagnostic to get
emitted as a bug later if we ended up forgetting to emit the error diagnostic.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/ty/mod.rs7
-rw-r--r--src/librustc/ty/util.rs10
2 files changed, 12 insertions, 5 deletions
diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs
index f9bbcc1bbe0..852bd48a5ee 100644
--- a/src/librustc/ty/mod.rs
+++ b/src/librustc/ty/mod.rs
@@ -1684,12 +1684,15 @@ impl<'a, 'gcx, 'tcx> AdtDef {
     pub fn sized_constraint(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> &'tcx [Ty<'tcx>] {
         match queries::adt_sized_constraint::try_get(tcx, DUMMY_SP, self.did) {
             Ok(tys) => tys,
-            Err(_) => {
+            Err(mut bug) => {
                 debug!("adt_sized_constraint: {:?} is recursive", self);
                 // This should be reported as an error by `check_representable`.
                 //
                 // Consider the type as Sized in the meanwhile to avoid
-                // further errors.
+                // further errors. Delay our `bug` diagnostic here to get
+                // emitted later as well in case we accidentally otherwise don't
+                // emit an error.
+                bug.delay_as_bug();
                 tcx.intern_type_list(&[tcx.types.err])
             }
         }
diff --git a/src/librustc/ty/util.rs b/src/librustc/ty/util.rs
index 9cd6aa21118..bbbb8611f98 100644
--- a/src/librustc/ty/util.rs
+++ b/src/librustc/ty/util.rs
@@ -1069,11 +1069,15 @@ fn needs_drop_raw<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
     let needs_drop = |ty: Ty<'tcx>| -> bool {
         match ty::queries::needs_drop_raw::try_get(tcx, DUMMY_SP, param_env.and(ty)) {
             Ok(v) => v,
-            Err(_) => {
+            Err(mut bug) => {
                 // Cycles should be reported as an error by `check_representable`.
                 //
-                // Consider the type as not needing drop in the meanwhile to avoid
-                // further errors.
+                // Consider the type as not needing drop in the meanwhile to
+                // avoid further errors.
+                //
+                // In case we forgot to emit a bug elsewhere, delay our
+                // diagnostic to get emitted as a compiler bug.
+                bug.delay_as_bug();
                 false
             }
         }