about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2020-10-13 21:42:59 -0700
committerEsteban Küber <esteban@kuber.com.ar>2020-10-23 12:21:47 -0700
commitb334eef162ba9c10faa97c9d5c5d249f25afc7df (patch)
treed3ecf5d7fd2d3a1c12ea3a55311795bfad272f76
parent07a63e6d1fabf3560e8e1e17c1d56b10a06152d9 (diff)
downloadrust-b334eef162ba9c10faa97c9d5c5d249f25afc7df.tar.gz
rust-b334eef162ba9c10faa97c9d5c5d249f25afc7df.zip
Do not ICE with TraitPredicates containing [type error]
Fix #77919.
-rw-r--r--compiler/rustc_trait_selection/src/traits/select/mod.rs19
-rw-r--r--src/test/ui/issues/issue-77919.rs13
-rw-r--r--src/test/ui/issues/issue-77919.stderr46
3 files changed, 72 insertions, 6 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs
index 4cc4bc0acda..d4124c82197 100644
--- a/compiler/rustc_trait_selection/src/traits/select/mod.rs
+++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs
@@ -2031,12 +2031,19 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
                 &predicate.subst(tcx, substs),
                 &mut obligations,
             );
-            obligations.push(Obligation {
-                cause: cause.clone(),
-                recursion_depth,
-                param_env,
-                predicate,
-            });
+            if predicate.references_error() {
+                self.tcx().sess.delay_span_bug(
+                    cause.span,
+                    &format!("impl_or_trait_obligation with errors: {:?}", predicate),
+                );
+            } else {
+                obligations.push(Obligation {
+                    cause: cause.clone(),
+                    recursion_depth,
+                    param_env,
+                    predicate,
+                });
+            }
         }
 
         // We are performing deduplication here to avoid exponential blowups
diff --git a/src/test/ui/issues/issue-77919.rs b/src/test/ui/issues/issue-77919.rs
new file mode 100644
index 00000000000..9b04d5ee000
--- /dev/null
+++ b/src/test/ui/issues/issue-77919.rs
@@ -0,0 +1,13 @@
+fn main() {
+    [1; <Multiply<Five, Five>>::VAL]; //~ ERROR evaluation of constant value failed
+}
+trait TypeVal<T> {
+    const VAL: T; //~ ERROR any use of this value will cause an error
+}
+struct Five;
+struct Multiply<N, M> {
+    _n: PhantomData, //~ ERROR cannot find type `PhantomData` in this scope
+}
+impl<N, M> TypeVal<usize> for Multiply<N, M> where N: TypeVal<VAL> {}
+//~^ ERROR cannot find type `VAL` in this scope
+//~| ERROR not all trait items implemented, missing: `VAL`
diff --git a/src/test/ui/issues/issue-77919.stderr b/src/test/ui/issues/issue-77919.stderr
new file mode 100644
index 00000000000..129af00644f
--- /dev/null
+++ b/src/test/ui/issues/issue-77919.stderr
@@ -0,0 +1,46 @@
+error[E0412]: cannot find type `PhantomData` in this scope
+  --> $DIR/issue-77919.rs:9:9
+   |
+LL |     _n: PhantomData,
+   |         ^^^^^^^^^^^ not found in this scope
+   |
+help: consider importing this struct
+   |
+LL | use std::marker::PhantomData;
+   |
+
+error[E0412]: cannot find type `VAL` in this scope
+  --> $DIR/issue-77919.rs:11:63
+   |
+LL | impl<N, M> TypeVal<usize> for Multiply<N, M> where N: TypeVal<VAL> {}
+   |          -                                                    ^^^ not found in this scope
+   |          |
+   |          help: you might be missing a type parameter: `, VAL`
+
+error[E0046]: not all trait items implemented, missing: `VAL`
+  --> $DIR/issue-77919.rs:11:1
+   |
+LL |     const VAL: T;
+   |     ------------- `VAL` from trait
+...
+LL | impl<N, M> TypeVal<usize> for Multiply<N, M> where N: TypeVal<VAL> {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `VAL` in implementation
+
+error: any use of this value will cause an error
+  --> $DIR/issue-77919.rs:5:5
+   |
+LL |     const VAL: T;
+   |     ^^^^^^^^^^^^^ no MIR body is available for DefId(0:7 ~ issue_77919[317d]::TypeVal::VAL)
+   |
+   = note: `#[deny(const_err)]` on by default
+
+error[E0080]: evaluation of constant value failed
+  --> $DIR/issue-77919.rs:2:9
+   |
+LL |     [1; <Multiply<Five, Five>>::VAL];
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
+
+error: aborting due to 5 previous errors
+
+Some errors have detailed explanations: E0046, E0080, E0412.
+For more information about an error, try `rustc --explain E0046`.