From d5290a3d5d7ae3d17cb30900062541083abb4ba3 Mon Sep 17 00:00:00 2001 From: Oli Scherer Date: Tue, 31 Aug 2021 14:38:21 +0000 Subject: [PATCH 1/9] Concrete regions can show up in mir borrowck if the originated from there. We used to not encounter them here, because we took regions from typeck's opaque type resolution by renumbering them. We don't do that anymore. --- .../src/borrow_check/region_infer/opaque_types.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs b/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs index e9ab62e1664f9..12fceeff0884c 100644 --- a/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs +++ b/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs @@ -82,15 +82,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { .find(|ur_vid| self.eval_equal(vid, **ur_vid)) .and_then(|ur_vid| self.definitions[*ur_vid].external_name) .unwrap_or(infcx.tcx.lifetimes.re_root_empty), - ty::ReLateBound(..) => region, - ty::ReStatic => region, - _ => { - infcx.tcx.sess.delay_span_bug( - span, - &format!("unexpected concrete region in borrowck: {:?}", region), - ); - region - } + _ => region, }); debug!(?universal_concrete_type, ?universal_substs); From bdf490bf331ddc320bf00ad14f4930f79843f4c7 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Mon, 30 Aug 2021 16:10:19 -0400 Subject: [PATCH 2/9] Fix loading large rlibs Bumps object crate to permit parsing archives with 64-bit table entries. These are primarily encountered when there's more than 4GB of archive data. --- Cargo.lock | 10 +-- compiler/rustc_codegen_ssa/Cargo.toml | 2 +- .../run-make/issue-88351-large-rlib/Makefile | 7 ++ .../run-make/issue-88351-large-rlib/bar.rs | 5 ++ .../run-make/issue-88351-large-rlib/main.rs | 64 +++++++++++++++++++ 5 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 src/test/run-make/issue-88351-large-rlib/Makefile create mode 100644 src/test/run-make/issue-88351-large-rlib/bar.rs create mode 100644 src/test/run-make/issue-88351-large-rlib/main.rs diff --git a/Cargo.lock b/Cargo.lock index 578a885a35d1b..085aae3d0b1c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2141,9 +2141,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" [[package]] name = "memmap2" @@ -2304,9 +2304,9 @@ dependencies = [ [[package]] name = "object" -version = "0.25.2" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bc1d42047cf336f0f939c99e97183cf31551bf0f2865a2ec9c8d91fd4ffb5e" +checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" dependencies = [ "crc32fast", "indexmap", @@ -3647,7 +3647,7 @@ dependencies = [ "itertools 0.9.0", "jobserver", "libc", - "object 0.25.2", + "object 0.26.2", "pathdiff", "rustc_apfloat", "rustc_ast", diff --git a/compiler/rustc_codegen_ssa/Cargo.toml b/compiler/rustc_codegen_ssa/Cargo.toml index a11098b11c6eb..f1e412df86149 100644 --- a/compiler/rustc_codegen_ssa/Cargo.toml +++ b/compiler/rustc_codegen_ssa/Cargo.toml @@ -36,6 +36,6 @@ rustc_target = { path = "../rustc_target" } rustc_session = { path = "../rustc_session" } [dependencies.object] -version = "0.25.2" +version = "0.26.2" default-features = false features = ["read_core", "elf", "macho", "pe", "unaligned", "archive", "write"] diff --git a/src/test/run-make/issue-88351-large-rlib/Makefile b/src/test/run-make/issue-88351-large-rlib/Makefile new file mode 100644 index 0000000000000..98938e5ebc473 --- /dev/null +++ b/src/test/run-make/issue-88351-large-rlib/Makefile @@ -0,0 +1,7 @@ +-include ../../run-make-fulldeps/tools.mk + +all: + $(RUSTC) main.rs + $(TMPDIR)/main $(TMPDIR) + $(RUSTC) $(TMPDIR)/foo.rs --crate-type=rlib -l static=foo -L$(TMPDIR) + RUSTC_LOG=rustc_metadata=debug $(RUSTC) bar.rs --extern foo=$(TMPDIR)/libfoo.rlib --edition=2018 diff --git a/src/test/run-make/issue-88351-large-rlib/bar.rs b/src/test/run-make/issue-88351-large-rlib/bar.rs new file mode 100644 index 0000000000000..1b6000364904e --- /dev/null +++ b/src/test/run-make/issue-88351-large-rlib/bar.rs @@ -0,0 +1,5 @@ +fn main() { + unsafe { + println!("{}", foo::FOO_11_49[0]); + } +} diff --git a/src/test/run-make/issue-88351-large-rlib/main.rs b/src/test/run-make/issue-88351-large-rlib/main.rs new file mode 100644 index 0000000000000..f97830f3d86fe --- /dev/null +++ b/src/test/run-make/issue-88351-large-rlib/main.rs @@ -0,0 +1,64 @@ +//! Large archive example. +//! +//! This creates several C files with a bunch of global arrays. The goal is to +//! create an rlib that is over 4GB in size so that the LLVM archiver creates +//! a /SYM64/ entry instead of /. +//! +//! It compiles the C files to .o files, and then uses `ar` to collect them +//! into a static library. It creates `foo.rs` with references to all the C +//! arrays, and then uses `rustc` to build an rlib with that static +//! information. It then creates `bar.rs` which links the giant libfoo.rlib, +//! which should fail since it can't read the large libfoo.rlib file. + +use std::env; +use std::fs::File; +use std::io::{BufWriter, Write}; +use std::process::Command; + +// Number of object files to create. +const NOBJ: u32 = 12; +// Make the filename longer than 16 characters to force names to be placed in // +const PREFIX: &str = "abcdefghijklmnopqrstuvwxyz"; + +fn main() { + let tmpdir = std::path::PathBuf::from(env::args_os().nth(1).unwrap()); + let mut foo_rs = File::create(tmpdir.join("foo.rs")).unwrap(); + write!(foo_rs, "extern \"C\" {{\n").unwrap(); + for obj in 0..NOBJ { + let filename = tmpdir.join(&format!("{}{}.c", PREFIX, obj)); + let f = File::create(&filename).unwrap(); + let mut buf = BufWriter::new(f); + write!(buf, "#include\n").unwrap(); + for n in 0..50 { + write!(buf, "int64_t FOO_{}_{}[] = {{\n", obj, n).unwrap(); + for x in 0..1024 { + for y in 0..1024 { + write!(buf, "{},", (obj + n + x + y) % 10).unwrap(); + } + write!(buf, "\n").unwrap(); + } + write!(buf, "}};\n").unwrap(); + write!(foo_rs, " pub static FOO_{}_{}: [i64; 1024*1024];\n", obj, n).unwrap(); + } + drop(buf); + println!("compile {:?}", filename); + let status = + Command::new("cc").current_dir(&tmpdir).arg("-c").arg(&filename).status().unwrap(); + if !status.success() { + panic!("failed: {:?}", status); + } + } + write!(foo_rs, "}}\n").unwrap(); + drop(foo_rs); + let mut cmd = Command::new("ar"); + cmd.arg("-crs"); + cmd.arg(tmpdir.join("libfoo.a")); + for obj in 0..NOBJ { + cmd.arg(tmpdir.join(&format!("{}{}.o", PREFIX, obj))); + } + println!("archiving: {:?}", cmd); + let status = cmd.status().unwrap(); + if !status.success() { + panic!("failed: {:?}", status); + } +} From cf546d6c63fdf5cfcd0f98230349ebd77997b5d4 Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Tue, 31 Aug 2021 10:20:49 -0400 Subject: [PATCH 3/9] Delete long-running large rlibs test This is kept to a separate commit so that the test itself is preserved in the commit history. --- .../run-make/issue-88351-large-rlib/Makefile | 7 -- .../run-make/issue-88351-large-rlib/bar.rs | 5 -- .../run-make/issue-88351-large-rlib/main.rs | 64 ------------------- 3 files changed, 76 deletions(-) delete mode 100644 src/test/run-make/issue-88351-large-rlib/Makefile delete mode 100644 src/test/run-make/issue-88351-large-rlib/bar.rs delete mode 100644 src/test/run-make/issue-88351-large-rlib/main.rs diff --git a/src/test/run-make/issue-88351-large-rlib/Makefile b/src/test/run-make/issue-88351-large-rlib/Makefile deleted file mode 100644 index 98938e5ebc473..0000000000000 --- a/src/test/run-make/issue-88351-large-rlib/Makefile +++ /dev/null @@ -1,7 +0,0 @@ --include ../../run-make-fulldeps/tools.mk - -all: - $(RUSTC) main.rs - $(TMPDIR)/main $(TMPDIR) - $(RUSTC) $(TMPDIR)/foo.rs --crate-type=rlib -l static=foo -L$(TMPDIR) - RUSTC_LOG=rustc_metadata=debug $(RUSTC) bar.rs --extern foo=$(TMPDIR)/libfoo.rlib --edition=2018 diff --git a/src/test/run-make/issue-88351-large-rlib/bar.rs b/src/test/run-make/issue-88351-large-rlib/bar.rs deleted file mode 100644 index 1b6000364904e..0000000000000 --- a/src/test/run-make/issue-88351-large-rlib/bar.rs +++ /dev/null @@ -1,5 +0,0 @@ -fn main() { - unsafe { - println!("{}", foo::FOO_11_49[0]); - } -} diff --git a/src/test/run-make/issue-88351-large-rlib/main.rs b/src/test/run-make/issue-88351-large-rlib/main.rs deleted file mode 100644 index f97830f3d86fe..0000000000000 --- a/src/test/run-make/issue-88351-large-rlib/main.rs +++ /dev/null @@ -1,64 +0,0 @@ -//! Large archive example. -//! -//! This creates several C files with a bunch of global arrays. The goal is to -//! create an rlib that is over 4GB in size so that the LLVM archiver creates -//! a /SYM64/ entry instead of /. -//! -//! It compiles the C files to .o files, and then uses `ar` to collect them -//! into a static library. It creates `foo.rs` with references to all the C -//! arrays, and then uses `rustc` to build an rlib with that static -//! information. It then creates `bar.rs` which links the giant libfoo.rlib, -//! which should fail since it can't read the large libfoo.rlib file. - -use std::env; -use std::fs::File; -use std::io::{BufWriter, Write}; -use std::process::Command; - -// Number of object files to create. -const NOBJ: u32 = 12; -// Make the filename longer than 16 characters to force names to be placed in // -const PREFIX: &str = "abcdefghijklmnopqrstuvwxyz"; - -fn main() { - let tmpdir = std::path::PathBuf::from(env::args_os().nth(1).unwrap()); - let mut foo_rs = File::create(tmpdir.join("foo.rs")).unwrap(); - write!(foo_rs, "extern \"C\" {{\n").unwrap(); - for obj in 0..NOBJ { - let filename = tmpdir.join(&format!("{}{}.c", PREFIX, obj)); - let f = File::create(&filename).unwrap(); - let mut buf = BufWriter::new(f); - write!(buf, "#include\n").unwrap(); - for n in 0..50 { - write!(buf, "int64_t FOO_{}_{}[] = {{\n", obj, n).unwrap(); - for x in 0..1024 { - for y in 0..1024 { - write!(buf, "{},", (obj + n + x + y) % 10).unwrap(); - } - write!(buf, "\n").unwrap(); - } - write!(buf, "}};\n").unwrap(); - write!(foo_rs, " pub static FOO_{}_{}: [i64; 1024*1024];\n", obj, n).unwrap(); - } - drop(buf); - println!("compile {:?}", filename); - let status = - Command::new("cc").current_dir(&tmpdir).arg("-c").arg(&filename).status().unwrap(); - if !status.success() { - panic!("failed: {:?}", status); - } - } - write!(foo_rs, "}}\n").unwrap(); - drop(foo_rs); - let mut cmd = Command::new("ar"); - cmd.arg("-crs"); - cmd.arg(tmpdir.join("libfoo.a")); - for obj in 0..NOBJ { - cmd.arg(tmpdir.join(&format!("{}{}.o", PREFIX, obj))); - } - println!("archiving: {:?}", cmd); - let status = cmd.status().unwrap(); - if !status.success() { - panic!("failed: {:?}", status); - } -} From 4ba1d2c0964e5d3ba1e89c5ceb121249fdfbcdc4 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 30 Aug 2021 16:04:28 +0200 Subject: [PATCH 4/9] Put back display of associated items (types and consts) --- src/librustdoc/html/render/mod.rs | 31 ++++++++++++++++++------ src/librustdoc/html/render/print_item.rs | 13 +++++++--- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 2b7f7aa3691bd..f95ab50c778ca 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -712,7 +712,9 @@ fn render_impls( None, false, true, + true, &[], + true, ); buffer.into_inner() }) @@ -1051,7 +1053,9 @@ fn render_assoc_items( None, false, true, + true, &[], + true, ); } } @@ -1251,9 +1255,12 @@ fn render_impl( use_absolute: Option, is_on_foreign_type: bool, show_default_items: bool, + // It'll exclude methods. + show_non_assoc_items: bool, // This argument is used to reference same type with different paths to avoid duplication // in documentation pages for trait with automatic implementations like "Send" and "Sync". aliases: &[String], + toggle_open_by_default: bool, ) { let cache = cx.cache(); let traits = &cache.traits; @@ -1277,16 +1284,18 @@ fn render_impl( is_default_item: bool, trait_: Option<&clean::Trait>, show_def_docs: bool, + show_non_assoc_items: bool, ) { let item_type = item.type_(); let name = item.name.as_ref().unwrap(); - let render_method_item = match render_mode { - RenderMode::Normal => true, - RenderMode::ForDeref { mut_: deref_mut_ } => { - should_render_item(&item, deref_mut_, &cx.cache) - } - }; + let render_method_item = show_non_assoc_items + && match render_mode { + RenderMode::Normal => true, + RenderMode::ForDeref { mut_: deref_mut_ } => { + should_render_item(&item, deref_mut_, &cx.cache) + } + }; let in_trait_class = if trait_.is_some() { " trait-impl" } else { "" }; @@ -1453,6 +1462,7 @@ fn render_impl( false, trait_.map(|t| &t.trait_), show_def_docs, + show_non_assoc_items, ); } @@ -1466,6 +1476,7 @@ fn render_impl( containing_item: &clean::Item, render_mode: RenderMode, show_def_docs: bool, + show_non_assoc_items: bool, ) { for trait_item in &t.items { let n = trait_item.name; @@ -1488,6 +1499,7 @@ fn render_impl( true, Some(t), show_def_docs, + show_non_assoc_items, ); } } @@ -1508,6 +1520,7 @@ fn render_impl( parent, render_mode, show_def_docs, + show_non_assoc_items, ); } } @@ -1515,7 +1528,11 @@ fn render_impl( let toggled = !(impl_items.is_empty() && default_impl_items.is_empty()); if toggled { close_tags.insert_str(0, ""); - write!(w, "
"); + write!( + w, + "
", + if toggle_open_by_default { " open" } else { "" } + ); write!(w, "") } render_impl_summary( diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 2290f51aa80c6..87f5ede57a2ad 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -16,8 +16,7 @@ use rustc_span::symbol::{kw, sym, Symbol}; use super::{ collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl, render_assoc_item, render_assoc_items, render_attributes_in_code, render_attributes_in_pre, - render_impl, render_impl_summary, render_stability_since_raw, write_srclink, AssocItemLink, - Context, + render_impl, render_stability_since_raw, write_srclink, AssocItemLink, Context, }; use crate::clean::{self, GetDefId}; use crate::formats::item_type::ItemType; @@ -739,7 +738,9 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra None, true, false, + true, &[], + false, ); } } @@ -1361,16 +1362,20 @@ fn render_implementor( } => implementor_dups[&path.last()].1, _ => false, }; - render_impl_summary( + render_impl( w, cx, implementor, trait_, - trait_, + AssocItemLink::Anchor(None), + RenderMode::Normal, false, Some(use_absolute), false, + false, + false, aliases, + false, ); } From 938bbdbb9875546724a05c6cc3d3bfd52a584edd Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 30 Aug 2021 16:11:10 +0200 Subject: [PATCH 5/9] Put back "auto-collapse-implementors" setting --- src/librustdoc/html/render/mod.rs | 1 + src/librustdoc/html/static/js/main.js | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index f95ab50c778ca..3ff73182a987c 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -451,6 +451,7 @@ fn settings(root_path: &str, suffix: &str, themes: &[StylePath]) -> Result Date: Mon, 30 Aug 2021 16:47:17 +0200 Subject: [PATCH 6/9] Add tests for implementors associated types display --- src/test/rustdoc-gui/implementors.goml | 18 +++++++++--------- .../rustdoc-gui/src/lib2/implementors/lib.rs | 6 +++++- src/test/rustdoc-gui/src/lib2/lib.rs | 4 +++- src/test/rustdoc-gui/toggle-implementors.goml | 13 +++++++++++++ .../trait-impl-items-links-and-anchors.rs | 11 ++++++++++- 5 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 src/test/rustdoc-gui/toggle-implementors.goml diff --git a/src/test/rustdoc-gui/implementors.goml b/src/test/rustdoc-gui/implementors.goml index 87e4f2a7bd141..c9042eb4813ab 100644 --- a/src/test/rustdoc-gui/implementors.goml +++ b/src/test/rustdoc-gui/implementors.goml @@ -3,14 +3,14 @@ goto: file://|DOC_PATH|/implementors/trait.Whatever.html assert: "#implementors-list" // There are supposed to be two implementors listed. -assert-count: ("#implementors-list > .impl", 2) +assert-count: ("#implementors-list .impl", 2) // Now we check that both implementors have an anchor, an ID and a similar DOM. -assert: ("#implementors-list > .impl:nth-child(1) > a.anchor") -assert-attribute: ("#implementors-list > .impl:nth-child(1)", {"id": "impl-Whatever"}) -assert-attribute: ("#implementors-list > .impl:nth-child(1) > a.anchor", {"href": "#impl-Whatever"}) -assert: "#implementors-list > .impl:nth-child(1) > .code-header.in-band" +assert: ("#implementors-list .impl:nth-child(1) > a.anchor") +assert-attribute: ("#implementors-list .impl:nth-child(1)", {"id": "impl-Whatever"}) +assert-attribute: ("#implementors-list .impl:nth-child(1) > a.anchor", {"href": "#impl-Whatever"}) +assert: "#implementors-list .impl:nth-child(1) > .code-header.in-band" -assert: ("#implementors-list > .impl:nth-child(2) > a.anchor") -assert-attribute: ("#implementors-list > .impl:nth-child(2)", {"id": "impl-Whatever-1"}) -assert-attribute: ("#implementors-list > .impl:nth-child(2) > a.anchor", {"href": "#impl-Whatever-1"}) -assert: "#implementors-list > .impl:nth-child(2) > .code-header.in-band" +assert: ("#implementors-list .impl:nth-child(2) > a.anchor") +assert-attribute: ("#implementors-list .impl:nth-child(2)", {"id": "impl-Whatever-1"}) +assert-attribute: ("#implementors-list .impl:nth-child(2) > a.anchor", {"href": "#impl-Whatever-1"}) +assert: "#implementors-list .impl:nth-child(2) > .code-header.in-band" diff --git a/src/test/rustdoc-gui/src/lib2/implementors/lib.rs b/src/test/rustdoc-gui/src/lib2/implementors/lib.rs index 4b2f6962e30c5..6417a6ac5af6d 100644 --- a/src/test/rustdoc-gui/src/lib2/implementors/lib.rs +++ b/src/test/rustdoc-gui/src/lib2/implementors/lib.rs @@ -1,7 +1,11 @@ pub trait Whatever { + type Foo; + fn method() {} } pub struct Struct; -impl Whatever for Struct {} +impl Whatever for Struct { + type Foo = u8; +} diff --git a/src/test/rustdoc-gui/src/lib2/lib.rs b/src/test/rustdoc-gui/src/lib2/lib.rs index 36373d24971c9..cb63a9f600227 100644 --- a/src/test/rustdoc-gui/src/lib2/lib.rs +++ b/src/test/rustdoc-gui/src/lib2/lib.rs @@ -38,7 +38,9 @@ impl Trait for Foo { } -impl implementors::Whatever for Foo {} +impl implementors::Whatever for Foo { + type Foo = u32; +} pub mod sub_mod { /// ```txt diff --git a/src/test/rustdoc-gui/toggle-implementors.goml b/src/test/rustdoc-gui/toggle-implementors.goml new file mode 100644 index 0000000000000..4b2a266c7128a --- /dev/null +++ b/src/test/rustdoc-gui/toggle-implementors.goml @@ -0,0 +1,13 @@ +// This test ensures two things: +// +// 1. The implementors toggle are not open by default. +// 2. The "auto-collapse-implementors" setting is working as expected. +goto: file://|DOC_PATH|/implementors/trait.Whatever.html + +// First, checking that they are not open by default. +assert-attribute-false: ("#implementors-list > details", {"open": ""}, ALL) + +// Second, checking "auto-collapse-implementors" setting. +local-storage: {"rustdoc-auto-collapse-implementors": false} +reload: +assert-attribute: ("#implementors-list > details", {"open": ""}, ALL) diff --git a/src/test/rustdoc/trait-impl-items-links-and-anchors.rs b/src/test/rustdoc/trait-impl-items-links-and-anchors.rs index ddbe93febdc25..4d25835bf08fd 100644 --- a/src/test/rustdoc/trait-impl-items-links-and-anchors.rs +++ b/src/test/rustdoc/trait-impl-items-links-and-anchors.rs @@ -1,6 +1,6 @@ pub trait MyTrait { type Assoc; - const VALUE: u32; + const VALUE: u32 = 12; fn trait_function(&self); fn defaulted(&self) {} fn defaulted_override(&self) {} @@ -38,9 +38,11 @@ impl MyTrait for Vec { } impl MyTrait for MyStruct { + // @has trait_impl_items_links_and_anchors/trait.MyTrait.html '//div[@id="associatedtype.Assoc-3"]//a[@class="anchor"]/@href' #associatedtype.Assoc-3 // @has trait_impl_items_links_and_anchors/struct.MyStruct.html '//div[@id="associatedtype.Assoc"]//a[@class="type"]/@href' trait.MyTrait.html#associatedtype.Assoc // @has trait_impl_items_links_and_anchors/struct.MyStruct.html '//div[@id="associatedtype.Assoc"]//a[@class="anchor"]/@href' #associatedtype.Assoc type Assoc = bool; + // @has trait_impl_items_links_and_anchors/trait.MyTrait.html '//div[@id="associatedconstant.VALUE-3"]//a[@class="anchor"]/@href' #associatedconstant.VALUE-3 // @has trait_impl_items_links_and_anchors/struct.MyStruct.html '//div[@id="associatedconstant.VALUE"]//a[@class="constant"]/@href' trait.MyTrait.html#associatedconstant.VALUE // @has trait_impl_items_links_and_anchors/struct.MyStruct.html '//div[@id="associatedconstant.VALUE"]//a[@class="anchor"]/@href' #associatedconstant.VALUE const VALUE: u32 = 20; @@ -55,3 +57,10 @@ impl MyTrait for MyStruct { } pub struct MyStruct; + +// We check that associated items with default values aren't generated in the implementors list. +impl MyTrait for (u8, u8) { + // @!has trait_impl_items_links_and_anchors/trait.MyTrait.html '//div[@id="associatedconstant.VALUE-4"]' + type Assoc = bool; + fn trait_function(&self) {} +} From 42c8fbcfbf0b7fe31b16c6de8e76f57ad5dc21bd Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 31 Aug 2021 12:20:02 +0200 Subject: [PATCH 7/9] Clean render_impl arguments --- src/librustdoc/html/render/mod.rs | 88 ++++++++++++++---------- src/librustdoc/html/render/print_item.rs | 25 ++++--- 2 files changed, 67 insertions(+), 46 deletions(-) diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 3ff73182a987c..864af075245c8 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -709,13 +709,15 @@ fn render_impls( containing_item, assoc_link, RenderMode::Normal, - true, None, - false, - true, - true, &[], - true, + ImplRenderingParameters { + show_def_docs: true, + is_on_foreign_type: false, + show_default_items: true, + show_non_assoc_items: true, + toggle_open_by_default: true, + }, ); buffer.into_inner() }) @@ -1050,13 +1052,15 @@ fn render_assoc_items( containing_item, AssocItemLink::Anchor(None), render_mode, - true, None, - false, - true, - true, &[], - true, + ImplRenderingParameters { + show_def_docs: true, + is_on_foreign_type: false, + show_default_items: true, + show_non_assoc_items: true, + toggle_open_by_default: true, + }, ); } } @@ -1245,6 +1249,16 @@ fn notable_traits_decl(decl: &clean::FnDecl, cx: &Context<'_>) -> String { out.into_inner() } +#[derive(Clone, Copy, Debug)] +struct ImplRenderingParameters { + show_def_docs: bool, + is_on_foreign_type: bool, + show_default_items: bool, + /// Whether or not to show methods. + show_non_assoc_items: bool, + toggle_open_by_default: bool, +} + fn render_impl( w: &mut Buffer, cx: &Context<'_>, @@ -1252,16 +1266,9 @@ fn render_impl( parent: &clean::Item, link: AssocItemLink<'_>, render_mode: RenderMode, - show_def_docs: bool, use_absolute: Option, - is_on_foreign_type: bool, - show_default_items: bool, - // It'll exclude methods. - show_non_assoc_items: bool, - // This argument is used to reference same type with different paths to avoid duplication - // in documentation pages for trait with automatic implementations like "Send" and "Sync". aliases: &[String], - toggle_open_by_default: bool, + rendering_params: ImplRenderingParameters, ) { let cache = cx.cache(); let traits = &cache.traits; @@ -1284,13 +1291,12 @@ fn render_impl( render_mode: RenderMode, is_default_item: bool, trait_: Option<&clean::Trait>, - show_def_docs: bool, - show_non_assoc_items: bool, + rendering_params: ImplRenderingParameters, ) { let item_type = item.type_(); let name = item.name.as_ref().unwrap(); - let render_method_item = show_non_assoc_items + let render_method_item = rendering_params.show_non_assoc_items && match render_mode { RenderMode::Normal => true, RenderMode::ForDeref { mut_: deref_mut_ } => { @@ -1319,18 +1325,32 @@ fn render_impl( } else { // In case the item isn't documented, // provide short documentation from the trait. - document_short(&mut doc_buffer, it, cx, link, parent, show_def_docs); + document_short( + &mut doc_buffer, + it, + cx, + link, + parent, + rendering_params.show_def_docs, + ); } } } else { document_item_info(&mut info_buffer, cx, item, Some(parent)); - if show_def_docs { + if rendering_params.show_def_docs { document_full(&mut doc_buffer, item, cx); short_documented = false; } } } else { - document_short(&mut doc_buffer, item, cx, link, parent, show_def_docs); + document_short( + &mut doc_buffer, + item, + cx, + link, + parent, + rendering_params.show_def_docs, + ); } } let w = if short_documented && trait_.is_some() { interesting } else { boring }; @@ -1462,8 +1482,7 @@ fn render_impl( render_mode, false, trait_.map(|t| &t.trait_), - show_def_docs, - show_non_assoc_items, + rendering_params, ); } @@ -1476,8 +1495,7 @@ fn render_impl( parent: &clean::Item, containing_item: &clean::Item, render_mode: RenderMode, - show_def_docs: bool, - show_non_assoc_items: bool, + rendering_params: ImplRenderingParameters, ) { for trait_item in &t.items { let n = trait_item.name; @@ -1499,8 +1517,7 @@ fn render_impl( render_mode, true, Some(t), - show_def_docs, - show_non_assoc_items, + rendering_params, ); } } @@ -1509,7 +1526,7 @@ fn render_impl( // default items which weren't overridden in the implementation block. // We don't emit documentation for default items if they appear in the // Implementations on Foreign Types or Implementors sections. - if show_default_items { + if rendering_params.show_default_items { if let Some(t) = trait_ { render_default_items( &mut default_impl_items, @@ -1520,8 +1537,7 @@ fn render_impl( &i.impl_item, parent, render_mode, - show_def_docs, - show_non_assoc_items, + rendering_params, ); } } @@ -1532,7 +1548,7 @@ fn render_impl( write!( w, "
", - if toggle_open_by_default { " open" } else { "" } + if rendering_params.toggle_open_by_default { " open" } else { "" } ); write!(w, "") } @@ -1542,9 +1558,9 @@ fn render_impl( i, parent, parent, - show_def_docs, + rendering_params.show_def_docs, use_absolute, - is_on_foreign_type, + rendering_params.is_on_foreign_type, aliases, ); if toggled { diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 87f5ede57a2ad..b12e56bfe9b3c 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -17,6 +17,7 @@ use super::{ collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl, render_assoc_item, render_assoc_items, render_attributes_in_code, render_attributes_in_pre, render_impl, render_stability_since_raw, write_srclink, AssocItemLink, Context, + ImplRenderingParameters, }; use crate::clean::{self, GetDefId}; use crate::formats::item_type::ItemType; @@ -734,13 +735,15 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra it, assoc_link, RenderMode::Normal, - false, None, - true, - false, - true, &[], - false, + ImplRenderingParameters { + show_def_docs: false, + is_on_foreign_type: true, + show_default_items: false, + show_non_assoc_items: true, + toggle_open_by_default: false, + }, ); } } @@ -1369,13 +1372,15 @@ fn render_implementor( trait_, AssocItemLink::Anchor(None), RenderMode::Normal, - false, Some(use_absolute), - false, - false, - false, aliases, - false, + ImplRenderingParameters { + show_def_docs: false, + is_on_foreign_type: false, + show_default_items: false, + show_non_assoc_items: false, + toggle_open_by_default: false, + }, ); } From 3a3bf5f1bae06e6cacf2b588a671b15fa796efff Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 1 Sep 2021 20:34:51 +0200 Subject: [PATCH 8/9] Remove implementors setting --- src/librustdoc/html/render/mod.rs | 1 - src/librustdoc/html/static/js/main.js | 5 ----- src/test/rustdoc-gui/toggle-implementors.goml | 11 +---------- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 864af075245c8..fab7440817ce5 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -451,7 +451,6 @@ fn settings(root_path: &str, suffix: &str, themes: &[StylePath]) -> Result details", {"open": ""}, ALL) - -// Second, checking "auto-collapse-implementors" setting. -local-storage: {"rustdoc-auto-collapse-implementors": false} -reload: -assert-attribute: ("#implementors-list > details", {"open": ""}, ALL) From 01ab4413e17bbbbcfe3aa32449379061a9ac9c0e Mon Sep 17 00:00:00 2001 From: Simonas Kazlauskas Date: Fri, 27 Aug 2021 19:27:45 +0300 Subject: [PATCH 9/9] Tracking issue for UNSUPPORTED_CALLING_CONVENTIONS --- compiler/rustc_lint_defs/src/builtin.rs | 2 +- src/test/ui/abi/unsupported.aarch64.stderr | 4 ++-- src/test/ui/abi/unsupported.x64.stderr | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index 5b1cd0bcb3ffe..1b416f37bde74 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -3345,6 +3345,6 @@ declare_lint! { Warn, "use of unsupported calling convention", @future_incompatible = FutureIncompatibleInfo { - reference: "issue #00000 ", + reference: "issue #87678 ", }; } diff --git a/src/test/ui/abi/unsupported.aarch64.stderr b/src/test/ui/abi/unsupported.aarch64.stderr index 890174537592f..fdeb79f93e9f2 100644 --- a/src/test/ui/abi/unsupported.aarch64.stderr +++ b/src/test/ui/abi/unsupported.aarch64.stderr @@ -42,7 +42,7 @@ LL | extern "stdcall" fn stdcall() {} | = note: `#[warn(unsupported_calling_conventions)]` on by default = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #00000 + = note: for more information, see issue #87678 warning: use of calling convention not supported on this target --> $DIR/unsupported.rs:44:1 @@ -51,7 +51,7 @@ LL | extern "thiscall" fn thiscall() {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #00000 + = note: for more information, see issue #87678 error: aborting due to 6 previous errors; 2 warnings emitted diff --git a/src/test/ui/abi/unsupported.x64.stderr b/src/test/ui/abi/unsupported.x64.stderr index 5c68461e4fb39..60d067acf174f 100644 --- a/src/test/ui/abi/unsupported.x64.stderr +++ b/src/test/ui/abi/unsupported.x64.stderr @@ -42,7 +42,7 @@ LL | extern "stdcall" fn stdcall() {} | = note: `#[warn(unsupported_calling_conventions)]` on by default = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #00000 + = note: for more information, see issue #87678 warning: use of calling convention not supported on this target --> $DIR/unsupported.rs:44:1 @@ -51,7 +51,7 @@ LL | extern "thiscall" fn thiscall() {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! - = note: for more information, see issue #00000 + = note: for more information, see issue #87678 error: aborting due to 6 previous errors; 2 warnings emitted