diff options
| -rw-r--r-- | src/librustc/middle/liveness.rs | 5 | ||||
| -rw-r--r-- | src/test/run-pass/issue-31597.rs | 14 |
2 files changed, 17 insertions, 2 deletions
diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 5c1b64ac002..0bfb830efc1 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -113,7 +113,7 @@ use dep_graph::DepNode; use middle::def::*; use middle::pat_util; use middle::ty::{self, TyCtxt, ParameterEnvironment}; -use middle::traits; +use middle::traits::{self, ProjectionMode}; use middle::infer; use lint; use util::nodemap::NodeMap; @@ -1497,7 +1497,8 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { let param_env = ParameterEnvironment::for_item(&self.ir.tcx, id); let infcx = infer::new_infer_ctxt(&self.ir.tcx, &self.ir.tcx.tables, - Some(param_env)); + Some(param_env), + ProjectionMode::Any); let cause = traits::ObligationCause::dummy(); let norm = traits::fully_normalize(&infcx, cause, diff --git a/src/test/run-pass/issue-31597.rs b/src/test/run-pass/issue-31597.rs index 132d476f9dc..9acd6384b75 100644 --- a/src/test/run-pass/issue-31597.rs +++ b/src/test/run-pass/issue-31597.rs @@ -20,4 +20,18 @@ impl Make for () { fn make() -> Self::Out {} } +// Also make sure we don't hit an ICE when the projection can't be known +fn f<T: Make>() -> <T as Make>::Out { loop {} } + +// ...and that it works with a blanket impl +trait Tr { + type Assoc; +} + +impl<T: Make> Tr for T { + type Assoc = (); +} + +fn g<T: Make>() -> <T as Tr>::Assoc { } + fn main() {} |
