about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-04-06 00:14:40 +0200
committerGitHub <noreply@github.com>2019-04-06 00:14:40 +0200
commite5435d97ea0f7dbd32d3fb30ecfe8877ea7c116a (patch)
tree680f321c74af3147c7e851579271ae97e0e6a927 /src
parentacd8dd6a50d505057a7d7ad8d0d7a4c2bd274200 (diff)
parentc966c458975cc6987f83440206bdedd3cab298b6 (diff)
downloadrust-e5435d97ea0f7dbd32d3fb30ecfe8877ea7c116a.tar.gz
rust-e5435d97ea0f7dbd32d3fb30ecfe8877ea7c116a.zip
Rollup merge of #58894 - GuillaumeGomez:invalid-lifetime-bounds, r=estebank
Fix invalid bounds string generation in rustdoc

Fixes #58737.

Very weird and I'm not sure this is the best fix around. However, trying to fix it beforehand seems overly complicated compared to the gain (in `clean`, it wouldn't change anything since we **have to** return something so that wouldn't work, and in `hir`, I'm afraid I'd break something else for very little gain).

Also, I wasn't able to make a small code to reproduce the issue. The only way to test is to document `crossbeam` directly and check the `Scope` struct...

r? @QuietMisdreavus
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/collect.rs5
-rw-r--r--src/librustdoc/clean/auto_trait.rs2
-rw-r--r--src/librustdoc/clean/blanket_impl.rs2
-rw-r--r--src/librustdoc/clean/inline.rs10
-rw-r--r--src/librustdoc/clean/mod.rs6
-rw-r--r--src/test/rustdoc/useless_lifetime_bound.rs13
6 files changed, 27 insertions, 11 deletions
diff --git a/src/librustc_typeck/collect.rs b/src/librustc_typeck/collect.rs
index f92fa2e9799..0cd7fe91594 100644
--- a/src/librustc_typeck/collect.rs
+++ b/src/librustc_typeck/collect.rs
@@ -1918,7 +1918,10 @@ fn explicit_predicates_of<'a, 'tcx>(
         }
     }
 
-    let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
+    let hir_id = match tcx.hir().as_local_hir_id(def_id) {
+        Some(hir_id) => hir_id,
+        None => return tcx.predicates_of(def_id),
+    };
     let node = tcx.hir().get_by_hir_id(hir_id);
 
     let mut is_trait = None;
diff --git a/src/librustdoc/clean/auto_trait.rs b/src/librustdoc/clean/auto_trait.rs
index adbe73b165e..555cb1bd64f 100644
--- a/src/librustdoc/clean/auto_trait.rs
+++ b/src/librustdoc/clean/auto_trait.rs
@@ -568,7 +568,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> {
                 (replaced.clone(), replaced.clean(self.cx))
             });
 
-        let full_generics = (&type_generics, &tcx.predicates_of(did));
+        let full_generics = (&type_generics, &tcx.explicit_predicates_of(did));
         let Generics {
             params: mut generic_params,
             ..
diff --git a/src/librustdoc/clean/blanket_impl.rs b/src/librustdoc/clean/blanket_impl.rs
index aaae0bafd9e..570c61f1ffc 100644
--- a/src/librustdoc/clean/blanket_impl.rs
+++ b/src/librustdoc/clean/blanket_impl.rs
@@ -132,7 +132,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
                                      .collect();
 
                         let ty = self.cx.get_real_ty(def_id, def_ctor, &real_name, generics);
-                        let predicates = infcx.tcx.predicates_of(impl_def_id);
+                        let predicates = infcx.tcx.explicit_predicates_of(impl_def_id);
 
                         impls.push(Item {
                             source: infcx.tcx.def_span(impl_def_id).clean(self.cx),
diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs
index d9a63969fec..8da71cf708a 100644
--- a/src/librustdoc/clean/inline.rs
+++ b/src/librustdoc/clean/inline.rs
@@ -228,7 +228,7 @@ fn build_external_function(cx: &DocContext<'_>, did: DefId) -> clean::Function {
 }
 
 fn build_enum(cx: &DocContext<'_>, did: DefId) -> clean::Enum {
-    let predicates = cx.tcx.predicates_of(did);
+    let predicates = cx.tcx.explicit_predicates_of(did);
 
     clean::Enum {
         generics: (cx.tcx.generics_of(did), &predicates).clean(cx),
@@ -238,7 +238,7 @@ fn build_enum(cx: &DocContext<'_>, did: DefId) -> clean::Enum {
 }
 
 fn build_struct(cx: &DocContext<'_>, did: DefId) -> clean::Struct {
-    let predicates = cx.tcx.predicates_of(did);
+    let predicates = cx.tcx.explicit_predicates_of(did);
     let variant = cx.tcx.adt_def(did).non_enum_variant();
 
     clean::Struct {
@@ -254,7 +254,7 @@ fn build_struct(cx: &DocContext<'_>, did: DefId) -> clean::Struct {
 }
 
 fn build_union(cx: &DocContext<'_>, did: DefId) -> clean::Union {
-    let predicates = cx.tcx.predicates_of(did);
+    let predicates = cx.tcx.explicit_predicates_of(did);
     let variant = cx.tcx.adt_def(did).non_enum_variant();
 
     clean::Union {
@@ -266,7 +266,7 @@ fn build_union(cx: &DocContext<'_>, did: DefId) -> clean::Union {
 }
 
 fn build_type_alias(cx: &DocContext<'_>, did: DefId) -> clean::Typedef {
-    let predicates = cx.tcx.predicates_of(did);
+    let predicates = cx.tcx.explicit_predicates_of(did);
 
     clean::Typedef {
         type_: cx.tcx.type_of(did).clean(cx),
@@ -325,7 +325,7 @@ pub fn build_impl(cx: &DocContext<'_>, did: DefId, ret: &mut Vec<clean::Item>) {
         }
     }
 
-    let predicates = tcx.predicates_of(did);
+    let predicates = tcx.explicit_predicates_of(did);
     let (trait_items, generics) = if let Some(hir_id) = tcx.hir().as_local_hir_id(did) {
         match tcx.hir().expect_item_by_hir_id(hir_id).node {
             hir::ItemKind::Impl(.., ref gen, _, _, ref item_ids) => {
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index 27ffe4583df..e994c661fdc 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -2288,7 +2288,7 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
             }
             ty::AssociatedKind::Method => {
                 let generics = (cx.tcx.generics_of(self.def_id),
-                                &cx.tcx.predicates_of(self.def_id)).clean(cx);
+                                &cx.tcx.explicit_predicates_of(self.def_id)).clean(cx);
                 let sig = cx.tcx.fn_sig(self.def_id);
                 let mut decl = (self.def_id, sig).clean(cx);
 
@@ -2361,7 +2361,7 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
                     // are actually located on the trait/impl itself, so we need to load
                     // all of the generics from there and then look for bounds that are
                     // applied to this associated type in question.
-                    let predicates = cx.tcx.predicates_of(did);
+                    let predicates = cx.tcx.explicit_predicates_of(did);
                     let generics = (cx.tcx.generics_of(did), &predicates).clean(cx);
                     let mut bounds = generics.where_predicates.iter().filter_map(|pred| {
                         let (name, self_type, trait_, bounds) = match *pred {
@@ -3069,7 +3069,7 @@ impl<'tcx> Clean<Type> for Ty<'tcx> {
             ty::Opaque(def_id, substs) => {
                 // Grab the "TraitA + TraitB" from `impl TraitA + TraitB`,
                 // by looking up the projections associated with the def_id.
-                let predicates_of = cx.tcx.predicates_of(def_id);
+                let predicates_of = cx.tcx.explicit_predicates_of(def_id);
                 let substs = cx.tcx.lift(&substs).expect("Opaque lift failed");
                 let bounds = predicates_of.instantiate(cx.tcx, substs);
                 let mut regions = vec![];
diff --git a/src/test/rustdoc/useless_lifetime_bound.rs b/src/test/rustdoc/useless_lifetime_bound.rs
new file mode 100644
index 00000000000..f530d8a654f
--- /dev/null
+++ b/src/test/rustdoc/useless_lifetime_bound.rs
@@ -0,0 +1,13 @@
+use std::marker::PhantomData;
+
+// @has useless_lifetime_bound/struct.Scope.html
+// @!has - '//*[@class="rust struct"]' "'env: 'env"
+pub struct Scope<'env> {
+    _marker: PhantomData<&'env mut &'env ()>,
+}
+
+// @has useless_lifetime_bound/struct.Scope.html
+// @!has - '//*[@class="rust struct"]' "T: 'a + 'a"
+pub struct SomeStruct<'a, T: 'a> {
+    _marker: PhantomData<&'a T>,
+}