Skip to content

Commit f2b9217

Browse files
committed
Auto merge of #56838 - Aaron1011:fix/rustdoc-infer-unify, r=nikomatsakis
Call poly_project_and_unify_type on types that contain inference types Commit f57247c (Ensure that Rusdoc discovers all necessary auto trait bounds) added a check to ensure that we only attempt to unify a projection predicatre with inference variables. However, the check it added was too strict - instead of checking that a type *contains* an inference variable (e.g. '&_', 'MyType<_>'), it required the type to *be* an inference variable (i.e. only '_' would match). This commit relaxes the check to use 'ty.has_infer_types', ensuring that we perform unification wherever possible. Fixes #56822
2 parents d174173 + a375410 commit f2b9217

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

src/librustc/traits/auto_trait.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -732,9 +732,9 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
732732
}
733733

734734
// We can only call poly_project_and_unify_type when our predicate's
735-
// Ty is an inference variable - otherwise, there won't be anything to
735+
// Ty contains an inference variable - otherwise, there won't be anything to
736736
// unify
737-
if p.ty().skip_binder().is_ty_infer() {
737+
if p.ty().skip_binder().has_infer_types() {
738738
debug!("Projecting and unifying projection predicate {:?}",
739739
predicate);
740740
match poly_project_and_unify_type(select, &obligation.with(p.clone())) {

src/test/rustdoc/issue-56822.rs

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
struct Wrapper<T>(T);
12+
13+
trait MyTrait {
14+
type Output;
15+
}
16+
17+
impl<'a, I, T: 'a> MyTrait for Wrapper<I>
18+
where I: MyTrait<Output=&'a T>
19+
{
20+
type Output = T;
21+
}
22+
23+
struct Inner<'a, T>(&'a T);
24+
25+
impl<'a, T> MyTrait for Inner<'a, T> {
26+
type Output = &'a T;
27+
}
28+
29+
// @has issue_56822/struct.Parser.html
30+
// @has - '//*[@id="synthetic-implementations-list"]/*[@class="impl"]//*/code' "impl<'a> Send for \
31+
// Parser<'a>"
32+
pub struct Parser<'a> {
33+
field: <Wrapper<Inner<'a, u8>> as MyTrait>::Output
34+
}

0 commit comments

Comments
 (0)