From 89574a6fc7c660172030724a5d1e8c0ef83094a4 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 21 Aug 2018 19:23:30 -0400 Subject: [PATCH] resolve type variables in the custom type op pathway --- src/librustc/traits/query/type_op/custom.rs | 3 +- src/test/ui/issue-53568.rs | 61 +++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/issue-53568.rs diff --git a/src/librustc/traits/query/type_op/custom.rs b/src/librustc/traits/query/type_op/custom.rs index 5cf7064b0c297..6a5ef75a660ba 100644 --- a/src/librustc/traits/query/type_op/custom.rs +++ b/src/librustc/traits/query/type_op/custom.rs @@ -106,7 +106,8 @@ fn scrape_region_constraints<'gcx, 'tcx, R>( infcx.tcx, region_obligations .iter() - .map(|(_, r_o)| (r_o.sup_type, r_o.sub_region)), + .map(|(_, r_o)| (r_o.sup_type, r_o.sub_region)) + .map(|(ty, r)| (infcx.resolve_type_vars_if_possible(&ty), r)), ®ion_constraint_data, ); diff --git a/src/test/ui/issue-53568.rs b/src/test/ui/issue-53568.rs new file mode 100644 index 0000000000000..6b479f7517244 --- /dev/null +++ b/src/test/ui/issue-53568.rs @@ -0,0 +1,61 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Regression test for an NLL-related ICE (#53568) -- we failed to +// resolve inference variables in "custom type-ops". +// +// compile-pass + +#![feature(nll)] +#![allow(dead_code)] + +trait Future { + type Item; +} + +impl Future for F +where F: Fn() -> T +{ + type Item = T; +} + +trait Connect {} + +struct Connector { + handler: H, +} + +impl Connect for Connector +where + T: 'static, + H: Future +{ +} + +struct Client { + connector: C, +} + +fn build(_connector: C) -> Client { + unimplemented!() +} + +fn client(handler: H) -> Client +where H: Fn() + Copy +{ + let connector = Connector { + handler, + }; + let client = build(connector); + client +} + +fn main() { } +