Auto merge of #107788 - matthiaskrgr:rollup-mw10sli, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #107656 (Bump rust-installer) - #107757 (Allow automatically creating vscode `settings.json` with `x setup`) - #107769 (Rename `PointerSized` to `PointerLike`) - #107770 (rustdoc: use a newline instead of `<br>` to format code headers) - #107771 (Tweak ICE message) - #107773 (Clearly signal purpose of the yaml template) - #107776 (Docs: Fix format of headings in String::reserve) - #107779 (Remove astconv usage in diagnostic) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
6eb9f2dd67
2
.github/ISSUE_TEMPLATE/ice.yaml
vendored
2
.github/ISSUE_TEMPLATE/ice.yaml
vendored
@ -1,4 +1,4 @@
|
||||
name: Internal Compiler Error (Structured form)
|
||||
name: Internal Compiler Error (for use by automated tooling)
|
||||
description: For now, you'll want to use the other ICE template, as GitHub forms have strict limits on the size of fields so backtraces cannot be pasted directly.
|
||||
labels: ["C-bug", "I-ICE", "T-compiler"]
|
||||
title: "[ICE]: "
|
||||
|
@ -126,7 +126,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
let vtable = self.get_vtable_ptr(src.layout.ty, data.principal())?;
|
||||
let vtable = Scalar::from_maybe_pointer(vtable, self);
|
||||
let data = self.read_immediate(src)?.to_scalar();
|
||||
let _assert_pointer_sized = data.to_pointer(self)?;
|
||||
let _assert_pointer_like = data.to_pointer(self)?;
|
||||
let val = Immediate::ScalarPair(data, vtable);
|
||||
self.write_immediate(val, dest)?;
|
||||
} else {
|
||||
|
@ -1200,11 +1200,9 @@ pub fn report_ice(info: &panic::PanicInfo<'_>, bug_report_url: &str) {
|
||||
if !info.payload().is::<rustc_errors::ExplicitBug>()
|
||||
&& !info.payload().is::<rustc_errors::DelayedBugPanic>()
|
||||
{
|
||||
let mut d = rustc_errors::Diagnostic::new(rustc_errors::Level::Bug, "unexpected panic");
|
||||
handler.emit_diagnostic(&mut d);
|
||||
handler.emit_err(session_diagnostics::Ice);
|
||||
}
|
||||
|
||||
handler.emit_note(session_diagnostics::Ice);
|
||||
handler.emit_note(session_diagnostics::IceBugReport { bug_report_url });
|
||||
handler.emit_note(session_diagnostics::IceVersion {
|
||||
version: util::version_str!().unwrap_or("unknown_version"),
|
||||
|
@ -287,7 +287,7 @@ language_item_table! {
|
||||
TryTraitBranch, sym::branch, branch_fn, Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
|
||||
TryTraitFromYeet, sym::from_yeet, from_yeet_fn, Target::Fn, GenericRequirement::None;
|
||||
|
||||
PointerSized, sym::pointer_sized, pointer_sized, Target::Trait, GenericRequirement::Exact(0);
|
||||
PointerLike, sym::pointer_like, pointer_like, Target::Trait, GenericRequirement::Exact(0);
|
||||
|
||||
Poll, sym::Poll, poll, Target::Enum, GenericRequirement::None;
|
||||
PollReady, sym::Ready, poll_ready_variant, Target::Variant, GenericRequirement::None;
|
||||
|
@ -765,7 +765,7 @@ impl<'f, 'tcx> Coerce<'f, 'tcx> {
|
||||
self.cause.clone(),
|
||||
self.param_env,
|
||||
ty::Binder::dummy(
|
||||
self.tcx.at(self.cause.span).mk_trait_ref(hir::LangItem::PointerSized, [a]),
|
||||
self.tcx.at(self.cause.span).mk_trait_ref(hir::LangItem::PointerLike, [a]),
|
||||
),
|
||||
));
|
||||
|
||||
|
@ -1336,16 +1336,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
hir::Path { segments: [segment], .. },
|
||||
))
|
||||
| hir::ExprKind::Path(QPath::TypeRelative(ty, segment)) => {
|
||||
let self_ty = self.astconv().ast_ty_to_ty(ty);
|
||||
if let Ok(pick) = self.probe_for_name(
|
||||
Mode::Path,
|
||||
Ident::new(capitalized_name, segment.ident.span),
|
||||
Some(expected_ty),
|
||||
IsSuggestion(true),
|
||||
self_ty,
|
||||
expr.hir_id,
|
||||
ProbeScope::TraitsInScope,
|
||||
) {
|
||||
if let Some(self_ty) = self.typeck_results.borrow().node_type_opt(ty.hir_id)
|
||||
&& let Ok(pick) = self.probe_for_name(
|
||||
Mode::Path,
|
||||
Ident::new(capitalized_name, segment.ident.span),
|
||||
Some(expected_ty),
|
||||
IsSuggestion(true),
|
||||
self_ty,
|
||||
expr.hir_id,
|
||||
ProbeScope::TraitsInScope,
|
||||
)
|
||||
{
|
||||
(pick.item, segment)
|
||||
} else {
|
||||
return false;
|
||||
|
@ -1084,7 +1084,7 @@ symbols! {
|
||||
plugins,
|
||||
pointee_trait,
|
||||
pointer,
|
||||
pointer_sized,
|
||||
pointer_like,
|
||||
poll,
|
||||
position,
|
||||
post_dash_lto: "post-lto",
|
||||
|
@ -128,9 +128,9 @@ pub(super) trait GoalKind<'tcx>: TypeFoldable<'tcx> + Copy + Eq {
|
||||
goal: Goal<'tcx, Self>,
|
||||
) -> QueryResult<'tcx>;
|
||||
|
||||
// A type is `PointerSized` if we can compute its layout, and that layout
|
||||
// A type is `PointerLike` if we can compute its layout, and that layout
|
||||
// matches the layout of `usize`.
|
||||
fn consider_builtin_pointer_sized_candidate(
|
||||
fn consider_builtin_pointer_like_candidate(
|
||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||
goal: Goal<'tcx, Self>,
|
||||
) -> QueryResult<'tcx>;
|
||||
@ -312,8 +312,8 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
|
||||
|| lang_items.clone_trait() == Some(trait_def_id)
|
||||
{
|
||||
G::consider_builtin_copy_clone_candidate(self, goal)
|
||||
} else if lang_items.pointer_sized() == Some(trait_def_id) {
|
||||
G::consider_builtin_pointer_sized_candidate(self, goal)
|
||||
} else if lang_items.pointer_like() == Some(trait_def_id) {
|
||||
G::consider_builtin_pointer_like_candidate(self, goal)
|
||||
} else if let Some(kind) = self.tcx().fn_trait_kind_from_def_id(trait_def_id) {
|
||||
G::consider_builtin_fn_trait_candidates(self, goal, kind)
|
||||
} else if lang_items.tuple_trait() == Some(trait_def_id) {
|
||||
|
@ -370,11 +370,11 @@ impl<'tcx> assembly::GoalKind<'tcx> for ProjectionPredicate<'tcx> {
|
||||
bug!("`Copy`/`Clone` does not have an associated type: {:?}", goal);
|
||||
}
|
||||
|
||||
fn consider_builtin_pointer_sized_candidate(
|
||||
fn consider_builtin_pointer_like_candidate(
|
||||
_ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||
goal: Goal<'tcx, Self>,
|
||||
) -> QueryResult<'tcx> {
|
||||
bug!("`PointerSized` does not have an associated type: {:?}", goal);
|
||||
bug!("`PointerLike` does not have an associated type: {:?}", goal);
|
||||
}
|
||||
|
||||
fn consider_builtin_fn_trait_candidates(
|
||||
|
@ -131,7 +131,7 @@ impl<'tcx> assembly::GoalKind<'tcx> for TraitPredicate<'tcx> {
|
||||
)
|
||||
}
|
||||
|
||||
fn consider_builtin_pointer_sized_candidate(
|
||||
fn consider_builtin_pointer_like_candidate(
|
||||
ecx: &mut EvalCtxt<'_, 'tcx>,
|
||||
goal: Goal<'tcx, Self>,
|
||||
) -> QueryResult<'tcx> {
|
||||
|
@ -94,7 +94,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
self.assemble_candidates_for_transmutability(obligation, &mut candidates);
|
||||
} else if lang_items.tuple_trait() == Some(def_id) {
|
||||
self.assemble_candidate_for_tuple(obligation, &mut candidates);
|
||||
} else if lang_items.pointer_sized() == Some(def_id) {
|
||||
} else if lang_items.pointer_like() == Some(def_id) {
|
||||
self.assemble_candidate_for_ptr_sized(obligation, &mut candidates);
|
||||
} else {
|
||||
if lang_items.clone_trait() == Some(def_id) {
|
||||
|
@ -928,12 +928,12 @@ impl String {
|
||||
|
||||
/// Copies elements from `src` range to the end of the string.
|
||||
///
|
||||
/// ## Panics
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if the starting point or end point do not lie on a [`char`]
|
||||
/// boundary, or if they're out of bounds.
|
||||
///
|
||||
/// ## Examples
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(string_extend_from_within)]
|
||||
|
@ -872,13 +872,14 @@ pub trait Destruct {}
|
||||
pub trait Tuple {}
|
||||
|
||||
/// A marker for things
|
||||
#[unstable(feature = "pointer_sized_trait", issue = "none")]
|
||||
#[lang = "pointer_sized"]
|
||||
#[unstable(feature = "pointer_like_trait", issue = "none")]
|
||||
#[cfg_attr(bootstrap, lang = "pointer_sized")]
|
||||
#[cfg_attr(not(bootstrap), lang = "pointer_like")]
|
||||
#[rustc_on_unimplemented(
|
||||
message = "`{Self}` needs to be a pointer-sized type",
|
||||
label = "`{Self}` needs to be a pointer-sized type"
|
||||
message = "`{Self}` needs to have the same alignment and size as a pointer",
|
||||
label = "`{Self}` needs to be a pointer-like type"
|
||||
)]
|
||||
pub trait PointerSized {}
|
||||
pub trait PointerLike {}
|
||||
|
||||
/// Implementations of `Copy` for primitive types.
|
||||
///
|
||||
|
@ -1,6 +1,7 @@
|
||||
use crate::builder::{Builder, RunConfig, ShouldRun, Step};
|
||||
use crate::Config;
|
||||
use crate::{t, VERSION};
|
||||
use sha2::Digest;
|
||||
use std::env::consts::EXE_SUFFIX;
|
||||
use std::fmt::Write as _;
|
||||
use std::fs::File;
|
||||
@ -10,6 +11,9 @@ use std::process::Command;
|
||||
use std::str::FromStr;
|
||||
use std::{fmt, fs, io};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
|
||||
pub enum Profile {
|
||||
Compiler,
|
||||
@ -19,6 +23,13 @@ pub enum Profile {
|
||||
User,
|
||||
}
|
||||
|
||||
/// A list of historical hashes of `src/etc/vscode_settings.json`.
|
||||
/// New entries should be appended whenever this is updated so we can detected
|
||||
/// outdated vs. user-modified settings files.
|
||||
static SETTINGS_HASHES: &[&str] =
|
||||
&["ea67e259dedf60d4429b6c349a564ffcd1563cf41c920a856d1f5b16b4701ac8"];
|
||||
static VSCODE_SETTINGS: &str = include_str!("../etc/vscode_settings.json");
|
||||
|
||||
impl Profile {
|
||||
fn include_path(&self, src_path: &Path) -> PathBuf {
|
||||
PathBuf::from(format!("{}/src/bootstrap/defaults/config.{}.toml", src_path.display(), self))
|
||||
@ -155,6 +166,7 @@ pub fn setup(config: &Config, profile: Profile) {
|
||||
|
||||
if !config.dry_run() {
|
||||
t!(install_git_hook_maybe(&config));
|
||||
t!(create_vscode_settings_maybe(&config));
|
||||
}
|
||||
|
||||
println!();
|
||||
@ -351,6 +363,34 @@ pub fn interactive_path() -> io::Result<Profile> {
|
||||
Ok(template)
|
||||
}
|
||||
|
||||
#[derive(PartialEq)]
|
||||
enum PromptResult {
|
||||
Yes, // y/Y/yes
|
||||
No, // n/N/no
|
||||
Print, // p/P/print
|
||||
}
|
||||
|
||||
/// Prompt a user for a answer, looping until they enter an accepted input or nothing
|
||||
fn prompt_user(prompt: &str) -> io::Result<Option<PromptResult>> {
|
||||
let mut input = String::new();
|
||||
loop {
|
||||
print!("{prompt} ");
|
||||
io::stdout().flush()?;
|
||||
input.clear();
|
||||
io::stdin().read_line(&mut input)?;
|
||||
match input.trim().to_lowercase().as_str() {
|
||||
"y" | "yes" => return Ok(Some(PromptResult::Yes)),
|
||||
"n" | "no" => return Ok(Some(PromptResult::No)),
|
||||
"p" | "print" => return Ok(Some(PromptResult::Print)),
|
||||
"" => return Ok(None),
|
||||
_ => {
|
||||
eprintln!("error: unrecognized option '{}'", input.trim());
|
||||
eprintln!("note: press Ctrl+C to exit");
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// install a git hook to automatically run tidy, if they want
|
||||
fn install_git_hook_maybe(config: &Config) -> io::Result<()> {
|
||||
let git = t!(config.git().args(&["rev-parse", "--git-common-dir"]).output().map(|output| {
|
||||
@ -363,43 +403,98 @@ fn install_git_hook_maybe(config: &Config) -> io::Result<()> {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let mut input = String::new();
|
||||
println!();
|
||||
println!(
|
||||
"Rust's CI will automatically fail if it doesn't pass `tidy`, the internal tool for ensuring code quality.
|
||||
"\nRust's CI will automatically fail if it doesn't pass `tidy`, the internal tool for ensuring code quality.
|
||||
If you'd like, x.py can install a git hook for you that will automatically run `test tidy` before
|
||||
pushing your code to ensure your code is up to par. If you decide later that this behavior is
|
||||
undesirable, simply delete the `pre-push` file from .git/hooks."
|
||||
);
|
||||
|
||||
let should_install = loop {
|
||||
print!("Would you like to install the git hook?: [y/N] ");
|
||||
io::stdout().flush()?;
|
||||
input.clear();
|
||||
io::stdin().read_line(&mut input)?;
|
||||
break match input.trim().to_lowercase().as_str() {
|
||||
"y" | "yes" => true,
|
||||
"n" | "no" | "" => false,
|
||||
_ => {
|
||||
eprintln!("error: unrecognized option '{}'", input.trim());
|
||||
eprintln!("note: press Ctrl+C to exit");
|
||||
continue;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
if should_install {
|
||||
let src = config.src.join("src").join("etc").join("pre-push.sh");
|
||||
match fs::hard_link(src, &dst) {
|
||||
Err(e) => eprintln!(
|
||||
if prompt_user("Would you like to install the git hook?: [y/N]")? != Some(PromptResult::Yes) {
|
||||
println!("Ok, skipping installation!");
|
||||
return Ok(());
|
||||
}
|
||||
let src = config.src.join("src").join("etc").join("pre-push.sh");
|
||||
match fs::hard_link(src, &dst) {
|
||||
Err(e) => {
|
||||
eprintln!(
|
||||
"error: could not create hook {}: do you already have the git hook installed?\n{}",
|
||||
dst.display(),
|
||||
e
|
||||
),
|
||||
Ok(_) => println!("Linked `src/etc/pre-push.sh` to `.git/hooks/pre-push`"),
|
||||
);
|
||||
return Err(e);
|
||||
}
|
||||
Ok(_) => println!("Linked `src/etc/pre-push.sh` to `.git/hooks/pre-push`"),
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Create a `.vscode/settings.json` file for rustc development, or just print it
|
||||
fn create_vscode_settings_maybe(config: &Config) -> io::Result<()> {
|
||||
let (current_hash, historical_hashes) = SETTINGS_HASHES.split_last().unwrap();
|
||||
let vscode_settings = config.src.join(".vscode").join("settings.json");
|
||||
// If None, no settings.json exists
|
||||
// If Some(true), is a previous version of settings.json
|
||||
// If Some(false), is not a previous version (i.e. user modified)
|
||||
// If it's up to date we can just skip this
|
||||
let mut mismatched_settings = None;
|
||||
if let Ok(current) = fs::read_to_string(&vscode_settings) {
|
||||
let mut hasher = sha2::Sha256::new();
|
||||
hasher.update(¤t);
|
||||
let hash = hex::encode(hasher.finalize().as_slice());
|
||||
if hash == *current_hash {
|
||||
return Ok(());
|
||||
} else if historical_hashes.contains(&hash.as_str()) {
|
||||
mismatched_settings = Some(true);
|
||||
} else {
|
||||
mismatched_settings = Some(false);
|
||||
}
|
||||
}
|
||||
println!(
|
||||
"\nx.py can automatically install the recommended `.vscode/settings.json` file for rustc development"
|
||||
);
|
||||
match mismatched_settings {
|
||||
Some(true) => eprintln!(
|
||||
"warning: existing `.vscode/settings.json` is out of date, x.py will update it"
|
||||
),
|
||||
Some(false) => eprintln!(
|
||||
"warning: existing `.vscode/settings.json` has been modified by user, x.py will back it up and replace it"
|
||||
),
|
||||
_ => (),
|
||||
}
|
||||
let should_create = match prompt_user(
|
||||
"Would you like to create/update `settings.json`, or only print suggested settings?: [y/p/N]",
|
||||
)? {
|
||||
Some(PromptResult::Yes) => true,
|
||||
Some(PromptResult::Print) => false,
|
||||
_ => {
|
||||
println!("Ok, skipping settings!");
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
if should_create {
|
||||
let path = config.src.join(".vscode");
|
||||
if !path.exists() {
|
||||
fs::create_dir(&path)?;
|
||||
}
|
||||
let verb = match mismatched_settings {
|
||||
// exists but outdated, we can replace this
|
||||
Some(true) => "Updated",
|
||||
// exists but user modified, back it up
|
||||
Some(false) => {
|
||||
// exists and is not current version or outdated, so back it up
|
||||
let mut backup = vscode_settings.clone();
|
||||
backup.set_extension("bak");
|
||||
eprintln!("warning: copying `settings.json` to `settings.json.bak`");
|
||||
fs::copy(&vscode_settings, &backup)?;
|
||||
"Updated"
|
||||
}
|
||||
_ => "Created",
|
||||
};
|
||||
fs::write(&vscode_settings, &VSCODE_SETTINGS)?;
|
||||
println!("{verb} `.vscode/settings.json`");
|
||||
} else {
|
||||
println!("Ok, skipping installation!");
|
||||
println!("\n{VSCODE_SETTINGS}");
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
14
src/bootstrap/setup/tests.rs
Normal file
14
src/bootstrap/setup/tests.rs
Normal file
@ -0,0 +1,14 @@
|
||||
use super::{SETTINGS_HASHES, VSCODE_SETTINGS};
|
||||
use sha2::Digest;
|
||||
|
||||
#[test]
|
||||
fn check_matching_settings_hash() {
|
||||
let mut hasher = sha2::Sha256::new();
|
||||
hasher.update(&VSCODE_SETTINGS);
|
||||
let hash = hex::encode(hasher.finalize().as_slice());
|
||||
assert_eq!(
|
||||
&hash,
|
||||
SETTINGS_HASHES.last().unwrap(),
|
||||
"Update `SETTINGS_HASHES` with the new hash of `src/etc/vscode_settings.json`"
|
||||
);
|
||||
}
|
26
src/etc/vscode_settings.json
Normal file
26
src/etc/vscode_settings.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"rust-analyzer.checkOnSave.overrideCommand": [
|
||||
"python3",
|
||||
"x.py",
|
||||
"check",
|
||||
"--json-output"
|
||||
],
|
||||
"rust-analyzer.linkedProjects": ["src/bootstrap/Cargo.toml", "Cargo.toml"],
|
||||
"rust-analyzer.rustfmt.overrideCommand": [
|
||||
"./build/host/rustfmt/bin/rustfmt",
|
||||
"--edition=2021"
|
||||
],
|
||||
"rust-analyzer.procMacro.server": "./build/host/stage0/libexec/rust-analyzer-proc-macro-srv",
|
||||
"rust-analyzer.procMacro.enable": true,
|
||||
"rust-analyzer.cargo.buildScripts.enable": true,
|
||||
"rust-analyzer.cargo.buildScripts.invocationLocation": "root",
|
||||
"rust-analyzer.cargo.buildScripts.invocationStrategy": "once",
|
||||
"rust-analyzer.cargo.buildScripts.overrideCommand": [
|
||||
"python3",
|
||||
"x.py",
|
||||
"check",
|
||||
"--json-output"
|
||||
],
|
||||
"rust-analyzer.cargo.sysroot": "./build/host/stage0-sysroot",
|
||||
"rust-analyzer.rustc.source": "./Cargo.toml"
|
||||
}
|
@ -289,7 +289,7 @@ pub(crate) fn print_where_clause<'a, 'tcx: 'a>(
|
||||
if f.alternate() {
|
||||
f.write_str(" ")?;
|
||||
} else {
|
||||
f.write_str("<br>")?;
|
||||
f.write_str("\n")?;
|
||||
}
|
||||
|
||||
match pred {
|
||||
@ -352,7 +352,7 @@ pub(crate) fn print_where_clause<'a, 'tcx: 'a>(
|
||||
}
|
||||
} else {
|
||||
let mut br_with_padding = String::with_capacity(6 * indent + 28);
|
||||
br_with_padding.push_str("<br>");
|
||||
br_with_padding.push_str("\n");
|
||||
|
||||
let padding_amout =
|
||||
if ending == Ending::Newline { indent + 4 } else { indent + "fn where ".len() };
|
||||
@ -360,16 +360,16 @@ pub(crate) fn print_where_clause<'a, 'tcx: 'a>(
|
||||
for _ in 0..padding_amout {
|
||||
br_with_padding.push_str(" ");
|
||||
}
|
||||
let where_preds = where_preds.to_string().replace("<br>", &br_with_padding);
|
||||
let where_preds = where_preds.to_string().replace("\n", &br_with_padding);
|
||||
|
||||
if ending == Ending::Newline {
|
||||
let mut clause = " ".repeat(indent.saturating_sub(1));
|
||||
write!(clause, "<span class=\"where fmt-newline\">where{where_preds},</span>")?;
|
||||
clause
|
||||
} else {
|
||||
// insert a <br> tag after a single space but before multiple spaces at the start
|
||||
// insert a newline after a single space but before multiple spaces at the start
|
||||
if indent == 0 {
|
||||
format!("<br><span class=\"where\">where{where_preds}</span>")
|
||||
format!("\n<span class=\"where\">where{where_preds}</span>")
|
||||
} else {
|
||||
// put the first one on the same line as the 'where' keyword
|
||||
let where_preds = where_preds.replacen(&br_with_padding, " ", 1);
|
||||
@ -1315,7 +1315,8 @@ impl clean::FnDecl {
|
||||
|
||||
/// * `header_len`: The length of the function header and name. In other words, the number of
|
||||
/// characters in the function declaration up to but not including the parentheses.
|
||||
/// <br>Used to determine line-wrapping.
|
||||
/// This is expected to go into a `<pre>`/`code-header` block, so indentation and newlines
|
||||
/// are preserved.
|
||||
/// * `indent`: The number of spaces to indent each successive line with, if line-wrapping is
|
||||
/// necessary.
|
||||
pub(crate) fn full_print<'a, 'tcx: 'a>(
|
||||
@ -1363,7 +1364,7 @@ impl clean::FnDecl {
|
||||
}
|
||||
} else {
|
||||
if i > 0 {
|
||||
args.push_str("<br>");
|
||||
args.push_str("\n");
|
||||
}
|
||||
if input.is_const {
|
||||
args.push_str("const ");
|
||||
@ -1389,7 +1390,7 @@ impl clean::FnDecl {
|
||||
let mut args = args.into_inner();
|
||||
|
||||
if self.c_variadic {
|
||||
args.push_str(",<br> ...");
|
||||
args.push_str(",\n ...");
|
||||
args_plain.push_str(", ...");
|
||||
}
|
||||
|
||||
@ -1399,24 +1400,20 @@ impl clean::FnDecl {
|
||||
|
||||
let declaration_len = header_len + args_plain.len() + arrow_plain.len();
|
||||
let output = if declaration_len > 80 {
|
||||
let full_pad = format!("<br>{}", " ".repeat(indent + 4));
|
||||
let close_pad = format!("<br>{}", " ".repeat(indent));
|
||||
let full_pad = format!("\n{}", " ".repeat(indent + 4));
|
||||
let close_pad = format!("\n{}", " ".repeat(indent));
|
||||
format!(
|
||||
"({pad}{args}{close}){arrow}",
|
||||
pad = if self.inputs.values.is_empty() { "" } else { &full_pad },
|
||||
args = args.replace("<br>", &full_pad),
|
||||
args = args.replace("\n", &full_pad),
|
||||
close = close_pad,
|
||||
arrow = arrow
|
||||
)
|
||||
} else {
|
||||
format!("({args}){arrow}", args = args.replace("<br>", " "), arrow = arrow)
|
||||
format!("({args}){arrow}", args = args.replace("\n", " "), arrow = arrow)
|
||||
};
|
||||
|
||||
if f.alternate() {
|
||||
write!(f, "{}", output.replace("<br>", "\n"))
|
||||
} else {
|
||||
write!(f, "{}", output)
|
||||
}
|
||||
write!(f, "{}", output)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 5b2eee7eed72b4894909c5eecbf014ea0b5ad995
|
||||
Subproject commit 9981e4d1ea6ac0992ff21be5514d4230dc77548b
|
@ -77,7 +77,7 @@ struct AsyncFdReadyGuard<'a, T> { x: &'a T }
|
||||
|
||||
impl Foo {
|
||||
// @has async_fn/struct.Foo.html
|
||||
// @has - '//*[@class="method"]' 'pub async fn complicated_lifetimes( &self, context: &impl Bar) -> impl Iterator<Item = &usize>'
|
||||
// @has - '//*[@class="method"]' 'pub async fn complicated_lifetimes( &self, context: &impl Bar ) -> impl Iterator<Item = &usize>'
|
||||
pub async fn complicated_lifetimes(&self, context: &impl Bar) -> impl Iterator<Item = &usize> {}
|
||||
// taken from `tokio` as an example of a method that was particularly bad before
|
||||
// @has - '//*[@class="method"]' "pub async fn readable<T>(&self) -> Result<AsyncFdReadyGuard<'_, T>, ()>"
|
||||
|
@ -31,7 +31,7 @@ impl Trait<{1 + 2}> for u8 {}
|
||||
impl<const N: usize> Trait<N> for [u8; N] {}
|
||||
|
||||
// @has foo/struct.Foo.html '//pre[@class="rust item-decl"]' \
|
||||
// 'pub struct Foo<const N: usize>where u8: Trait<N>'
|
||||
// 'pub struct Foo<const N: usize> where u8: Trait<N>'
|
||||
pub struct Foo<const N: usize> where u8: Trait<N>;
|
||||
// @has foo/struct.Bar.html '//pre[@class="rust item-decl"]' 'pub struct Bar<T, const N: usize>(_)'
|
||||
pub struct Bar<T, const N: usize>([T; N]);
|
||||
|
@ -1,9 +1,23 @@
|
||||
<code>pub trait Write {
|
||||
// Required methods
|
||||
fn <a href="#tymethod.poll_write" class="fn">poll_write</a>(<br />        self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,<br />        cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,<br />        buf: &mut [<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>]<br />    ) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>>;
|
||||
<span class="item-spacer" /> fn <a href="#tymethod.poll_flush" class="fn">poll_flush</a>(<br />        self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,<br />        cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>><br />    ) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.unit.html">()</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>>;
|
||||
<span class="item-spacer" /> fn <a href="#tymethod.poll_close" class="fn">poll_close</a>(<br />        self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,<br />        cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>><br />    ) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.unit.html">()</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>>;
|
||||
fn <a href="#tymethod.poll_write" class="fn">poll_write</a>(
|
||||
self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,
|
||||
cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,
|
||||
buf: &mut [<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>]
|
||||
) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>>;
|
||||
<span class="item-spacer" /> fn <a href="#tymethod.poll_flush" class="fn">poll_flush</a>(
|
||||
self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,
|
||||
cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>
|
||||
) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.unit.html">()</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>>;
|
||||
<span class="item-spacer" /> fn <a href="#tymethod.poll_close" class="fn">poll_close</a>(
|
||||
self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,
|
||||
cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>
|
||||
) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.unit.html">()</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>>;
|
||||
|
||||
// Provided method
|
||||
fn <a href="#method.poll_write_vectored" class="fn">poll_write_vectored</a>(<br />        self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,<br />        cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,<br />        bufs: &[<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>]<br />    ) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>> { ... }
|
||||
}</code>
|
||||
fn <a href="#method.poll_write_vectored" class="fn">poll_write_vectored</a>(
|
||||
self: <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,
|
||||
cx: &mut <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="struct" href="{{channel}}/alloc/string/struct.String.html" title="struct alloc::string::String">String</a>>,
|
||||
bufs: &[<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>]
|
||||
) -> <a class="enum" href="{{channel}}/core/option/enum.Option.html" title="enum core::option::Option">Option</a><<a class="enum" href="{{channel}}/core/result/enum.Result.html" title="enum core::result::Result">Result</a><<a class="primitive" href="{{channel}}/std/primitive.usize.html">usize</a>, <a class="struct" href="struct.Error.html" title="struct foo::Error">Error</a>>> { ... }
|
||||
}</code>
|
@ -2,7 +2,7 @@
|
||||
|
||||
// @has foo/trait.LendingIterator.html
|
||||
pub trait LendingIterator {
|
||||
// @has - '//*[@id="associatedtype.Item"]//h4[@class="code-header"]' "type Item<'a>where Self: 'a"
|
||||
// @has - '//*[@id="associatedtype.Item"]//h4[@class="code-header"]' "type Item<'a> where Self: 'a"
|
||||
type Item<'a> where Self: 'a;
|
||||
|
||||
// @has - '//*[@id="tymethod.next"]//h4[@class="code-header"]' \
|
||||
@ -23,7 +23,7 @@ impl LendingIterator for () {
|
||||
pub struct Infinite<T>(T);
|
||||
|
||||
// @has foo/trait.LendingIterator.html
|
||||
// @has - '//*[@id="associatedtype.Item-2"]//h4[@class="code-header"]' "type Item<'a>where Self: 'a = &'a T"
|
||||
// @has - '//*[@id="associatedtype.Item-2"]//h4[@class="code-header"]' "type Item<'a> where Self: 'a = &'a T"
|
||||
impl<T> LendingIterator for Infinite<T> {
|
||||
type Item<'a> where Self: 'a = &'a T;
|
||||
|
||||
|
@ -11,7 +11,7 @@ pub use impl_trait_aux::func;
|
||||
// @has impl_trait/fn.func2.html
|
||||
// @has - '//pre[@class="rust item-decl"]' "func2<T>("
|
||||
// @has - '//pre[@class="rust item-decl"]' "_x: impl Deref<Target = Option<T>> + Iterator<Item = T>,"
|
||||
// @has - '//pre[@class="rust item-decl"]' "_y: impl Iterator<Item = u8>)"
|
||||
// @has - '//pre[@class="rust item-decl"]' "_y: impl Iterator<Item = u8> )"
|
||||
// @!has - '//pre[@class="rust item-decl"]' 'where'
|
||||
pub use impl_trait_aux::func2;
|
||||
|
||||
|
@ -2,5 +2,5 @@
|
||||
|
||||
pub trait Bar {}
|
||||
|
||||
// @has foo/struct.Foo.html '//pre' 'pub struct Foo<T>(pub T)where T: Bar;'
|
||||
// @has foo/struct.Foo.html '//pre' 'pub struct Foo<T>(pub T) where T: Bar;'
|
||||
pub struct Foo<T>(pub T) where T: Bar;
|
||||
|
@ -98,7 +98,7 @@ pub mod outer {
|
||||
pub use reexports::foo;
|
||||
// @has 'foo/outer/inner/fn.foo_crate.html' '//pre[@class="rust item-decl"]' 'pub(crate) fn foo_crate()'
|
||||
pub(crate) use reexports::foo_crate;
|
||||
// @has 'foo/outer/inner/fn.foo_super.html' '//pre[@class="rust item-decl"]' 'pub(in outer) fn foo_super()'
|
||||
// @has 'foo/outer/inner/fn.foo_super.html' '//pre[@class="rust item-decl"]' 'pub(in outer) fn foo_super( )'
|
||||
pub(super) use::reexports::foo_super;
|
||||
// @!has 'foo/outer/inner/fn.foo_self.html'
|
||||
pub(self) use reexports::foo_self;
|
||||
|
@ -1 +1,3 @@
|
||||
<pre class="rust item-decl"><code>pub struct Simd<T>(_)<br /><span class="where">where<br />    T: <a class="trait" href="trait.MyTrait.html" title="trait foo::MyTrait">MyTrait</a></span>;</code></pre>
|
||||
<pre class="rust item-decl"><code>pub struct Simd<T>(_)
|
||||
<span class="where">where
|
||||
T: <a class="trait" href="trait.MyTrait.html" title="trait foo::MyTrait">MyTrait</a></span>;</code></pre>
|
@ -1,8 +1,13 @@
|
||||
<pre class="rust item-decl"><code>pub trait TraitWhere {
|
||||
type <a href="#associatedtype.Item" class="associatedtype">Item</a><'a><br />       <span class="where">where Self: 'a</span>;
|
||||
type <a href="#associatedtype.Item" class="associatedtype">Item</a><'a>
|
||||
<span class="where">where Self: 'a</span>;
|
||||
|
||||
// Provided methods
|
||||
fn <a href="#method.func" class="fn">func</a>(self)<br />       <span class="where">where Self: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a></span> { ... }
|
||||
<span class="item-spacer" /> fn <a href="#method.lines" class="fn">lines</a>(self) -> <a class="struct" href="{{channel}}/std/io/struct.Lines.html" title="struct std::io::Lines">Lines</a><Self><br />       <span class="where">where Self: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a></span> { ... }
|
||||
<span class="item-spacer" /> fn <a href="#method.merge" class="fn">merge</a><T>(self, a: T)<br />       <span class="where">where Self: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,<br />             T: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a></span> { ... }
|
||||
fn <a href="#method.func" class="fn">func</a>(self)
|
||||
<span class="where">where Self: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a></span> { ... }
|
||||
<span class="item-spacer" /> fn <a href="#method.lines" class="fn">lines</a>(self) -> <a class="struct" href="{{channel}}/std/io/struct.Lines.html" title="struct std::io::Lines">Lines</a><Self>
|
||||
<span class="where">where Self: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a></span> { ... }
|
||||
<span class="item-spacer" /> fn <a href="#method.merge" class="fn">merge</a><T>(self, a: T)
|
||||
<span class="where">where Self: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a>,
|
||||
T: <a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a></span> { ... }
|
||||
}</code></pre>
|
@ -4,7 +4,7 @@ use std::io::Lines;
|
||||
|
||||
pub trait MyTrait { fn dummy(&self) { } }
|
||||
|
||||
// @has foo/struct.Alpha.html '//pre' "pub struct Alpha<A>(_)where A: MyTrait"
|
||||
// @has foo/struct.Alpha.html '//pre' "pub struct Alpha<A>(_) where A: MyTrait"
|
||||
pub struct Alpha<A>(A) where A: MyTrait;
|
||||
// @has foo/trait.Bravo.html '//pre' "pub trait Bravo<B>where B: MyTrait"
|
||||
pub trait Bravo<B> where B: MyTrait { fn get(&self, B: B); }
|
||||
|
@ -1,4 +1,5 @@
|
||||
<pre class="rust item-decl"><code>pub enum Cow<'a, B><span class="where fmt-newline">where<br />    B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</span>{
|
||||
<pre class="rust item-decl"><code>pub enum Cow<'a, B><span class="where fmt-newline">where
|
||||
B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</span>{
|
||||
Borrowed(<a class="primitive" href="{{channel}}/std/primitive.reference.html">&'a B</a>),
|
||||
Whatever(<a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a>),
|
||||
}</code></pre>
|
@ -1,4 +1,5 @@
|
||||
<pre class="rust item-decl"><code>pub struct Struct<'a, B><span class="where fmt-newline">where<br />    B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</span>{
|
||||
<pre class="rust item-decl"><code>pub struct Struct<'a, B><span class="where fmt-newline">where
|
||||
B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</span>{
|
||||
pub a: <a class="primitive" href="{{channel}}/std/primitive.reference.html">&'a B</a>,
|
||||
pub b: <a class="primitive" href="{{channel}}/std/primitive.u32.html">u32</a>,
|
||||
}</code></pre>
|
@ -1,4 +1,5 @@
|
||||
<pre class="rust item-decl"><code>pub trait ToOwned<T><span class="where fmt-newline">where<br />    T: <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span>{
|
||||
<pre class="rust item-decl"><code>pub trait ToOwned<T><span class="where fmt-newline">where
|
||||
T: <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>,</span>{
|
||||
type <a href="#associatedtype.Owned" class="associatedtype">Owned</a>;
|
||||
|
||||
// Required methods
|
||||
|
@ -1,3 +1,4 @@
|
||||
<pre class="rust item-decl"><code>pub union Union<'a, B><span class="where fmt-newline">where<br />    B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</span>{
|
||||
<pre class="rust item-decl"><code>pub union Union<'a, B><span class="where fmt-newline">where
|
||||
B: <a class="trait" href="trait.ToOwned.html" title="trait foo::ToOwned">ToOwned</a><dyn <a class="trait" href="{{channel}}/core/clone/trait.Clone.html" title="trait core::clone::Clone">Clone</a>> + ?<a class="trait" href="{{channel}}/core/marker/trait.Sized.html" title="trait core::marker::Sized">Sized</a> + 'a,</span>{
|
||||
/* private fields */
|
||||
}</code></pre>
|
@ -1,8 +1,7 @@
|
||||
// compile-flags: -Ztreat-err-as-bug=1
|
||||
// failure-status: 101
|
||||
// rustc-env:RUST_BACKTRACE=1
|
||||
// normalize-stderr-test "\nerror: internal compiler error.*\n\n" -> ""
|
||||
// normalize-stderr-test "note:.*unexpectedly panicked.*\n\n" -> ""
|
||||
// normalize-stderr-test "\nerror: .*unexpectedly panicked.*\n\n" -> ""
|
||||
// normalize-stderr-test "note: we would appreciate a bug report.*\n\n" -> ""
|
||||
// normalize-stderr-test "note: compiler flags.*\n\n" -> ""
|
||||
// normalize-stderr-test "note: rustc.*running on.*\n\n" -> ""
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/const-eval-query-stack.rs:17:16
|
||||
--> $DIR/const-eval-query-stack.rs:16:16
|
||||
|
|
||||
LL | const X: i32 = 1 / 0;
|
||||
| ^^^^^ attempt to divide `1_i32` by zero
|
||||
|
@ -7,13 +7,13 @@ LL | #![feature(dyn_star)]
|
||||
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error[E0277]: `AlignedUsize` needs to be a pointer-sized type
|
||||
error[E0277]: `AlignedUsize` needs to have the same alignment and size as a pointer
|
||||
--> $DIR/align.rs:15:13
|
||||
|
|
||||
LL | let x = AlignedUsize(12) as dyn* Debug;
|
||||
| ^^^^^^^^^^^^^^^^ `AlignedUsize` needs to be a pointer-sized type
|
||||
| ^^^^^^^^^^^^^^^^ `AlignedUsize` needs to be a pointer-like type
|
||||
|
|
||||
= help: the trait `PointerSized` is not implemented for `AlignedUsize`
|
||||
= help: the trait `PointerLike` is not implemented for `AlignedUsize`
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
|
@ -13,5 +13,5 @@ struct AlignedUsize(usize);
|
||||
|
||||
fn main() {
|
||||
let x = AlignedUsize(12) as dyn* Debug;
|
||||
//[over_aligned]~^ ERROR `AlignedUsize` needs to be a pointer-sized type
|
||||
//[over_aligned]~^ ERROR `AlignedUsize` needs to have the same alignment and size as a pointer
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ fn dyn_debug(_: (dyn* Debug + '_)) {
|
||||
|
||||
fn polymorphic<T: Debug + ?Sized>(t: &T) {
|
||||
dyn_debug(t);
|
||||
//~^ ERROR `&T` needs to be a pointer-sized type
|
||||
//~^ ERROR `&T` needs to have the same alignment and size as a pointer
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,14 +1,14 @@
|
||||
error[E0277]: `&T` needs to be a pointer-sized type
|
||||
error[E0277]: `&T` needs to have the same alignment and size as a pointer
|
||||
--> $DIR/check-size-at-cast-polymorphic-bad.rs:11:15
|
||||
|
|
||||
LL | dyn_debug(t);
|
||||
| ^ `&T` needs to be a pointer-sized type
|
||||
| ^ `&T` needs to be a pointer-like type
|
||||
|
|
||||
= help: the trait `PointerSized` is not implemented for `&T`
|
||||
= help: the trait `PointerLike` is not implemented for `&T`
|
||||
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
||||
|
|
||||
LL | fn polymorphic<T: Debug + ?Sized>(t: &T) where &T: PointerSized {
|
||||
| ++++++++++++++++++++++
|
||||
LL | fn polymorphic<T: Debug + ?Sized>(t: &T) where &T: PointerLike {
|
||||
| +++++++++++++++++++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,6 +5,6 @@ use std::fmt::Debug;
|
||||
|
||||
fn main() {
|
||||
let i = [1, 2, 3, 4] as dyn* Debug;
|
||||
//~^ ERROR `[i32; 4]` needs to be a pointer-sized type
|
||||
//~^ ERROR `[i32; 4]` needs to have the same alignment and size as a pointer
|
||||
dbg!(i);
|
||||
}
|
||||
|
@ -1,10 +1,10 @@
|
||||
error[E0277]: `[i32; 4]` needs to be a pointer-sized type
|
||||
error[E0277]: `[i32; 4]` needs to have the same alignment and size as a pointer
|
||||
--> $DIR/check-size-at-cast.rs:7:13
|
||||
|
|
||||
LL | let i = [1, 2, 3, 4] as dyn* Debug;
|
||||
| ^^^^^^^^^^^^ `[i32; 4]` needs to be a pointer-sized type
|
||||
| ^^^^^^^^^^^^ `[i32; 4]` needs to be a pointer-like type
|
||||
|
|
||||
= help: the trait `PointerSized` is not implemented for `[i32; 4]`
|
||||
= help: the trait `PointerLike` is not implemented for `[i32; 4]`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,13 +7,13 @@ LL | #![feature(dyn_star, trait_upcasting)]
|
||||
= note: see issue #102425 <https://github.com/rust-lang/rust/issues/102425> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
error[E0277]: `dyn* Foo` needs to be a pointer-sized type
|
||||
error[E0277]: `dyn* Foo` needs to have the same alignment and size as a pointer
|
||||
--> $DIR/upcast.rs:30:23
|
||||
|
|
||||
LL | let w: dyn* Bar = w;
|
||||
| ^ `dyn* Foo` needs to be a pointer-sized type
|
||||
| ^ `dyn* Foo` needs to be a pointer-like type
|
||||
|
|
||||
= help: the trait `PointerSized` is not implemented for `dyn* Foo`
|
||||
= help: the trait `PointerLike` is not implemented for `dyn* Foo`
|
||||
|
||||
error: aborting due to previous error; 1 warning emitted
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
// known-bug: #106191
|
||||
// unset-rustc-env:RUST_BACKTRACE
|
||||
// had to be reverted
|
||||
// error-pattern:internal compiler error
|
||||
// error-pattern:unexpectedly panicked
|
||||
// failure-status:101
|
||||
// dont-check-compiler-stderr
|
||||
|
||||
|
@ -9,9 +9,7 @@ LL | type TransactionFuture<'__, O> = impl '__ + Future<Output = TransactionResu
|
||||
|
||||
stack backtrace:
|
||||
|
||||
error: internal compiler error: unexpected panic
|
||||
|
||||
|
||||
error: the compiler unexpectedly panicked. this is a bug.
|
||||
|
||||
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
error: internal compiler error: unexpected panic
|
||||
error: the compiler unexpectedly panicked. this is a bug.
|
||||
|
||||
query stack during panic:
|
||||
#0 [layout_of] computing layout of `Foo`
|
||||
|
@ -4,9 +4,7 @@ LL | fn main() { missing_ident; }
|
||||
|
||||
stack backtrace:
|
||||
|
||||
error: internal compiler error: unexpected panic
|
||||
|
||||
|
||||
error: the compiler unexpectedly panicked. this is a bug.
|
||||
|
||||
|
||||
|
||||
|
14
tests/ui/traits/new-solver/pointer-like.rs
Normal file
14
tests/ui/traits/new-solver/pointer-like.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// compile-flags: -Ztrait-solver=next
|
||||
|
||||
#![feature(pointer_like_trait)]
|
||||
|
||||
use std::marker::PointerLike;
|
||||
|
||||
fn require_(_: impl PointerLike) {}
|
||||
|
||||
fn main() {
|
||||
require_(1usize);
|
||||
require_(1u16);
|
||||
//~^ ERROR `u16` needs to have the same alignment and size as a pointer
|
||||
require_(&1i16);
|
||||
}
|
24
tests/ui/traits/new-solver/pointer-like.stderr
Normal file
24
tests/ui/traits/new-solver/pointer-like.stderr
Normal file
@ -0,0 +1,24 @@
|
||||
error[E0277]: `u16` needs to have the same alignment and size as a pointer
|
||||
--> $DIR/pointer-like.rs:11:14
|
||||
|
|
||||
LL | require_(1u16);
|
||||
| -------- ^^^^ the trait `PointerLike` is not implemented for `u16`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `u16: PointerLike` is not satisfied
|
||||
note: required by a bound in `require_`
|
||||
--> $DIR/pointer-like.rs:7:21
|
||||
|
|
||||
LL | fn require_(_: impl PointerLike) {}
|
||||
| ^^^^^^^^^^^ required by this bound in `require_`
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | require_(&1u16);
|
||||
| +
|
||||
LL | require_(&mut 1u16);
|
||||
| ++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
@ -1,12 +0,0 @@
|
||||
#![feature(pointer_sized_trait)]
|
||||
|
||||
use std::marker::PointerSized;
|
||||
|
||||
fn require_pointer_sized(_: impl PointerSized) {}
|
||||
|
||||
fn main() {
|
||||
require_pointer_sized(1usize);
|
||||
require_pointer_sized(1u16);
|
||||
//~^ ERROR `u16` needs to be a pointer-sized type
|
||||
require_pointer_sized(&1i16);
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
error[E0277]: `u16` needs to be a pointer-sized type
|
||||
--> $DIR/pointer-sized.rs:9:27
|
||||
|
|
||||
LL | require_pointer_sized(1u16);
|
||||
| --------------------- ^^^^ the trait `PointerSized` is not implemented for `u16`
|
||||
| |
|
||||
| required by a bound introduced by this call
|
||||
|
|
||||
= note: the trait bound `u16: PointerSized` is not satisfied
|
||||
note: required by a bound in `require_pointer_sized`
|
||||
--> $DIR/pointer-sized.rs:5:34
|
||||
|
|
||||
LL | fn require_pointer_sized(_: impl PointerSized) {}
|
||||
| ^^^^^^^^^^^^ required by this bound in `require_pointer_sized`
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | require_pointer_sized(&1u16);
|
||||
| +
|
||||
LL | require_pointer_sized(&mut 1u16);
|
||||
| ++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
@ -4,7 +4,7 @@ error: internal compiler error: delayed span bug triggered by #[rustc_error(dela
|
||||
LL | fn main() {}
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: internal compiler error: unexpected panic
|
||||
error: the compiler unexpectedly panicked. this is a bug.
|
||||
|
||||
query stack during panic:
|
||||
#0 [trigger_delay_span_bug] triggering a delay span bug
|
||||
|
@ -4,7 +4,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | pub static C: u32 = 0 - 1;
|
||||
| ^^^^^ attempt to compute `0_u32 - 1_u32`, which would overflow
|
||||
|
||||
error: internal compiler error: unexpected panic
|
||||
error: the compiler unexpectedly panicked. this is a bug.
|
||||
|
||||
query stack during panic:
|
||||
#0 [eval_to_allocation_raw] const-evaluating + checking `C`
|
||||
|
40
tests/ui/typeck/issue-107775.rs
Normal file
40
tests/ui/typeck/issue-107775.rs
Normal file
@ -0,0 +1,40 @@
|
||||
// edition: 2021
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::future::Future;
|
||||
use std::pin::Pin;
|
||||
|
||||
pub trait Trait {
|
||||
fn do_something<'async_trait>(byte: u8)
|
||||
->
|
||||
Pin<Box<dyn Future<Output = ()> +
|
||||
Send + 'async_trait>>;
|
||||
}
|
||||
|
||||
pub struct Struct;
|
||||
|
||||
impl Trait for Struct {
|
||||
fn do_something<'async_trait>(byte: u8)
|
||||
->
|
||||
Pin<Box<dyn Future<Output = ()> +
|
||||
Send + 'async_trait>> {
|
||||
Box::pin(
|
||||
|
||||
async move { let byte = byte; let _: () = {}; })
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Map {
|
||||
map: HashMap<u16, fn(u8) -> Pin<Box<dyn Future<Output = ()> + Send>>>,
|
||||
}
|
||||
|
||||
impl Map {
|
||||
pub fn new() -> Self {
|
||||
let mut map = HashMap::new();
|
||||
map.insert(1, Struct::do_something);
|
||||
Self { map }
|
||||
//~^ ERROR mismatched types
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
16
tests/ui/typeck/issue-107775.stderr
Normal file
16
tests/ui/typeck/issue-107775.stderr
Normal file
@ -0,0 +1,16 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/issue-107775.rs:35:16
|
||||
|
|
||||
LL | map.insert(1, Struct::do_something);
|
||||
| - -------------------- this is of type `fn(u8) -> Pin<Box<dyn Future<Output = ()> + Send>> {<Struct as Trait>::do_something::<'_>}`, which causes `map` to be inferred as `HashMap<{integer}, fn(u8) -> Pin<Box<dyn Future<Output = ()> + Send>> {<Struct as Trait>::do_something::<'_>}>`
|
||||
| |
|
||||
| this is of type `{integer}`, which causes `map` to be inferred as `HashMap<{integer}, fn(u8) -> Pin<Box<dyn Future<Output = ()> + Send>> {<Struct as Trait>::do_something::<'_>}>`
|
||||
LL | Self { map }
|
||||
| ^^^ expected `HashMap<u16, fn(u8) -> Pin<...>>`, found `HashMap<{integer}, ...>`
|
||||
|
|
||||
= note: expected struct `HashMap<u16, fn(_) -> Pin<Box<(dyn Future<Output = ()> + Send + 'static)>>>`
|
||||
found struct `HashMap<{integer}, fn(_) -> Pin<Box<dyn Future<Output = ()> + Send>> {<Struct as Trait>::do_something::<'_>}>`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
Loading…
x
Reference in New Issue
Block a user