Auto merge of #104607 - matthiaskrgr:rollup-9s589me, r=matthiaskrgr
Rollup of 10 pull requests Successful merges: - #103117 (Use `IsTerminal` in place of `atty`) - #103969 (Partial support for running UI tests with `download-rustc`) - #103989 (Fix build of std for thumbv7a-pc-windows-msvc) - #104076 (fix sysroot issue which appears for ci downloaded rustc) - #104469 (Make "long type" printing type aware and trim types in E0275) - #104497 (detect () to avoid redundant <> suggestion for type) - #104577 (Don't focus on notable trait parent when hiding it) - #104587 (Update cargo) - #104593 (Improve spans for RPITIT object-safety errors) - #104604 (Migrate top buttons style to CSS variables) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
2a434286a9
64 changed files with 488 additions and 226 deletions
21
Cargo.lock
21
Cargo.lock
|
@ -307,6 +307,7 @@ dependencies = [
|
||||||
"glob",
|
"glob",
|
||||||
"hex 0.4.2",
|
"hex 0.4.2",
|
||||||
"home",
|
"home",
|
||||||
|
"http-auth",
|
||||||
"humantime 2.0.1",
|
"humantime 2.0.1",
|
||||||
"ignore",
|
"ignore",
|
||||||
"im-rc",
|
"im-rc",
|
||||||
|
@ -349,11 +350,11 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cargo-credential"
|
name = "cargo-credential"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cargo-credential-1password"
|
name = "cargo-credential-1password"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cargo-credential",
|
"cargo-credential",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -362,7 +363,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cargo-credential-macos-keychain"
|
name = "cargo-credential-macos-keychain"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cargo-credential",
|
"cargo-credential",
|
||||||
"security-framework",
|
"security-framework",
|
||||||
|
@ -370,7 +371,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cargo-credential-wincred"
|
name = "cargo-credential-wincred"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cargo-credential",
|
"cargo-credential",
|
||||||
"winapi",
|
"winapi",
|
||||||
|
@ -1692,6 +1693,15 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "http-auth"
|
||||||
|
version = "0.1.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "c0b40b39d66c28829a0cf4d09f7e139ff8201f7500a5083732848ed3b4b4d850"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "humantime"
|
name = "humantime"
|
||||||
version = "1.3.0"
|
version = "1.3.0"
|
||||||
|
@ -3535,7 +3545,6 @@ name = "rustc_errors"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"annotate-snippets",
|
"annotate-snippets",
|
||||||
"atty",
|
|
||||||
"rustc_ast",
|
"rustc_ast",
|
||||||
"rustc_ast_pretty",
|
"rustc_ast_pretty",
|
||||||
"rustc_data_structures",
|
"rustc_data_structures",
|
||||||
|
@ -3834,7 +3843,6 @@ dependencies = [
|
||||||
name = "rustc_log"
|
name = "rustc_log"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atty",
|
|
||||||
"rustc_span",
|
"rustc_span",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
|
@ -4389,7 +4397,6 @@ version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
"askama",
|
"askama",
|
||||||
"atty",
|
|
||||||
"expect-test",
|
"expect-test",
|
||||||
"itertools",
|
"itertools",
|
||||||
"minifier",
|
"minifier",
|
||||||
|
|
|
@ -62,7 +62,7 @@ impl<'mir, 'tcx> ConstCx<'mir, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_async(&self) -> bool {
|
fn is_async(&self) -> bool {
|
||||||
self.tcx.asyncness(self.def_id()) == hir::IsAsync::Async
|
self.tcx.asyncness(self.def_id()).is_async()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
//! This API is completely unstable and subject to change.
|
//! This API is completely unstable and subject to change.
|
||||||
|
|
||||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||||
|
#![feature(is_terminal)]
|
||||||
#![feature(once_cell)]
|
#![feature(once_cell)]
|
||||||
#![feature(decl_macro)]
|
#![feature(decl_macro)]
|
||||||
#![recursion_limit = "256"]
|
#![recursion_limit = "256"]
|
||||||
|
@ -27,7 +28,6 @@ use rustc_feature::find_gated_cfg;
|
||||||
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
|
use rustc_interface::util::{self, collect_crate_types, get_codegen_backend};
|
||||||
use rustc_interface::{interface, Queries};
|
use rustc_interface::{interface, Queries};
|
||||||
use rustc_lint::LintStore;
|
use rustc_lint::LintStore;
|
||||||
use rustc_log::stdout_isatty;
|
|
||||||
use rustc_metadata::locator;
|
use rustc_metadata::locator;
|
||||||
use rustc_save_analysis as save;
|
use rustc_save_analysis as save;
|
||||||
use rustc_save_analysis::DumpHandler;
|
use rustc_save_analysis::DumpHandler;
|
||||||
|
@ -48,7 +48,7 @@ use std::default::Default;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::ffi::OsString;
|
use std::ffi::OsString;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::{self, Read, Write};
|
use std::io::{self, IsTerminal, Read, Write};
|
||||||
use std::panic::{self, catch_unwind};
|
use std::panic::{self, catch_unwind};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::process::{self, Command, Stdio};
|
use std::process::{self, Command, Stdio};
|
||||||
|
@ -515,7 +515,7 @@ fn handle_explain(registry: Registry, code: &str, output: ErrorOutputType) {
|
||||||
}
|
}
|
||||||
text.push('\n');
|
text.push('\n');
|
||||||
}
|
}
|
||||||
if stdout_isatty() {
|
if io::stdout().is_terminal() {
|
||||||
show_content_with_pager(&text);
|
show_content_with_pager(&text);
|
||||||
} else {
|
} else {
|
||||||
print!("{}", text);
|
print!("{}", text);
|
||||||
|
|
|
@ -18,7 +18,6 @@ rustc_target = { path = "../rustc_target" }
|
||||||
rustc_hir = { path = "../rustc_hir" }
|
rustc_hir = { path = "../rustc_hir" }
|
||||||
rustc_lint_defs = { path = "../rustc_lint_defs" }
|
rustc_lint_defs = { path = "../rustc_lint_defs" }
|
||||||
unicode-width = "0.1.4"
|
unicode-width = "0.1.4"
|
||||||
atty = "0.2"
|
|
||||||
termcolor = "1.0"
|
termcolor = "1.0"
|
||||||
annotate-snippets = "0.9"
|
annotate-snippets = "0.9"
|
||||||
termize = "0.1.1"
|
termize = "0.1.1"
|
||||||
|
|
|
@ -28,8 +28,8 @@ use rustc_error_messages::FluentArgs;
|
||||||
use rustc_span::hygiene::{ExpnKind, MacroKind};
|
use rustc_span::hygiene::{ExpnKind, MacroKind};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::cmp::{max, min, Reverse};
|
use std::cmp::{max, min, Reverse};
|
||||||
use std::io;
|
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
|
use std::io::{self, IsTerminal};
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use termcolor::{Ansi, BufferWriter, ColorChoice, ColorSpec, StandardStream};
|
use termcolor::{Ansi, BufferWriter, ColorChoice, ColorSpec, StandardStream};
|
||||||
|
@ -619,14 +619,14 @@ impl ColorConfig {
|
||||||
fn to_color_choice(self) -> ColorChoice {
|
fn to_color_choice(self) -> ColorChoice {
|
||||||
match self {
|
match self {
|
||||||
ColorConfig::Always => {
|
ColorConfig::Always => {
|
||||||
if atty::is(atty::Stream::Stderr) {
|
if io::stderr().is_terminal() {
|
||||||
ColorChoice::Always
|
ColorChoice::Always
|
||||||
} else {
|
} else {
|
||||||
ColorChoice::AlwaysAnsi
|
ColorChoice::AlwaysAnsi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ColorConfig::Never => ColorChoice::Never,
|
ColorConfig::Never => ColorChoice::Never,
|
||||||
ColorConfig::Auto if atty::is(atty::Stream::Stderr) => ColorChoice::Auto,
|
ColorConfig::Auto if io::stderr().is_terminal() => ColorChoice::Auto,
|
||||||
ColorConfig::Auto => ColorChoice::Never,
|
ColorConfig::Auto => ColorChoice::Never,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||||
#![feature(drain_filter)]
|
#![feature(drain_filter)]
|
||||||
#![feature(if_let_guard)]
|
#![feature(if_let_guard)]
|
||||||
|
#![feature(is_terminal)]
|
||||||
#![feature(adt_const_params)]
|
#![feature(adt_const_params)]
|
||||||
#![feature(let_chains)]
|
#![feature(let_chains)]
|
||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
|
|
|
@ -2720,6 +2720,12 @@ pub enum IsAsync {
|
||||||
NotAsync,
|
NotAsync,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl IsAsync {
|
||||||
|
pub fn is_async(self) -> bool {
|
||||||
|
self == IsAsync::Async
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Encodable, Decodable, HashStable_Generic)]
|
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Encodable, Decodable, HashStable_Generic)]
|
||||||
pub enum Defaultness {
|
pub enum Defaultness {
|
||||||
Default { has_value: bool },
|
Default { has_value: bool },
|
||||||
|
|
|
@ -684,9 +684,7 @@ fn report_trait_method_mismatch<'tcx>(
|
||||||
// Suggestion to change output type. We do not suggest in `async` functions
|
// Suggestion to change output type. We do not suggest in `async` functions
|
||||||
// to avoid complex logic or incorrect output.
|
// to avoid complex logic or incorrect output.
|
||||||
match tcx.hir().expect_impl_item(impl_m.def_id.expect_local()).kind {
|
match tcx.hir().expect_impl_item(impl_m.def_id.expect_local()).kind {
|
||||||
ImplItemKind::Fn(ref sig, _)
|
ImplItemKind::Fn(ref sig, _) if !sig.header.asyncness.is_async() => {
|
||||||
if sig.header.asyncness == hir::IsAsync::NotAsync =>
|
|
||||||
{
|
|
||||||
let msg = "change the output type to match the trait";
|
let msg = "change the output type to match the trait";
|
||||||
let ap = Applicability::MachineApplicable;
|
let ap = Applicability::MachineApplicable;
|
||||||
match sig.decl.output {
|
match sig.decl.output {
|
||||||
|
|
|
@ -1918,12 +1918,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
| ty::Str
|
| ty::Str
|
||||||
| ty::Projection(_)
|
| ty::Projection(_)
|
||||||
| ty::Param(_) => format!("{deref_ty}"),
|
| ty::Param(_) => format!("{deref_ty}"),
|
||||||
// we need to test something like <&[_]>::len
|
// we need to test something like <&[_]>::len or <(&[u32])>::len
|
||||||
// and Vec::function();
|
// and Vec::function();
|
||||||
// <&[_]>::len doesn't need an extra "<>" between
|
// <&[_]>::len or <&[u32]>::len doesn't need an extra "<>" between
|
||||||
// but for Adt type like Vec::function()
|
// but for Adt type like Vec::function()
|
||||||
// we would suggest <[_]>::function();
|
// we would suggest <[_]>::function();
|
||||||
_ if self.tcx.sess.source_map().span_wrapped_by_angle_bracket(ty.span) => format!("{deref_ty}"),
|
_ if self.tcx.sess.source_map().span_wrapped_by_angle_or_parentheses(ty.span) => format!("{deref_ty}"),
|
||||||
_ => format!("<{deref_ty}>"),
|
_ => format!("<{deref_ty}>"),
|
||||||
};
|
};
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
|
|
|
@ -4,7 +4,6 @@ version = "0.0.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
atty = "0.2"
|
|
||||||
tracing = "0.1.28"
|
tracing = "0.1.28"
|
||||||
tracing-subscriber = { version = "0.3.3", default-features = false, features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] }
|
tracing-subscriber = { version = "0.3.3", default-features = false, features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] }
|
||||||
tracing-tree = "0.2.0"
|
tracing-tree = "0.2.0"
|
||||||
|
|
|
@ -40,10 +40,11 @@
|
||||||
|
|
||||||
#![deny(rustc::untranslatable_diagnostic)]
|
#![deny(rustc::untranslatable_diagnostic)]
|
||||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||||
|
#![feature(is_terminal)]
|
||||||
|
|
||||||
use std::env::{self, VarError};
|
use std::env::{self, VarError};
|
||||||
use std::fmt::{self, Display};
|
use std::fmt::{self, Display};
|
||||||
use std::io;
|
use std::io::{self, IsTerminal};
|
||||||
use tracing_subscriber::filter::{Directive, EnvFilter, LevelFilter};
|
use tracing_subscriber::filter::{Directive, EnvFilter, LevelFilter};
|
||||||
use tracing_subscriber::layer::SubscriberExt;
|
use tracing_subscriber::layer::SubscriberExt;
|
||||||
|
|
||||||
|
@ -93,11 +94,11 @@ pub fn init_env_logger(env: &str) -> Result<(), Error> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn stdout_isatty() -> bool {
|
pub fn stdout_isatty() -> bool {
|
||||||
atty::is(atty::Stream::Stdout)
|
io::stdout().is_terminal()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn stderr_isatty() -> bool {
|
pub fn stderr_isatty() -> bool {
|
||||||
atty::is(atty::Stream::Stderr)
|
io::stderr().is_terminal()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
|
@ -924,10 +924,13 @@ impl ObjectSafetyViolation {
|
||||||
}
|
}
|
||||||
ObjectSafetyViolation::Method(
|
ObjectSafetyViolation::Method(
|
||||||
name,
|
name,
|
||||||
MethodViolationCode::ReferencesImplTraitInTrait,
|
MethodViolationCode::ReferencesImplTraitInTrait(_),
|
||||||
_,
|
_,
|
||||||
) => format!("method `{}` references an `impl Trait` type in its return type", name)
|
) => format!("method `{}` references an `impl Trait` type in its return type", name)
|
||||||
.into(),
|
.into(),
|
||||||
|
ObjectSafetyViolation::Method(name, MethodViolationCode::AsyncFn, _) => {
|
||||||
|
format!("method `{}` is `async`", name).into()
|
||||||
|
}
|
||||||
ObjectSafetyViolation::Method(
|
ObjectSafetyViolation::Method(
|
||||||
name,
|
name,
|
||||||
MethodViolationCode::WhereClauseReferencesSelf,
|
MethodViolationCode::WhereClauseReferencesSelf,
|
||||||
|
@ -1035,7 +1038,10 @@ pub enum MethodViolationCode {
|
||||||
ReferencesSelfOutput,
|
ReferencesSelfOutput,
|
||||||
|
|
||||||
/// e.g., `fn foo(&self) -> impl Sized`
|
/// e.g., `fn foo(&self) -> impl Sized`
|
||||||
ReferencesImplTraitInTrait,
|
ReferencesImplTraitInTrait(Span),
|
||||||
|
|
||||||
|
/// e.g., `async fn foo(&self)`
|
||||||
|
AsyncFn,
|
||||||
|
|
||||||
/// e.g., `fn foo(&self) where Self: Clone`
|
/// e.g., `fn foo(&self) where Self: Clone`
|
||||||
WhereClauseReferencesSelf,
|
WhereClauseReferencesSelf,
|
||||||
|
|
|
@ -12,7 +12,12 @@ use rustc_span::{BytePos, Span};
|
||||||
use rustc_target::spec::abi;
|
use rustc_target::spec::abi;
|
||||||
|
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
use std::collections::hash_map::DefaultHasher;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
use std::hash::{Hash, Hasher};
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use super::print::PrettyPrinter;
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, TypeFoldable, TypeVisitable, Lift)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, TypeFoldable, TypeVisitable, Lift)]
|
||||||
pub struct ExpectedFound<T> {
|
pub struct ExpectedFound<T> {
|
||||||
|
@ -985,6 +990,38 @@ fn foo(&self) -> Self::T { String::new() }
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn short_ty_string(self, ty: Ty<'tcx>) -> (String, Option<PathBuf>) {
|
||||||
|
let length_limit = 50;
|
||||||
|
let type_limit = 4;
|
||||||
|
let regular = FmtPrinter::new(self, hir::def::Namespace::TypeNS)
|
||||||
|
.pretty_print_type(ty)
|
||||||
|
.expect("could not write to `String`")
|
||||||
|
.into_buffer();
|
||||||
|
if regular.len() <= length_limit {
|
||||||
|
return (regular, None);
|
||||||
|
}
|
||||||
|
let short = FmtPrinter::new_with_limit(
|
||||||
|
self,
|
||||||
|
hir::def::Namespace::TypeNS,
|
||||||
|
rustc_session::Limit(type_limit),
|
||||||
|
)
|
||||||
|
.pretty_print_type(ty)
|
||||||
|
.expect("could not write to `String`")
|
||||||
|
.into_buffer();
|
||||||
|
if regular == short {
|
||||||
|
return (regular, None);
|
||||||
|
}
|
||||||
|
// Multiple types might be shortened in a single error, ensure we create a file for each.
|
||||||
|
let mut s = DefaultHasher::new();
|
||||||
|
ty.hash(&mut s);
|
||||||
|
let hash = s.finish();
|
||||||
|
let path = self.output_filenames(()).temp_path_ext(&format!("long-type-{hash}.txt"), None);
|
||||||
|
match std::fs::write(&path, ®ular) {
|
||||||
|
Ok(_) => (short, Some(path)),
|
||||||
|
Err(_) => (regular, None),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn format_generic_args(self, args: &[ty::GenericArg<'tcx>]) -> String {
|
fn format_generic_args(self, args: &[ty::GenericArg<'tcx>]) -> String {
|
||||||
FmtPrinter::new(self, hir::def::Namespace::TypeNS)
|
FmtPrinter::new(self, hir::def::Namespace::TypeNS)
|
||||||
.path_generic_args(Ok, args)
|
.path_generic_args(Ok, args)
|
||||||
|
|
|
@ -276,28 +276,45 @@ impl<'tcx> InstanceDef<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fmt_instance(
|
||||||
|
f: &mut fmt::Formatter<'_>,
|
||||||
|
instance: &Instance<'_>,
|
||||||
|
type_length: rustc_session::Limit,
|
||||||
|
) -> fmt::Result {
|
||||||
|
ty::tls::with(|tcx| {
|
||||||
|
let substs = tcx.lift(instance.substs).expect("could not lift for printing");
|
||||||
|
|
||||||
|
let s = FmtPrinter::new_with_limit(tcx, Namespace::ValueNS, type_length)
|
||||||
|
.print_def_path(instance.def_id(), substs)?
|
||||||
|
.into_buffer();
|
||||||
|
f.write_str(&s)
|
||||||
|
})?;
|
||||||
|
|
||||||
|
match instance.def {
|
||||||
|
InstanceDef::Item(_) => Ok(()),
|
||||||
|
InstanceDef::VTableShim(_) => write!(f, " - shim(vtable)"),
|
||||||
|
InstanceDef::ReifyShim(_) => write!(f, " - shim(reify)"),
|
||||||
|
InstanceDef::Intrinsic(_) => write!(f, " - intrinsic"),
|
||||||
|
InstanceDef::Virtual(_, num) => write!(f, " - virtual#{}", num),
|
||||||
|
InstanceDef::FnPtrShim(_, ty) => write!(f, " - shim({})", ty),
|
||||||
|
InstanceDef::ClosureOnceShim { .. } => write!(f, " - shim"),
|
||||||
|
InstanceDef::DropGlue(_, None) => write!(f, " - shim(None)"),
|
||||||
|
InstanceDef::DropGlue(_, Some(ty)) => write!(f, " - shim(Some({}))", ty),
|
||||||
|
InstanceDef::CloneShim(_, ty) => write!(f, " - shim({})", ty),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ShortInstance<'a, 'tcx>(pub &'a Instance<'tcx>, pub usize);
|
||||||
|
|
||||||
|
impl<'a, 'tcx> fmt::Display for ShortInstance<'a, 'tcx> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
fmt_instance(f, self.0, rustc_session::Limit(self.1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'tcx> fmt::Display for Instance<'tcx> {
|
impl<'tcx> fmt::Display for Instance<'tcx> {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
ty::tls::with(|tcx| {
|
ty::tls::with(|tcx| fmt_instance(f, self, tcx.type_length_limit()))
|
||||||
let substs = tcx.lift(self.substs).expect("could not lift for printing");
|
|
||||||
let s = FmtPrinter::new(tcx, Namespace::ValueNS)
|
|
||||||
.print_def_path(self.def_id(), substs)?
|
|
||||||
.into_buffer();
|
|
||||||
f.write_str(&s)
|
|
||||||
})?;
|
|
||||||
|
|
||||||
match self.def {
|
|
||||||
InstanceDef::Item(_) => Ok(()),
|
|
||||||
InstanceDef::VTableShim(_) => write!(f, " - shim(vtable)"),
|
|
||||||
InstanceDef::ReifyShim(_) => write!(f, " - shim(reify)"),
|
|
||||||
InstanceDef::Intrinsic(_) => write!(f, " - intrinsic"),
|
|
||||||
InstanceDef::Virtual(_, num) => write!(f, " - virtual#{}", num),
|
|
||||||
InstanceDef::FnPtrShim(_, ty) => write!(f, " - shim({})", ty),
|
|
||||||
InstanceDef::ClosureOnceShim { .. } => write!(f, " - shim"),
|
|
||||||
InstanceDef::DropGlue(_, None) => write!(f, " - shim(None)"),
|
|
||||||
InstanceDef::DropGlue(_, Some(ty)) => write!(f, " - shim(Some({}))", ty),
|
|
||||||
InstanceDef::CloneShim(_, ty) => write!(f, " - shim({})", ty),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ pub use self::context::{
|
||||||
GeneratorInteriorTypeCause, GlobalCtxt, Lift, OnDiskCache, TyCtxt, TypeckResults, UserType,
|
GeneratorInteriorTypeCause, GlobalCtxt, Lift, OnDiskCache, TyCtxt, TypeckResults, UserType,
|
||||||
UserTypeAnnotationIndex,
|
UserTypeAnnotationIndex,
|
||||||
};
|
};
|
||||||
pub use self::instance::{Instance, InstanceDef};
|
pub use self::instance::{Instance, InstanceDef, ShortInstance};
|
||||||
pub use self::list::List;
|
pub use self::list::List;
|
||||||
pub use self::parameterized::ParameterizedOverTcx;
|
pub use self::parameterized::ParameterizedOverTcx;
|
||||||
pub use self::rvalue_scopes::RvalueScopes;
|
pub use self::rvalue_scopes::RvalueScopes;
|
||||||
|
|
|
@ -13,6 +13,7 @@ use rustc_hir::def_id::{DefId, DefIdSet, CRATE_DEF_ID, LOCAL_CRATE};
|
||||||
use rustc_hir::definitions::{DefPathData, DefPathDataName, DisambiguatedDefPathData};
|
use rustc_hir::definitions::{DefPathData, DefPathDataName, DisambiguatedDefPathData};
|
||||||
use rustc_session::config::TrimmedDefPaths;
|
use rustc_session::config::TrimmedDefPaths;
|
||||||
use rustc_session::cstore::{ExternCrate, ExternCrateSource};
|
use rustc_session::cstore::{ExternCrate, ExternCrateSource};
|
||||||
|
use rustc_session::Limit;
|
||||||
use rustc_span::symbol::{kw, Ident, Symbol};
|
use rustc_span::symbol::{kw, Ident, Symbol};
|
||||||
use rustc_target::abi::Size;
|
use rustc_target::abi::Size;
|
||||||
use rustc_target::spec::abi::Abi;
|
use rustc_target::spec::abi::Abi;
|
||||||
|
@ -1583,6 +1584,8 @@ pub struct FmtPrinterData<'a, 'tcx> {
|
||||||
region_index: usize,
|
region_index: usize,
|
||||||
binder_depth: usize,
|
binder_depth: usize,
|
||||||
printed_type_count: usize,
|
printed_type_count: usize,
|
||||||
|
type_length_limit: Limit,
|
||||||
|
truncated: bool,
|
||||||
|
|
||||||
pub region_highlight_mode: RegionHighlightMode<'tcx>,
|
pub region_highlight_mode: RegionHighlightMode<'tcx>,
|
||||||
|
|
||||||
|
@ -1605,6 +1608,10 @@ impl DerefMut for FmtPrinter<'_, '_> {
|
||||||
|
|
||||||
impl<'a, 'tcx> FmtPrinter<'a, 'tcx> {
|
impl<'a, 'tcx> FmtPrinter<'a, 'tcx> {
|
||||||
pub fn new(tcx: TyCtxt<'tcx>, ns: Namespace) -> Self {
|
pub fn new(tcx: TyCtxt<'tcx>, ns: Namespace) -> Self {
|
||||||
|
Self::new_with_limit(tcx, ns, tcx.type_length_limit())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_with_limit(tcx: TyCtxt<'tcx>, ns: Namespace, type_length_limit: Limit) -> Self {
|
||||||
FmtPrinter(Box::new(FmtPrinterData {
|
FmtPrinter(Box::new(FmtPrinterData {
|
||||||
tcx,
|
tcx,
|
||||||
// Estimated reasonable capacity to allocate upfront based on a few
|
// Estimated reasonable capacity to allocate upfront based on a few
|
||||||
|
@ -1617,6 +1624,8 @@ impl<'a, 'tcx> FmtPrinter<'a, 'tcx> {
|
||||||
region_index: 0,
|
region_index: 0,
|
||||||
binder_depth: 0,
|
binder_depth: 0,
|
||||||
printed_type_count: 0,
|
printed_type_count: 0,
|
||||||
|
type_length_limit,
|
||||||
|
truncated: false,
|
||||||
region_highlight_mode: RegionHighlightMode::new(tcx),
|
region_highlight_mode: RegionHighlightMode::new(tcx),
|
||||||
ty_infer_name_resolver: None,
|
ty_infer_name_resolver: None,
|
||||||
const_infer_name_resolver: None,
|
const_infer_name_resolver: None,
|
||||||
|
@ -1751,11 +1760,11 @@ impl<'tcx> Printer<'tcx> for FmtPrinter<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
|
fn print_type(mut self, ty: Ty<'tcx>) -> Result<Self::Type, Self::Error> {
|
||||||
let type_length_limit = self.tcx.type_length_limit();
|
if self.type_length_limit.value_within_limit(self.printed_type_count) {
|
||||||
if type_length_limit.value_within_limit(self.printed_type_count) {
|
|
||||||
self.printed_type_count += 1;
|
self.printed_type_count += 1;
|
||||||
self.pretty_print_type(ty)
|
self.pretty_print_type(ty)
|
||||||
} else {
|
} else {
|
||||||
|
self.truncated = true;
|
||||||
write!(self, "...")?;
|
write!(self, "...")?;
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,7 +197,6 @@ use rustc_session::lint::builtin::LARGE_ASSIGNMENTS;
|
||||||
use rustc_session::Limit;
|
use rustc_session::Limit;
|
||||||
use rustc_span::source_map::{dummy_spanned, respan, Span, Spanned, DUMMY_SP};
|
use rustc_span::source_map::{dummy_spanned, respan, Span, Spanned, DUMMY_SP};
|
||||||
use rustc_target::abi::Size;
|
use rustc_target::abi::Size;
|
||||||
use std::iter;
|
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
@ -541,29 +540,23 @@ fn collect_items_rec<'tcx>(
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Format instance name that is already known to be too long for rustc.
|
/// Format instance name that is already known to be too long for rustc.
|
||||||
/// Show only the first and last 32 characters to avoid blasting
|
/// Show only the first 2 types if it is longer than 32 characters to avoid blasting
|
||||||
/// the user's terminal with thousands of lines of type-name.
|
/// the user's terminal with thousands of lines of type-name.
|
||||||
///
|
///
|
||||||
/// If the type name is longer than before+after, it will be written to a file.
|
/// If the type name is longer than before+after, it will be written to a file.
|
||||||
fn shrunk_instance_name<'tcx>(
|
fn shrunk_instance_name<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
instance: &Instance<'tcx>,
|
instance: &Instance<'tcx>,
|
||||||
before: usize,
|
|
||||||
after: usize,
|
|
||||||
) -> (String, Option<PathBuf>) {
|
) -> (String, Option<PathBuf>) {
|
||||||
let s = instance.to_string();
|
let s = instance.to_string();
|
||||||
|
|
||||||
// Only use the shrunk version if it's really shorter.
|
// Only use the shrunk version if it's really shorter.
|
||||||
// This also avoids the case where before and after slices overlap.
|
// This also avoids the case where before and after slices overlap.
|
||||||
if s.chars().nth(before + after + 1).is_some() {
|
if s.chars().nth(33).is_some() {
|
||||||
// An iterator of all byte positions including the end of the string.
|
let shrunk = format!("{}", ty::ShortInstance(instance, 4));
|
||||||
let positions = || s.char_indices().map(|(i, _)| i).chain(iter::once(s.len()));
|
if shrunk == s {
|
||||||
|
return (s, None);
|
||||||
let shrunk = format!(
|
}
|
||||||
"{before}...{after}",
|
|
||||||
before = &s[..positions().nth(before).unwrap_or(s.len())],
|
|
||||||
after = &s[positions().rev().nth(after).unwrap_or(0)..],
|
|
||||||
);
|
|
||||||
|
|
||||||
let path = tcx.output_filenames(()).temp_path_ext("long-type.txt", None);
|
let path = tcx.output_filenames(()).temp_path_ext("long-type.txt", None);
|
||||||
let written_to_path = std::fs::write(&path, s).ok().map(|_| path);
|
let written_to_path = std::fs::write(&path, s).ok().map(|_| path);
|
||||||
|
@ -599,7 +592,7 @@ fn check_recursion_limit<'tcx>(
|
||||||
if !recursion_limit.value_within_limit(adjusted_recursion_depth) {
|
if !recursion_limit.value_within_limit(adjusted_recursion_depth) {
|
||||||
let def_span = tcx.def_span(def_id);
|
let def_span = tcx.def_span(def_id);
|
||||||
let def_path_str = tcx.def_path_str(def_id);
|
let def_path_str = tcx.def_path_str(def_id);
|
||||||
let (shrunk, written_to_path) = shrunk_instance_name(tcx, &instance, 32, 32);
|
let (shrunk, written_to_path) = shrunk_instance_name(tcx, &instance);
|
||||||
let mut path = PathBuf::new();
|
let mut path = PathBuf::new();
|
||||||
let was_written = if written_to_path.is_some() {
|
let was_written = if written_to_path.is_some() {
|
||||||
path = written_to_path.unwrap();
|
path = written_to_path.unwrap();
|
||||||
|
@ -641,7 +634,7 @@ fn check_type_length_limit<'tcx>(tcx: TyCtxt<'tcx>, instance: Instance<'tcx>) {
|
||||||
//
|
//
|
||||||
// Bail out in these cases to avoid that bad user experience.
|
// Bail out in these cases to avoid that bad user experience.
|
||||||
if !tcx.type_length_limit().value_within_limit(type_length) {
|
if !tcx.type_length_limit().value_within_limit(type_length) {
|
||||||
let (shrunk, written_to_path) = shrunk_instance_name(tcx, &instance, 32, 32);
|
let (shrunk, written_to_path) = shrunk_instance_name(tcx, &instance);
|
||||||
let span = tcx.def_span(instance.def_id());
|
let span = tcx.def_span(instance.def_id());
|
||||||
let mut path = PathBuf::new();
|
let mut path = PathBuf::new();
|
||||||
let was_written = if written_to_path.is_some() {
|
let was_written = if written_to_path.is_some() {
|
||||||
|
|
|
@ -753,10 +753,11 @@ impl SourceMap {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a 'Span', tries to tell if the next character is '>'
|
/// Given a 'Span', tries to tell if it's wrapped by "<>" or "()"
|
||||||
/// and the previous charactoer is '<' after skipping white space
|
/// the algorithm searches if the next character is '>' or ')' after skipping white space
|
||||||
/// return true if wrapped by '<>'
|
/// then searches the previous charactoer to match '<' or '(' after skipping white space
|
||||||
pub fn span_wrapped_by_angle_bracket(&self, span: Span) -> bool {
|
/// return true if wrapped by '<>' or '()'
|
||||||
|
pub fn span_wrapped_by_angle_or_parentheses(&self, span: Span) -> bool {
|
||||||
self.span_to_source(span, |src, start_index, end_index| {
|
self.span_to_source(span, |src, start_index, end_index| {
|
||||||
if src.get(start_index..end_index).is_none() {
|
if src.get(start_index..end_index).is_none() {
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
|
@ -764,11 +765,17 @@ impl SourceMap {
|
||||||
// test the right side to match '>' after skipping white space
|
// test the right side to match '>' after skipping white space
|
||||||
let end_src = &src[end_index..];
|
let end_src = &src[end_index..];
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
|
let mut found_right_parentheses = false;
|
||||||
|
let mut found_right_angle = false;
|
||||||
while let Some(cc) = end_src.chars().nth(i) {
|
while let Some(cc) = end_src.chars().nth(i) {
|
||||||
if cc == ' ' {
|
if cc == ' ' {
|
||||||
i = i + 1;
|
i = i + 1;
|
||||||
} else if cc == '>' {
|
} else if cc == '>' {
|
||||||
// found > in the right;
|
// found > in the right;
|
||||||
|
found_right_angle = true;
|
||||||
|
break;
|
||||||
|
} else if cc == ')' {
|
||||||
|
found_right_parentheses = true;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// failed to find '>' return false immediately
|
// failed to find '>' return false immediately
|
||||||
|
@ -786,6 +793,16 @@ impl SourceMap {
|
||||||
i = i - 1;
|
i = i - 1;
|
||||||
} else if cc == '<' {
|
} else if cc == '<' {
|
||||||
// found < in the left
|
// found < in the left
|
||||||
|
if !found_right_angle {
|
||||||
|
// skip something like "(< )>"
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else if cc == '(' {
|
||||||
|
if !found_right_parentheses {
|
||||||
|
// skip something like "<(>)"
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
// failed to find '<' return false immediately
|
// failed to find '<' return false immediately
|
||||||
|
|
|
@ -22,6 +22,7 @@ use rustc_errors::{
|
||||||
MultiSpan, Style,
|
MultiSpan, Style,
|
||||||
};
|
};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
|
use rustc_hir::def::Namespace;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_hir::intravisit::Visitor;
|
use rustc_hir::intravisit::Visitor;
|
||||||
use rustc_hir::GenericParam;
|
use rustc_hir::GenericParam;
|
||||||
|
@ -34,6 +35,7 @@ use rustc_middle::traits::select::OverflowError;
|
||||||
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
||||||
use rustc_middle::ty::error::ExpectedFound;
|
use rustc_middle::ty::error::ExpectedFound;
|
||||||
use rustc_middle::ty::fold::{TypeFolder, TypeSuperFoldable};
|
use rustc_middle::ty::fold::{TypeFolder, TypeSuperFoldable};
|
||||||
|
use rustc_middle::ty::print::{FmtPrinter, Print};
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, SubtypePredicate, ToPolyTraitRef, ToPredicate, TraitRef, Ty, TyCtxt, TypeFoldable,
|
self, SubtypePredicate, ToPolyTraitRef, ToPredicate, TraitRef, Ty, TyCtxt, TypeFoldable,
|
||||||
TypeVisitable,
|
TypeVisitable,
|
||||||
|
@ -109,7 +111,10 @@ pub trait TypeErrCtxtExt<'tcx> {
|
||||||
suggest_increasing_limit: bool,
|
suggest_increasing_limit: bool,
|
||||||
) -> !
|
) -> !
|
||||||
where
|
where
|
||||||
T: fmt::Display + TypeFoldable<'tcx>;
|
T: fmt::Display
|
||||||
|
+ TypeFoldable<'tcx>
|
||||||
|
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
|
||||||
|
<T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug;
|
||||||
|
|
||||||
fn suggest_new_overflow_limit(&self, err: &mut Diagnostic);
|
fn suggest_new_overflow_limit(&self, err: &mut Diagnostic);
|
||||||
|
|
||||||
|
@ -468,15 +473,31 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
suggest_increasing_limit: bool,
|
suggest_increasing_limit: bool,
|
||||||
) -> !
|
) -> !
|
||||||
where
|
where
|
||||||
T: fmt::Display + TypeFoldable<'tcx>,
|
T: fmt::Display
|
||||||
|
+ TypeFoldable<'tcx>
|
||||||
|
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
|
||||||
|
<T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug,
|
||||||
{
|
{
|
||||||
let predicate = self.resolve_vars_if_possible(obligation.predicate.clone());
|
let predicate = self.resolve_vars_if_possible(obligation.predicate.clone());
|
||||||
|
let mut pred_str = predicate.to_string();
|
||||||
|
if pred_str.len() > 50 {
|
||||||
|
// We don't need to save the type to a file, we will be talking about this type already
|
||||||
|
// in a separate note when we explain the obligation, so it will be available that way.
|
||||||
|
pred_str = predicate
|
||||||
|
.print(FmtPrinter::new_with_limit(
|
||||||
|
self.tcx,
|
||||||
|
Namespace::TypeNS,
|
||||||
|
rustc_session::Limit(6),
|
||||||
|
))
|
||||||
|
.unwrap()
|
||||||
|
.into_buffer();
|
||||||
|
}
|
||||||
let mut err = struct_span_err!(
|
let mut err = struct_span_err!(
|
||||||
self.tcx.sess,
|
self.tcx.sess,
|
||||||
obligation.cause.span,
|
obligation.cause.span,
|
||||||
E0275,
|
E0275,
|
||||||
"overflow evaluating the requirement `{}`",
|
"overflow evaluating the requirement `{}`",
|
||||||
predicate
|
pred_str,
|
||||||
);
|
);
|
||||||
|
|
||||||
if suggest_increasing_limit {
|
if suggest_increasing_limit {
|
||||||
|
|
|
@ -2733,9 +2733,10 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
self.resolve_vars_if_possible(data.derived.parent_trait_pred);
|
self.resolve_vars_if_possible(data.derived.parent_trait_pred);
|
||||||
parent_trait_pred.remap_constness_diag(param_env);
|
parent_trait_pred.remap_constness_diag(param_env);
|
||||||
let parent_def_id = parent_trait_pred.def_id();
|
let parent_def_id = parent_trait_pred.def_id();
|
||||||
|
let (self_ty, file) =
|
||||||
|
self.tcx.short_ty_string(parent_trait_pred.skip_binder().self_ty());
|
||||||
let msg = format!(
|
let msg = format!(
|
||||||
"required for `{}` to implement `{}`",
|
"required for `{self_ty}` to implement `{}`",
|
||||||
parent_trait_pred.skip_binder().self_ty(),
|
|
||||||
parent_trait_pred.print_modifiers_and_trait_path()
|
parent_trait_pred.print_modifiers_and_trait_path()
|
||||||
);
|
);
|
||||||
let mut is_auto_trait = false;
|
let mut is_auto_trait = false;
|
||||||
|
@ -2764,6 +2765,12 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
_ => err.note(&msg),
|
_ => err.note(&msg),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if let Some(file) = file {
|
||||||
|
err.note(&format!(
|
||||||
|
"the full type name has been written to '{}'",
|
||||||
|
file.display(),
|
||||||
|
));
|
||||||
|
}
|
||||||
let mut parent_predicate = parent_trait_pred;
|
let mut parent_predicate = parent_trait_pred;
|
||||||
let mut data = &data.derived;
|
let mut data = &data.derived;
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
|
@ -2804,11 +2811,18 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||||
count,
|
count,
|
||||||
pluralize!(count)
|
pluralize!(count)
|
||||||
));
|
));
|
||||||
|
let (self_ty, file) =
|
||||||
|
self.tcx.short_ty_string(parent_trait_pred.skip_binder().self_ty());
|
||||||
err.note(&format!(
|
err.note(&format!(
|
||||||
"required for `{}` to implement `{}`",
|
"required for `{self_ty}` to implement `{}`",
|
||||||
parent_trait_pred.skip_binder().self_ty(),
|
|
||||||
parent_trait_pred.print_modifiers_and_trait_path()
|
parent_trait_pred.print_modifiers_and_trait_path()
|
||||||
));
|
));
|
||||||
|
if let Some(file) = file {
|
||||||
|
err.note(&format!(
|
||||||
|
"the full type name has been written to '{}'",
|
||||||
|
file.display(),
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// #74711: avoid a stack overflow
|
// #74711: avoid a stack overflow
|
||||||
ensure_sufficient_stack(|| {
|
ensure_sufficient_stack(|| {
|
||||||
|
|
|
@ -375,6 +375,7 @@ fn object_safety_violation_for_method(
|
||||||
let span = match (&v, node) {
|
let span = match (&v, node) {
|
||||||
(MethodViolationCode::ReferencesSelfInput(Some(span)), _) => *span,
|
(MethodViolationCode::ReferencesSelfInput(Some(span)), _) => *span,
|
||||||
(MethodViolationCode::UndispatchableReceiver(Some(span)), _) => *span,
|
(MethodViolationCode::UndispatchableReceiver(Some(span)), _) => *span,
|
||||||
|
(MethodViolationCode::ReferencesImplTraitInTrait(span), _) => *span,
|
||||||
(MethodViolationCode::ReferencesSelfOutput, Some(node)) => {
|
(MethodViolationCode::ReferencesSelfOutput, Some(node)) => {
|
||||||
node.fn_decl().map_or(method.ident(tcx).span, |decl| decl.output.span())
|
node.fn_decl().map_or(method.ident(tcx).span, |decl| decl.output.span())
|
||||||
}
|
}
|
||||||
|
@ -437,8 +438,8 @@ fn virtual_call_violation_for_method<'tcx>(
|
||||||
if contains_illegal_self_type_reference(tcx, trait_def_id, sig.output()) {
|
if contains_illegal_self_type_reference(tcx, trait_def_id, sig.output()) {
|
||||||
return Some(MethodViolationCode::ReferencesSelfOutput);
|
return Some(MethodViolationCode::ReferencesSelfOutput);
|
||||||
}
|
}
|
||||||
if contains_illegal_impl_trait_in_trait(tcx, sig.output()) {
|
if let Some(code) = contains_illegal_impl_trait_in_trait(tcx, method.def_id, sig.output()) {
|
||||||
return Some(MethodViolationCode::ReferencesImplTraitInTrait);
|
return Some(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We can't monomorphize things like `fn foo<A>(...)`.
|
// We can't monomorphize things like `fn foo<A>(...)`.
|
||||||
|
@ -864,16 +865,24 @@ fn contains_illegal_self_type_reference<'tcx, T: TypeVisitable<'tcx>>(
|
||||||
|
|
||||||
pub fn contains_illegal_impl_trait_in_trait<'tcx>(
|
pub fn contains_illegal_impl_trait_in_trait<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
|
fn_def_id: DefId,
|
||||||
ty: ty::Binder<'tcx, Ty<'tcx>>,
|
ty: ty::Binder<'tcx, Ty<'tcx>>,
|
||||||
) -> bool {
|
) -> Option<MethodViolationCode> {
|
||||||
|
// This would be caught below, but rendering the error as a separate
|
||||||
|
// `async-specific` message is better.
|
||||||
|
if tcx.asyncness(fn_def_id).is_async() {
|
||||||
|
return Some(MethodViolationCode::AsyncFn);
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME(RPITIT): Perhaps we should use a visitor here?
|
// FIXME(RPITIT): Perhaps we should use a visitor here?
|
||||||
ty.skip_binder().walk().any(|arg| {
|
ty.skip_binder().walk().find_map(|arg| {
|
||||||
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
if let ty::GenericArgKind::Type(ty) = arg.unpack()
|
||||||
&& let ty::Projection(proj) = ty.kind()
|
&& let ty::Projection(proj) = ty.kind()
|
||||||
|
&& tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder
|
||||||
{
|
{
|
||||||
tcx.def_kind(proj.item_def_id) == DefKind::ImplTraitPlaceholder
|
Some(MethodViolationCode::ReferencesImplTraitInTrait(tcx.def_span(proj.item_def_id)))
|
||||||
} else {
|
} else {
|
||||||
false
|
None
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ use rustc_middle::mir::interpret::ErrorHandled;
|
||||||
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
use rustc_middle::ty::abstract_const::NotConstEvaluatable;
|
||||||
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
|
use rustc_middle::ty::fast_reject::{DeepRejectCtxt, TreatParams};
|
||||||
use rustc_middle::ty::fold::BottomUpFolder;
|
use rustc_middle::ty::fold::BottomUpFolder;
|
||||||
|
use rustc_middle::ty::print::{FmtPrinter, Print};
|
||||||
use rustc_middle::ty::relate::TypeRelation;
|
use rustc_middle::ty::relate::TypeRelation;
|
||||||
use rustc_middle::ty::SubstsRef;
|
use rustc_middle::ty::SubstsRef;
|
||||||
use rustc_middle::ty::{self, EarlyBinder, PolyProjectionPredicate, ToPolyTraitRef, ToPredicate};
|
use rustc_middle::ty::{self, EarlyBinder, PolyProjectionPredicate, ToPolyTraitRef, ToPredicate};
|
||||||
|
@ -1081,11 +1082,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
it.for_each(|o| o.recursion_depth = cmp::max(min_depth, o.recursion_depth) + 1);
|
it.for_each(|o| o.recursion_depth = cmp::max(min_depth, o.recursion_depth) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_recursion_depth<T: Display + TypeFoldable<'tcx>>(
|
fn check_recursion_depth<T>(
|
||||||
&self,
|
&self,
|
||||||
depth: usize,
|
depth: usize,
|
||||||
error_obligation: &Obligation<'tcx, T>,
|
error_obligation: &Obligation<'tcx, T>,
|
||||||
) -> Result<(), OverflowError> {
|
) -> Result<(), OverflowError>
|
||||||
|
where
|
||||||
|
T: fmt::Display
|
||||||
|
+ TypeFoldable<'tcx>
|
||||||
|
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
|
||||||
|
<T as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug,
|
||||||
|
{
|
||||||
if !self.infcx.tcx.recursion_limit().value_within_limit(depth) {
|
if !self.infcx.tcx.recursion_limit().value_within_limit(depth) {
|
||||||
match self.query_mode {
|
match self.query_mode {
|
||||||
TraitQueryMode::Standard => {
|
TraitQueryMode::Standard => {
|
||||||
|
@ -1107,11 +1114,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
/// The weird return type of this function allows it to be used with the `try` (`?`)
|
/// The weird return type of this function allows it to be used with the `try` (`?`)
|
||||||
/// operator within certain functions.
|
/// operator within certain functions.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn check_recursion_limit<T: Display + TypeFoldable<'tcx>, V: Display + TypeFoldable<'tcx>>(
|
fn check_recursion_limit<T: Display + TypeFoldable<'tcx>, V>(
|
||||||
&self,
|
&self,
|
||||||
obligation: &Obligation<'tcx, T>,
|
obligation: &Obligation<'tcx, T>,
|
||||||
error_obligation: &Obligation<'tcx, V>,
|
error_obligation: &Obligation<'tcx, V>,
|
||||||
) -> Result<(), OverflowError> {
|
) -> Result<(), OverflowError>
|
||||||
|
where
|
||||||
|
V: fmt::Display
|
||||||
|
+ TypeFoldable<'tcx>
|
||||||
|
+ Print<'tcx, FmtPrinter<'tcx, 'tcx>, Output = FmtPrinter<'tcx, 'tcx>>,
|
||||||
|
<V as Print<'tcx, FmtPrinter<'tcx, 'tcx>>>::Error: std::fmt::Debug,
|
||||||
|
{
|
||||||
self.check_recursion_depth(obligation.recursion_depth, error_obligation)
|
self.check_recursion_depth(obligation.recursion_depth, error_obligation)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,8 @@ cfg_if::cfg_if! {
|
||||||
// L4Re is unix family but does not yet support unwinding.
|
// L4Re is unix family but does not yet support unwinding.
|
||||||
#[path = "dummy.rs"]
|
#[path = "dummy.rs"]
|
||||||
mod real_imp;
|
mod real_imp;
|
||||||
} else if #[cfg(target_env = "msvc")] {
|
} else if #[cfg(all(target_env = "msvc", not(target_arch = "arm")))] {
|
||||||
|
// LLVM does not support unwinding on 32 bit ARM msvc (thumbv7a-pc-windows-msvc)
|
||||||
#[path = "seh.rs"]
|
#[path = "seh.rs"]
|
||||||
mod real_imp;
|
mod real_imp;
|
||||||
} else if #[cfg(any(
|
} else if #[cfg(any(
|
||||||
|
|
|
@ -1121,13 +1121,18 @@ impl Step for Sysroot {
|
||||||
fn run(self, builder: &Builder<'_>) -> Interned<PathBuf> {
|
fn run(self, builder: &Builder<'_>) -> Interned<PathBuf> {
|
||||||
let compiler = self.compiler;
|
let compiler = self.compiler;
|
||||||
let host_dir = builder.out.join(&compiler.host.triple);
|
let host_dir = builder.out.join(&compiler.host.triple);
|
||||||
let sysroot = if compiler.stage == 0 {
|
|
||||||
host_dir.join("stage0-sysroot")
|
let sysroot_dir = |stage| {
|
||||||
} else if builder.download_rustc() {
|
if stage == 0 {
|
||||||
host_dir.join("ci-rustc-sysroot")
|
host_dir.join("stage0-sysroot")
|
||||||
} else {
|
} else if builder.download_rustc() && compiler.stage != builder.top_stage {
|
||||||
host_dir.join(format!("stage{}", compiler.stage))
|
host_dir.join("ci-rustc-sysroot")
|
||||||
|
} else {
|
||||||
|
host_dir.join(format!("stage{}", stage))
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
let sysroot = sysroot_dir(compiler.stage);
|
||||||
|
|
||||||
let _ = fs::remove_dir_all(&sysroot);
|
let _ = fs::remove_dir_all(&sysroot);
|
||||||
t!(fs::create_dir_all(&sysroot));
|
t!(fs::create_dir_all(&sysroot));
|
||||||
|
|
||||||
|
@ -1138,9 +1143,15 @@ impl Step for Sysroot {
|
||||||
"Cross-compiling is not yet supported with `download-rustc`",
|
"Cross-compiling is not yet supported with `download-rustc`",
|
||||||
);
|
);
|
||||||
|
|
||||||
// #102002, cleanup stage1 and stage0-sysroot folders when using download-rustc so people don't use old versions of the toolchain by accident.
|
// #102002, cleanup old toolchain folders when using download-rustc so people don't use them by accident.
|
||||||
let _ = fs::remove_dir_all(host_dir.join("stage1"));
|
for stage in 0..=2 {
|
||||||
let _ = fs::remove_dir_all(host_dir.join("stage0-sysroot"));
|
if stage != compiler.stage {
|
||||||
|
let dir = sysroot_dir(stage);
|
||||||
|
if !dir.ends_with("ci-rustc-sysroot") {
|
||||||
|
let _ = fs::remove_dir_all(dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Copy the compiler into the correct sysroot.
|
// Copy the compiler into the correct sysroot.
|
||||||
let ci_rustc_dir =
|
let ci_rustc_dir =
|
||||||
|
|
|
@ -1511,19 +1511,25 @@ impl Config {
|
||||||
|
|
||||||
/// Return whether we will use a downloaded, pre-compiled version of rustc, or just build from source.
|
/// Return whether we will use a downloaded, pre-compiled version of rustc, or just build from source.
|
||||||
pub(crate) fn download_rustc(&self) -> bool {
|
pub(crate) fn download_rustc(&self) -> bool {
|
||||||
static DOWNLOAD_RUSTC: OnceCell<bool> = OnceCell::new();
|
self.download_rustc_commit().is_some()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn download_rustc_commit(&self) -> Option<&'static str> {
|
||||||
|
static DOWNLOAD_RUSTC: OnceCell<Option<String>> = OnceCell::new();
|
||||||
if self.dry_run() && DOWNLOAD_RUSTC.get().is_none() {
|
if self.dry_run() && DOWNLOAD_RUSTC.get().is_none() {
|
||||||
// avoid trying to actually download the commit
|
// avoid trying to actually download the commit
|
||||||
return false;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
*DOWNLOAD_RUSTC.get_or_init(|| match &self.download_rustc_commit {
|
DOWNLOAD_RUSTC
|
||||||
None => false,
|
.get_or_init(|| match &self.download_rustc_commit {
|
||||||
Some(commit) => {
|
None => None,
|
||||||
self.download_ci_rustc(commit);
|
Some(commit) => {
|
||||||
true
|
self.download_ci_rustc(commit);
|
||||||
}
|
Some(commit.clone())
|
||||||
})
|
}
|
||||||
|
})
|
||||||
|
.as_deref()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn initial_rustfmt(&self) -> Option<PathBuf> {
|
pub(crate) fn initial_rustfmt(&self) -> Option<PathBuf> {
|
||||||
|
|
|
@ -1401,6 +1401,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
|
||||||
|
|
||||||
cmd.arg("--src-base").arg(builder.src.join("src/test").join(suite));
|
cmd.arg("--src-base").arg(builder.src.join("src/test").join(suite));
|
||||||
cmd.arg("--build-base").arg(testdir(builder, compiler.host).join(suite));
|
cmd.arg("--build-base").arg(testdir(builder, compiler.host).join(suite));
|
||||||
|
cmd.arg("--sysroot-base").arg(builder.sysroot(compiler));
|
||||||
cmd.arg("--stage-id").arg(format!("stage{}-{}", compiler.stage, target));
|
cmd.arg("--stage-id").arg(format!("stage{}-{}", compiler.stage, target));
|
||||||
cmd.arg("--suite").arg(suite);
|
cmd.arg("--suite").arg(suite);
|
||||||
cmd.arg("--mode").arg(mode);
|
cmd.arg("--mode").arg(mode);
|
||||||
|
@ -1670,6 +1671,10 @@ note: if you're sure you want to do this, please open an issue as to why. In the
|
||||||
|
|
||||||
cmd.arg("--channel").arg(&builder.config.channel);
|
cmd.arg("--channel").arg(&builder.config.channel);
|
||||||
|
|
||||||
|
if let Some(commit) = builder.config.download_rustc_commit() {
|
||||||
|
cmd.env("FAKE_DOWNLOAD_RUSTC_PREFIX", format!("/rustc/{commit}"));
|
||||||
|
}
|
||||||
|
|
||||||
builder.ci_env.force_coloring_in_ci(&mut cmd);
|
builder.ci_env.force_coloring_in_ci(&mut cmd);
|
||||||
|
|
||||||
builder.info(&format!(
|
builder.info(&format!(
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
0.13.1
|
0.13.2
|
|
@ -9,7 +9,6 @@ path = "lib.rs"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
arrayvec = { version = "0.7", default-features = false }
|
arrayvec = { version = "0.7", default-features = false }
|
||||||
askama = { version = "0.11", default-features = false, features = ["config"] }
|
askama = { version = "0.11", default-features = false, features = ["config"] }
|
||||||
atty = "0.2"
|
|
||||||
itertools = "0.10.1"
|
itertools = "0.10.1"
|
||||||
minifier = "0.2.2"
|
minifier = "0.2.2"
|
||||||
once_cell = "1.10.0"
|
once_cell = "1.10.0"
|
||||||
|
|
|
@ -1378,6 +1378,12 @@ a.test-arrow:hover {
|
||||||
background-color: var(--button-background-color);
|
background-color: var(--button-background-color);
|
||||||
border: 1px solid var(--border-color);
|
border: 1px solid var(--border-color);
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
|
color: var(--settings-button-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
#settings-menu > a:hover, #settings-menu > a:focus,
|
||||||
|
#help-button > a:hover, #help-button > a:focus {
|
||||||
|
border-color: var(--settings-button-border-focus);
|
||||||
}
|
}
|
||||||
|
|
||||||
#copy-path {
|
#copy-path {
|
||||||
|
|
|
@ -7,6 +7,8 @@ Original by Dempfi (https://github.com/dempfi/ayu)
|
||||||
--main-background-color: #0f1419;
|
--main-background-color: #0f1419;
|
||||||
--main-color: #c5c5c5;
|
--main-color: #c5c5c5;
|
||||||
--settings-input-color: #ffb454;
|
--settings-input-color: #ffb454;
|
||||||
|
--settings-button-color: #fff;
|
||||||
|
--settings-button-border-focus: #e0e0e0;
|
||||||
--sidebar-background-color: #14191f;
|
--sidebar-background-color: #14191f;
|
||||||
--sidebar-background-color-hover: rgba(70, 70, 70, 0.33);
|
--sidebar-background-color-hover: rgba(70, 70, 70, 0.33);
|
||||||
--code-block-background-color: #191f26;
|
--code-block-background-color: #191f26;
|
||||||
|
@ -199,19 +201,10 @@ kbd {
|
||||||
box-shadow: inset 0 -1px 0 #5c6773;
|
box-shadow: inset 0 -1px 0 #5c6773;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-menu > a, #help-button > a {
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
#settings-menu > a img {
|
#settings-menu > a img {
|
||||||
filter: invert(100);
|
filter: invert(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-menu > a:hover, #settings-menu > a:focus,
|
|
||||||
#help-button > a:hover, #help-button > a:focus {
|
|
||||||
border-color: #e0e0e0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-results .result-name span.alias {
|
.search-results .result-name span.alias {
|
||||||
color: #c5c5c5;
|
color: #c5c5c5;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
--main-background-color: #353535;
|
--main-background-color: #353535;
|
||||||
--main-color: #ddd;
|
--main-color: #ddd;
|
||||||
--settings-input-color: #2196f3;
|
--settings-input-color: #2196f3;
|
||||||
|
--settings-button-color: #000;
|
||||||
|
--settings-button-border-focus: #ffb900;
|
||||||
--sidebar-background-color: #505050;
|
--sidebar-background-color: #505050;
|
||||||
--sidebar-background-color-hover: #676767;
|
--sidebar-background-color-hover: #676767;
|
||||||
--code-block-background-color: #2A2A2A;
|
--code-block-background-color: #2A2A2A;
|
||||||
|
@ -104,15 +106,6 @@ kbd {
|
||||||
box-shadow: inset 0 -1px 0 #c6cbd1;
|
box-shadow: inset 0 -1px 0 #c6cbd1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-menu > a, #help-button > a {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#settings-menu > a:hover, #settings-menu > a:focus,
|
|
||||||
#help-button > a:hover, #help-button > a:focus {
|
|
||||||
border-color: #ffb900;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-results .result-name span.alias {
|
.search-results .result-name span.alias {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
--main-background-color: white;
|
--main-background-color: white;
|
||||||
--main-color: black;
|
--main-color: black;
|
||||||
--settings-input-color: #2196f3;
|
--settings-input-color: #2196f3;
|
||||||
|
--settings-button-color: #000;
|
||||||
|
--settings-button-border-focus: #717171;
|
||||||
--sidebar-background-color: #F5F5F5;
|
--sidebar-background-color: #F5F5F5;
|
||||||
--sidebar-background-color-hover: #E0E0E0;
|
--sidebar-background-color-hover: #E0E0E0;
|
||||||
--code-block-background-color: #F5F5F5;
|
--code-block-background-color: #F5F5F5;
|
||||||
|
@ -97,15 +99,6 @@ kbd {
|
||||||
box-shadow: inset 0 -1px 0 #c6cbd1;
|
box-shadow: inset 0 -1px 0 #c6cbd1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#settings-menu > a, #help-button > a {
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
#settings-menu > a:hover, #settings-menu > a:focus,
|
|
||||||
#help-button > a:hover, #help-button > a:focus {
|
|
||||||
border-color: #717171;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-results .result-name span.alias {
|
.search-results .result-name span.alias {
|
||||||
color: #000;
|
color: #000;
|
||||||
}
|
}
|
||||||
|
|
|
@ -795,7 +795,7 @@ function loadCss(cssUrl) {
|
||||||
// This means when the window is resized, we need to redo the layout.
|
// This means when the window is resized, we need to redo the layout.
|
||||||
const base = window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE;
|
const base = window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE;
|
||||||
const force_visible = base.NOTABLE_FORCE_VISIBLE;
|
const force_visible = base.NOTABLE_FORCE_VISIBLE;
|
||||||
hideNotable();
|
hideNotable(false);
|
||||||
if (force_visible) {
|
if (force_visible) {
|
||||||
showNotable(base);
|
showNotable(base);
|
||||||
base.NOTABLE_FORCE_VISIBLE = true;
|
base.NOTABLE_FORCE_VISIBLE = true;
|
||||||
|
@ -846,7 +846,7 @@ function loadCss(cssUrl) {
|
||||||
// Make this function idempotent.
|
// Make this function idempotent.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
hideNotable();
|
hideNotable(false);
|
||||||
const ty = e.getAttribute("data-ty");
|
const ty = e.getAttribute("data-ty");
|
||||||
const wrapper = document.createElement("div");
|
const wrapper = document.createElement("div");
|
||||||
wrapper.innerHTML = "<div class=\"docblock\">" + window.NOTABLE_TRAITS[ty] + "</div>";
|
wrapper.innerHTML = "<div class=\"docblock\">" + window.NOTABLE_TRAITS[ty] + "</div>";
|
||||||
|
@ -883,7 +883,7 @@ function loadCss(cssUrl) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!e.NOTABLE_FORCE_VISIBLE && !elemIsInParent(event.relatedTarget, e)) {
|
if (!e.NOTABLE_FORCE_VISIBLE && !elemIsInParent(event.relatedTarget, e)) {
|
||||||
hideNotable();
|
hideNotable(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -903,14 +903,16 @@ function loadCss(cssUrl) {
|
||||||
// To work around this, make sure the click finishes being dispatched before
|
// To work around this, make sure the click finishes being dispatched before
|
||||||
// hiding the popover. Since `hideNotable()` is idempotent, this makes Safari behave
|
// hiding the popover. Since `hideNotable()` is idempotent, this makes Safari behave
|
||||||
// consistently with the other two.
|
// consistently with the other two.
|
||||||
setTimeout(hideNotable, 0);
|
setTimeout(() => hideNotable(false), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function hideNotable() {
|
function hideNotable(focus) {
|
||||||
if (window.CURRENT_NOTABLE_ELEMENT) {
|
if (window.CURRENT_NOTABLE_ELEMENT) {
|
||||||
if (window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE) {
|
if (window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE) {
|
||||||
window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.focus();
|
if (focus) {
|
||||||
|
window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.focus();
|
||||||
|
}
|
||||||
window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE = false;
|
window.CURRENT_NOTABLE_ELEMENT.NOTABLE_BASE.NOTABLE_FORCE_VISIBLE = false;
|
||||||
}
|
}
|
||||||
const body = document.getElementsByTagName("body")[0];
|
const body = document.getElementsByTagName("body")[0];
|
||||||
|
@ -923,7 +925,7 @@ function loadCss(cssUrl) {
|
||||||
e.onclick = function() {
|
e.onclick = function() {
|
||||||
this.NOTABLE_FORCE_VISIBLE = this.NOTABLE_FORCE_VISIBLE ? false : true;
|
this.NOTABLE_FORCE_VISIBLE = this.NOTABLE_FORCE_VISIBLE ? false : true;
|
||||||
if (window.CURRENT_NOTABLE_ELEMENT && !this.NOTABLE_FORCE_VISIBLE) {
|
if (window.CURRENT_NOTABLE_ELEMENT && !this.NOTABLE_FORCE_VISIBLE) {
|
||||||
hideNotable();
|
hideNotable(true);
|
||||||
} else {
|
} else {
|
||||||
showNotable(this);
|
showNotable(this);
|
||||||
window.CURRENT_NOTABLE_ELEMENT.setAttribute("tabindex", "0");
|
window.CURRENT_NOTABLE_ELEMENT.setAttribute("tabindex", "0");
|
||||||
|
@ -946,7 +948,7 @@ function loadCss(cssUrl) {
|
||||||
}
|
}
|
||||||
if (!this.NOTABLE_FORCE_VISIBLE &&
|
if (!this.NOTABLE_FORCE_VISIBLE &&
|
||||||
!elemIsInParent(event.relatedTarget, window.CURRENT_NOTABLE_ELEMENT)) {
|
!elemIsInParent(event.relatedTarget, window.CURRENT_NOTABLE_ELEMENT)) {
|
||||||
hideNotable();
|
hideNotable(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -1057,7 +1059,7 @@ function loadCss(cssUrl) {
|
||||||
onEachLazy(document.querySelectorAll(".search-form .popover"), elem => {
|
onEachLazy(document.querySelectorAll(".search-form .popover"), elem => {
|
||||||
elem.style.display = "none";
|
elem.style.display = "none";
|
||||||
});
|
});
|
||||||
hideNotable();
|
hideNotable(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#![feature(box_patterns)]
|
#![feature(box_patterns)]
|
||||||
#![feature(control_flow_enum)]
|
#![feature(control_flow_enum)]
|
||||||
#![feature(drain_filter)]
|
#![feature(drain_filter)]
|
||||||
|
#![feature(is_terminal)]
|
||||||
#![feature(let_chains)]
|
#![feature(let_chains)]
|
||||||
#![feature(test)]
|
#![feature(test)]
|
||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
|
@ -69,7 +70,7 @@ extern crate jemalloc_sys;
|
||||||
|
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::env::{self, VarError};
|
use std::env::{self, VarError};
|
||||||
use std::io;
|
use std::io::{self, IsTerminal};
|
||||||
use std::process;
|
use std::process;
|
||||||
|
|
||||||
use rustc_driver::abort_on_err;
|
use rustc_driver::abort_on_err;
|
||||||
|
@ -179,7 +180,7 @@ fn init_logging() {
|
||||||
let color_logs = match std::env::var("RUSTDOC_LOG_COLOR").as_deref() {
|
let color_logs = match std::env::var("RUSTDOC_LOG_COLOR").as_deref() {
|
||||||
Ok("always") => true,
|
Ok("always") => true,
|
||||||
Ok("never") => false,
|
Ok("never") => false,
|
||||||
Ok("auto") | Err(VarError::NotPresent) => atty::is(atty::Stream::Stdout),
|
Ok("auto") | Err(VarError::NotPresent) => io::stdout().is_terminal(),
|
||||||
Ok(value) => early_error(
|
Ok(value) => early_error(
|
||||||
ErrorOutputType::default(),
|
ErrorOutputType::default(),
|
||||||
&format!("invalid log color value '{}': expected one of always, never, or auto", value),
|
&format!("invalid log color value '{}': expected one of always, never, or auto", value),
|
||||||
|
|
|
@ -219,3 +219,33 @@ press-key: "Tab"
|
||||||
press-key: "Tab"
|
press-key: "Tab"
|
||||||
press-key: "Tab"
|
press-key: "Tab"
|
||||||
assert-count: ("//*[@class='notable popover']", 0)
|
assert-count: ("//*[@class='notable popover']", 0)
|
||||||
|
assert: "#method\.create_an_iterator_from_read .notable-traits:focus"
|
||||||
|
|
||||||
|
// Now we check that the focus isn't given back to the wrong item when opening
|
||||||
|
// another popover.
|
||||||
|
store-window-property: (scroll, "scrollY")
|
||||||
|
click: "#method\.create_an_iterator_from_read .fnname"
|
||||||
|
// We ensure that the scroll position changed.
|
||||||
|
assert-window-property-false: {"scrollY": |scroll|}
|
||||||
|
// Store the new position.
|
||||||
|
store-window-property: (scroll, "scrollY")
|
||||||
|
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
|
||||||
|
wait-for: "//*[@class='notable popover']"
|
||||||
|
click: "#settings-menu a"
|
||||||
|
click: ".search-input"
|
||||||
|
// We ensure we didn't come back to the previous focused item.
|
||||||
|
assert-window-property-false: {"scrollY": |scroll|}
|
||||||
|
|
||||||
|
// Same but with Escape handling.
|
||||||
|
store-window-property: (scroll, "scrollY")
|
||||||
|
click: "#method\.create_an_iterator_from_read .fnname"
|
||||||
|
// We ensure that the scroll position changed.
|
||||||
|
assert-window-property-false: {"scrollY": |scroll|}
|
||||||
|
// Store the new position.
|
||||||
|
store-window-property: (scroll, "scrollY")
|
||||||
|
click: "//*[@id='method.create_an_iterator_from_read']//*[@class='notable-traits']"
|
||||||
|
wait-for: "//*[@class='notable popover']"
|
||||||
|
click: "#settings-menu a"
|
||||||
|
press-key: "Escape"
|
||||||
|
// We ensure we didn't come back to the previous focused item.
|
||||||
|
assert-window-property-false: {"scrollY": |scroll|}
|
||||||
|
|
13
src/test/ui/async-await/in-trait/object-safety.rs
Normal file
13
src/test/ui/async-await/in-trait/object-safety.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// edition:2021
|
||||||
|
|
||||||
|
#![feature(async_fn_in_trait)]
|
||||||
|
//~^ WARN the feature `async_fn_in_trait` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
async fn foo(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x: &dyn Foo = todo!();
|
||||||
|
//~^ ERROR the trait `Foo` cannot be made into an object
|
||||||
|
}
|
27
src/test/ui/async-await/in-trait/object-safety.stderr
Normal file
27
src/test/ui/async-await/in-trait/object-safety.stderr
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
warning: the feature `async_fn_in_trait` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||||
|
--> $DIR/object-safety.rs:3:12
|
||||||
|
|
|
||||||
|
LL | #![feature(async_fn_in_trait)]
|
||||||
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: see issue #91611 <https://github.com/rust-lang/rust/issues/91611> for more information
|
||||||
|
= note: `#[warn(incomplete_features)]` on by default
|
||||||
|
|
||||||
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
|
--> $DIR/object-safety.rs:11:12
|
||||||
|
|
|
||||||
|
LL | let x: &dyn Foo = todo!();
|
||||||
|
| ^^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
||||||
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
|
--> $DIR/object-safety.rs:7:14
|
||||||
|
|
|
||||||
|
LL | trait Foo {
|
||||||
|
| --- this trait cannot be made into an object...
|
||||||
|
LL | async fn foo(&self);
|
||||||
|
| ^^^ ...because method `foo` is `async`
|
||||||
|
= help: consider moving `foo` to another trait
|
||||||
|
|
||||||
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0038`.
|
|
@ -1,3 +1,4 @@
|
||||||
|
// normalize-stderr-test: "long-type-\d+" -> "long-type-hash"
|
||||||
trait Foo {}
|
trait Foo {}
|
||||||
|
|
||||||
struct Bar<T>(T);
|
struct Bar<T>(T);
|
||||||
|
|
|
@ -1,15 +1,16 @@
|
||||||
error[E0275]: overflow evaluating the requirement `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Foo`
|
error[E0275]: overflow evaluating the requirement `Bar<Bar<Bar<Bar<Bar<Bar<Bar<...>>>>>>>: Foo`
|
||||||
--> $DIR/E0275.rs:5:33
|
--> $DIR/E0275.rs:6:33
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo for T where Bar<T>: Foo {}
|
LL | impl<T> Foo for T where Bar<T>: Foo {}
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`E0275`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`E0275`)
|
||||||
note: required for `Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<Bar<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` to implement `Foo`
|
note: required for `Bar<Bar<Bar<Bar<Bar<Bar<...>>>>>>` to implement `Foo`
|
||||||
--> $DIR/E0275.rs:5:9
|
--> $DIR/E0275.rs:6:9
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo for T where Bar<T>: Foo {}
|
LL | impl<T> Foo for T where Bar<T>: Foo {}
|
||||||
| ^^^ ^
|
| ^^^ ^
|
||||||
|
= note: the full type name has been written to '$TEST_BUILD_DIR/error-codes/E0275/E0275.long-type-hash.txt'
|
||||||
= note: 127 redundant requirements hidden
|
= note: 127 redundant requirements hidden
|
||||||
= note: required for `Bar<T>` to implement `Foo`
|
= note: required for `Bar<T>` to implement `Foo`
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,12 @@ LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
||||||
| ^^^^^^^^^^^^ `Foo` cannot be made into an object
|
| ^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
|
||||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
--> $DIR/object-safety.rs:7:8
|
--> $DIR/object-safety.rs:7:22
|
||||||
|
|
|
|
||||||
LL | trait Foo {
|
LL | trait Foo {
|
||||||
| --- this trait cannot be made into an object...
|
| --- this trait cannot be made into an object...
|
||||||
LL | fn baz(&self) -> impl Debug;
|
LL | fn baz(&self) -> impl Debug;
|
||||||
| ^^^ ...because method `baz` references an `impl Trait` type in its return type
|
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
||||||
= help: consider moving `baz` to another trait
|
= help: consider moving `baz` to another trait
|
||||||
|
|
||||||
error[E0038]: the trait `Foo` cannot be made into an object
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
|
@ -20,12 +20,12 @@ LL | let s = i.baz();
|
||||||
| ^^^^^^^ `Foo` cannot be made into an object
|
| ^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
|
||||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
--> $DIR/object-safety.rs:7:8
|
--> $DIR/object-safety.rs:7:22
|
||||||
|
|
|
|
||||||
LL | trait Foo {
|
LL | trait Foo {
|
||||||
| --- this trait cannot be made into an object...
|
| --- this trait cannot be made into an object...
|
||||||
LL | fn baz(&self) -> impl Debug;
|
LL | fn baz(&self) -> impl Debug;
|
||||||
| ^^^ ...because method `baz` references an `impl Trait` type in its return type
|
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
||||||
= help: consider moving `baz` to another trait
|
= help: consider moving `baz` to another trait
|
||||||
|
|
||||||
error[E0038]: the trait `Foo` cannot be made into an object
|
error[E0038]: the trait `Foo` cannot be made into an object
|
||||||
|
@ -35,12 +35,12 @@ LL | let i = Box::new(42_u32) as Box<dyn Foo>;
|
||||||
| ^^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
| ^^^^^^^^^^^^^^^^ `Foo` cannot be made into an object
|
||||||
|
|
|
|
||||||
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
|
||||||
--> $DIR/object-safety.rs:7:8
|
--> $DIR/object-safety.rs:7:22
|
||||||
|
|
|
|
||||||
LL | trait Foo {
|
LL | trait Foo {
|
||||||
| --- this trait cannot be made into an object...
|
| --- this trait cannot be made into an object...
|
||||||
LL | fn baz(&self) -> impl Debug;
|
LL | fn baz(&self) -> impl Debug;
|
||||||
| ^^^ ...because method `baz` references an `impl Trait` type in its return type
|
| ^^^^^^^^^^ ...because method `baz` references an `impl Trait` type in its return type
|
||||||
= help: consider moving `baz` to another trait
|
= help: consider moving `baz` to another trait
|
||||||
= note: required for `Box<u32>` to implement `CoerceUnsized<Box<dyn Foo>>`
|
= note: required for `Box<u32>` to implement `CoerceUnsized<Box<dyn Foo>>`
|
||||||
= note: required by cast to type `Box<dyn Foo>`
|
= note: required by cast to type `Box<dyn Foo>`
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
error: reached the recursion limit while instantiating `function::<Option<Option<Option<...>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
|
error: reached the recursion limit while instantiating `function::<Option<Option<Option<Option<Option<...>>>>>>`
|
||||||
--> $DIR/infinite-instantiation.rs:22:9
|
--> $DIR/infinite-instantiation.rs:22:9
|
||||||
|
|
|
|
||||||
LL | function(counter - 1, t.to_option());
|
LL | function(counter - 1, t.to_option());
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
// normalize-stderr-test: "long-type-\d+" -> "long-type-hash"
|
||||||
trait Foo {
|
trait Foo {
|
||||||
fn answer(self);
|
fn answer(self);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0392]: parameter `T` is never used
|
error[E0392]: parameter `T` is never used
|
||||||
--> $DIR/issue-20413.rs:5:15
|
--> $DIR/issue-20413.rs:6:15
|
||||||
|
|
|
|
||||||
LL | struct NoData<T>;
|
LL | struct NoData<T>;
|
||||||
| ^ unused parameter
|
| ^ unused parameter
|
||||||
|
@ -7,58 +7,63 @@ LL | struct NoData<T>;
|
||||||
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
|
= help: consider removing `T`, referring to it in a field, or using a marker such as `PhantomData`
|
||||||
= help: if you intended `T` to be a const parameter, use `const T: usize` instead
|
= help: if you intended `T` to be a const parameter, use `const T: usize` instead
|
||||||
|
|
||||||
error[E0275]: overflow evaluating the requirement `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Foo`
|
error[E0275]: overflow evaluating the requirement `NoData<NoData<NoData<NoData<NoData<NoData<NoData<...>>>>>>>: Foo`
|
||||||
--> $DIR/issue-20413.rs:8:36
|
--> $DIR/issue-20413.rs:9:36
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo for T where NoData<T>: Foo {
|
LL | impl<T> Foo for T where NoData<T>: Foo {
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_20413`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_20413`)
|
||||||
note: required for `NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<NoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` to implement `Foo`
|
note: required for `NoData<NoData<NoData<NoData<NoData<NoData<...>>>>>>` to implement `Foo`
|
||||||
--> $DIR/issue-20413.rs:8:9
|
--> $DIR/issue-20413.rs:9:9
|
||||||
|
|
|
|
||||||
LL | impl<T> Foo for T where NoData<T>: Foo {
|
LL | impl<T> Foo for T where NoData<T>: Foo {
|
||||||
| ^^^ ^
|
| ^^^ ^
|
||||||
|
= note: the full type name has been written to '$TEST_BUILD_DIR/issues/issue-20413/issue-20413.long-type-hash.txt'
|
||||||
= note: 127 redundant requirements hidden
|
= note: 127 redundant requirements hidden
|
||||||
= note: required for `NoData<T>` to implement `Foo`
|
= note: required for `NoData<T>` to implement `Foo`
|
||||||
|
|
||||||
error[E0275]: overflow evaluating the requirement `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Baz`
|
error[E0275]: overflow evaluating the requirement `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<...>>>>>>>: Baz`
|
||||||
--> $DIR/issue-20413.rs:27:42
|
--> $DIR/issue-20413.rs:28:42
|
||||||
|
|
|
|
||||||
LL | impl<T> Bar for T where EvenLessData<T>: Baz {
|
LL | impl<T> Bar for T where EvenLessData<T>: Baz {
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_20413`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_20413`)
|
||||||
note: required for `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` to implement `Bar`
|
note: required for `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<...>>>>>>` to implement `Bar`
|
||||||
--> $DIR/issue-20413.rs:27:9
|
--> $DIR/issue-20413.rs:28:9
|
||||||
|
|
|
|
||||||
LL | impl<T> Bar for T where EvenLessData<T>: Baz {
|
LL | impl<T> Bar for T where EvenLessData<T>: Baz {
|
||||||
| ^^^ ^
|
| ^^^ ^
|
||||||
note: required for `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` to implement `Baz`
|
= note: the full type name has been written to '$TEST_BUILD_DIR/issues/issue-20413/issue-20413.long-type-hash.txt'
|
||||||
--> $DIR/issue-20413.rs:34:9
|
note: required for `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<...>>>>>>` to implement `Baz`
|
||||||
|
--> $DIR/issue-20413.rs:35:9
|
||||||
|
|
|
|
||||||
LL | impl<T> Baz for T where AlmostNoData<T>: Bar {
|
LL | impl<T> Baz for T where AlmostNoData<T>: Bar {
|
||||||
| ^^^ ^
|
| ^^^ ^
|
||||||
|
= note: the full type name has been written to '$TEST_BUILD_DIR/issues/issue-20413/issue-20413.long-type-hash.txt'
|
||||||
= note: 126 redundant requirements hidden
|
= note: 126 redundant requirements hidden
|
||||||
= note: required for `EvenLessData<T>` to implement `Baz`
|
= note: required for `EvenLessData<T>` to implement `Baz`
|
||||||
|
|
||||||
error[E0275]: overflow evaluating the requirement `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: Bar`
|
error[E0275]: overflow evaluating the requirement `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<...>>>>>>>: Bar`
|
||||||
--> $DIR/issue-20413.rs:34:42
|
--> $DIR/issue-20413.rs:35:42
|
||||||
|
|
|
|
||||||
LL | impl<T> Baz for T where AlmostNoData<T>: Bar {
|
LL | impl<T> Baz for T where AlmostNoData<T>: Bar {
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_20413`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_20413`)
|
||||||
note: required for `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` to implement `Baz`
|
note: required for `EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<...>>>>>>` to implement `Baz`
|
||||||
--> $DIR/issue-20413.rs:34:9
|
--> $DIR/issue-20413.rs:35:9
|
||||||
|
|
|
|
||||||
LL | impl<T> Baz for T where AlmostNoData<T>: Bar {
|
LL | impl<T> Baz for T where AlmostNoData<T>: Bar {
|
||||||
| ^^^ ^
|
| ^^^ ^
|
||||||
note: required for `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<T>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>` to implement `Bar`
|
= note: the full type name has been written to '$TEST_BUILD_DIR/issues/issue-20413/issue-20413.long-type-hash.txt'
|
||||||
--> $DIR/issue-20413.rs:27:9
|
note: required for `AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<AlmostNoData<EvenLessData<...>>>>>>` to implement `Bar`
|
||||||
|
--> $DIR/issue-20413.rs:28:9
|
||||||
|
|
|
|
||||||
LL | impl<T> Bar for T where EvenLessData<T>: Baz {
|
LL | impl<T> Bar for T where EvenLessData<T>: Baz {
|
||||||
| ^^^ ^
|
| ^^^ ^
|
||||||
|
= note: the full type name has been written to '$TEST_BUILD_DIR/issues/issue-20413/issue-20413.long-type-hash.txt'
|
||||||
= note: 126 redundant requirements hidden
|
= note: 126 redundant requirements hidden
|
||||||
= note: required for `AlmostNoData<T>` to implement `Bar`
|
= note: required for `AlmostNoData<T>` to implement `Bar`
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ note: `A::matches` defined here
|
||||||
|
|
|
|
||||||
LL | pub fn matches<F: Fn()>(&self, f: &F) {
|
LL | pub fn matches<F: Fn()>(&self, f: &F) {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
= note: the full type name has been written to '$TEST_BUILD_DIR/issues/issue-22638/issue-22638.long-type.txt'
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
error: reached the recursion limit while instantiating `<(&(&(&(&(&(&(&(&(&(&(&(&(&(&(&(.....), ...), ...) as Foo>::recurse`
|
error: reached the recursion limit while instantiating `<(&(&(..., ...), ...), ...) as Foo>::recurse`
|
||||||
--> $DIR/issue-37311.rs:17:9
|
--> $DIR/issue-37311.rs:17:9
|
||||||
|
|
|
|
||||||
LL | (self, self).recurse();
|
LL | (self, self).recurse();
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut &... &mut &mut &mut &mut &mut Empty>`
|
error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut ...>`
|
||||||
--> $DIR/issue-67552.rs:29:9
|
--> $DIR/issue-67552.rs:29:9
|
||||||
|
|
|
|
||||||
LL | rec(identity(&mut it))
|
LL | rec(identity(&mut it))
|
||||||
|
|
|
@ -9,7 +9,7 @@ LL | generic::<Option<T>>();
|
||||||
= help: a `loop` may express intention better if this is on purpose
|
= help: a `loop` may express intention better if this is on purpose
|
||||||
= note: `#[warn(unconditional_recursion)]` on by default
|
= note: `#[warn(unconditional_recursion)]` on by default
|
||||||
|
|
||||||
error: reached the recursion limit while instantiating `generic::<Option<Option<Option<O...>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
|
error: reached the recursion limit while instantiating `generic::<Option<Option<Option<Option<Option<...>>>>>>`
|
||||||
--> $DIR/issue-8727.rs:8:5
|
--> $DIR/issue-8727.rs:8:5
|
||||||
|
|
|
|
||||||
LL | generic::<Option<T>>();
|
LL | generic::<Option<T>>();
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// build-fail
|
// build-fail
|
||||||
// compile-flags: -Copt-level=0
|
// compile-flags: -Copt-level=0
|
||||||
//~^^ ERROR overflow evaluating the requirement
|
// normalize-stderr-test: "long-type-\d+" -> "long-type-hash"
|
||||||
|
//~^^^ ERROR overflow evaluating the requirement
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut iter = 0u8..1;
|
let mut iter = 0u8..1;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
warning: function cannot return without recursing
|
warning: function cannot return without recursing
|
||||||
--> $DIR/issue-83150.rs:10:1
|
--> $DIR/issue-83150.rs:11:1
|
||||||
|
|
|
|
||||||
LL | fn func<T: Iterator<Item = u8>>(iter: &mut T) {
|
LL | fn func<T: Iterator<Item = u8>>(iter: &mut T) {
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
|
||||||
|
@ -12,9 +12,10 @@ LL | func(&mut iter.map(|x| x + 1))
|
||||||
error[E0275]: overflow evaluating the requirement `<std::ops::Range<u8> as Iterator>::Item`
|
error[E0275]: overflow evaluating the requirement `<std::ops::Range<u8> as Iterator>::Item`
|
||||||
|
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_83150`)
|
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`issue_83150`)
|
||||||
= note: required for `Map<&mut std::ops::Range<u8>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>` to implement `Iterator`
|
= note: required for `Map<&mut std::ops::Range<u8>, [closure@$DIR/issue-83150.rs:12:24: 12:27]>` to implement `Iterator`
|
||||||
= note: 64 redundant requirements hidden
|
= note: 64 redundant requirements hidden
|
||||||
= note: required for `&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut Map<&mut std::ops::Range<u8>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>, [closure@$DIR/issue-83150.rs:11:24: 11:27]>` to implement `Iterator`
|
= note: required for `&mut Map<&mut Map<&mut Map<..., ...>, ...>, ...>` to implement `Iterator`
|
||||||
|
= note: the full type name has been written to '$TEST_BUILD_DIR/recursion/issue-83150/issue-83150.long-type-hash.txt'
|
||||||
|
|
||||||
error: aborting due to previous error; 1 warning emitted
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
error: reached the recursion limit while instantiating `test::<Cons<Cons<Cons<Cons<Cons<...>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`
|
error: reached the recursion limit while instantiating `test::<Cons<Cons<Cons<Cons<Cons<...>>>>>>`
|
||||||
--> $DIR/recursion.rs:18:11
|
--> $DIR/recursion.rs:18:11
|
||||||
|
|
|
|
||||||
LL | _ => {test (n-1, i+1, Cons {head:2*i+1, tail:first}, Cons{head:i*i, tail:second})}
|
LL | _ => {test (n-1, i+1, Cons {head:2*i+1, tail:first}, Cons{head:i*i, tail:second})}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// compile-flags: -Zinline-mir=no
|
// compile-flags: -Zinline-mir=no
|
||||||
// error-pattern: overflow evaluating the requirement `(): Sized`
|
// error-pattern: overflow evaluating the requirement `(): Sized`
|
||||||
// error-pattern: function cannot return without recursing
|
// error-pattern: function cannot return without recursing
|
||||||
|
// normalize-stderr-test: "long-type-\d+" -> "long-type-hash"
|
||||||
|
|
||||||
// Regression test for #91949.
|
// Regression test for #91949.
|
||||||
// This hanged *forever* on 1.56, fixed by #90423.
|
// This hanged *forever* on 1.56, fixed by #90423.
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -7,4 +7,12 @@ fn main() {
|
||||||
let x: &u32 = item;
|
let x: &u32 = item;
|
||||||
assert_eq!(x, &1);
|
assert_eq!(x, &1);
|
||||||
}
|
}
|
||||||
|
let iter_fun2 = <(&[u32])>::iter;
|
||||||
|
//~^ no function or associated item named `iter` found for reference `&[u32]` in the current scope [E0599]
|
||||||
|
//~| function or associated item not found in `&[u32]`
|
||||||
|
//~| HELP the function `iter` is implemented on `[u32]`
|
||||||
|
for item2 in iter_fun2(&[1,1]) {
|
||||||
|
let x: &u32 = item2;
|
||||||
|
assert_eq!(x, &1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,17 @@ help: the function `iter` is implemented on `[u32]`
|
||||||
LL | let iter_fun = <[u32]>::iter;
|
LL | let iter_fun = <[u32]>::iter;
|
||||||
| ~~~~~
|
| ~~~~~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error[E0599]: no function or associated item named `iter` found for reference `&[u32]` in the current scope
|
||||||
|
--> $DIR/issue-103271.rs:10:33
|
||||||
|
|
|
||||||
|
LL | let iter_fun2 = <(&[u32])>::iter;
|
||||||
|
| ^^^^ function or associated item not found in `&[u32]`
|
||||||
|
|
|
||||||
|
help: the function `iter` is implemented on `[u32]`
|
||||||
|
|
|
||||||
|
LL | let iter_fun2 = <([u32])>::iter;
|
||||||
|
| ~~~~~
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0599`.
|
For more information about this error, try `rustc --explain E0599`.
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
// The exact type depends on optimizations, so disable them.
|
// The exact type depends on optimizations, so disable them.
|
||||||
|
|
||||||
#![allow(dead_code)]
|
#![allow(dead_code)]
|
||||||
#![type_length_limit="4"]
|
#![type_length_limit="8"]
|
||||||
|
|
||||||
macro_rules! link {
|
macro_rules! link {
|
||||||
($id:ident, $t:ty) => {
|
($id:ident, $t:ty) => {
|
||||||
|
@ -15,14 +15,19 @@ macro_rules! link {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
link! { A1, B1 }
|
||||||
|
link! { B1, C1 }
|
||||||
|
link! { C1, D1 }
|
||||||
|
link! { D1, E1 }
|
||||||
|
link! { E1, A }
|
||||||
link! { A, B }
|
link! { A, B }
|
||||||
link! { B, C }
|
link! { B, C }
|
||||||
link! { C, D }
|
link! { C, D }
|
||||||
link! { D, E }
|
link! { D, E }
|
||||||
link! { E, F }
|
link! { E, F }
|
||||||
link! { F, G }
|
link! { F, G<Option<i32>, Option<i32>> }
|
||||||
|
|
||||||
pub struct G;
|
pub struct G<T, K>(std::marker::PhantomData::<(T, K)>);
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
drop::<Option<A>>(None);
|
drop::<Option<A>>(None);
|
||||||
|
|
|
@ -1,20 +1,11 @@
|
||||||
error: reached the type-length limit while instantiating `std::mem::drop::<Option<((((...,....., ...), ..., ...), ..., ...)>>`
|
error: reached the type-length limit while instantiating `std::mem::drop::<Option<((((..., ..., ...), ..., ...), ..., ...), ..., ...)>>`
|
||||||
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
|
||||||
|
|
|
|
||||||
LL | pub fn drop<T>(_x: T) {}
|
LL | pub fn drop<T>(_x: T) {}
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= help: consider adding a `#![type_length_limit="8"]` attribute to your crate
|
= help: consider adding a `#![type_length_limit="10"]` attribute to your crate
|
||||||
= note: the full type name has been written to '$TEST_BUILD_DIR/type_length_limit/type_length_limit.long-type.txt'
|
= note: the full type name has been written to '$TEST_BUILD_DIR/type_length_limit/type_length_limit.long-type.txt'
|
||||||
|
|
||||||
error: reached the type-length limit while instantiating `<[closure@std::rt::lang_start<()...e<()>>::call_once - shim(vtable)`
|
error: aborting due to previous error
|
||||||
--> $SRC_DIR/core/src/ops/function.rs:LL:COL
|
|
||||||
|
|
|
||||||
LL | extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= help: consider adding a `#![type_length_limit="8"]` attribute to your crate
|
|
||||||
= note: the full type name has been written to '$TEST_BUILD_DIR/type_length_limit/type_length_limit.long-type.txt'
|
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 16b097879b6f117c8ae698aab054c87f26ff325e
|
Subproject commit eb5d35917b2395194593c9ca70c3778f60c1573b
|
|
@ -6,7 +6,7 @@ use rustc_errors::Applicability;
|
||||||
use rustc_hir::intravisit::FnKind;
|
use rustc_hir::intravisit::FnKind;
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
AsyncGeneratorKind, Block, Body, Closure, Expr, ExprKind, FnDecl, FnRetTy, GeneratorKind, GenericArg, GenericBound,
|
AsyncGeneratorKind, Block, Body, Closure, Expr, ExprKind, FnDecl, FnRetTy, GeneratorKind, GenericArg, GenericBound,
|
||||||
HirId, IsAsync, ItemKind, LifetimeName, Term, TraitRef, Ty, TyKind, TypeBindingKind,
|
HirId, ItemKind, LifetimeName, Term, TraitRef, Ty, TyKind, TypeBindingKind,
|
||||||
};
|
};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||||
|
@ -49,7 +49,7 @@ impl<'tcx> LateLintPass<'tcx> for ManualAsyncFn {
|
||||||
) {
|
) {
|
||||||
if_chain! {
|
if_chain! {
|
||||||
if let Some(header) = kind.header();
|
if let Some(header) = kind.header();
|
||||||
if header.asyncness == IsAsync::NotAsync;
|
if !header.asyncness.is_async();
|
||||||
// Check that this function returns `impl Future`
|
// Check that this function returns `impl Future`
|
||||||
if let FnRetTy::Return(ret_ty) = decl.output;
|
if let FnRetTy::Return(ret_ty) = decl.output;
|
||||||
if let Some((trait_ref, output_lifetimes)) = future_trait_ref(cx, ret_ty);
|
if let Some((trait_ref, output_lifetimes)) = future_trait_ref(cx, ret_ty);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use clippy_utils::diagnostics::span_lint_and_help;
|
use clippy_utils::diagnostics::span_lint_and_help;
|
||||||
use rustc_hir::intravisit::{walk_expr, walk_fn, FnKind, Visitor};
|
use rustc_hir::intravisit::{walk_expr, walk_fn, FnKind, Visitor};
|
||||||
use rustc_hir::{Body, Expr, ExprKind, FnDecl, HirId, IsAsync, YieldSource};
|
use rustc_hir::{Body, Expr, ExprKind, FnDecl, HirId, YieldSource};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_middle::hir::nested_filter;
|
use rustc_middle::hir::nested_filter;
|
||||||
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
use rustc_session::{declare_lint_pass, declare_tool_lint};
|
||||||
|
@ -68,7 +68,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedAsync {
|
||||||
span: Span,
|
span: Span,
|
||||||
hir_id: HirId,
|
hir_id: HirId,
|
||||||
) {
|
) {
|
||||||
if !span.from_expansion() && fn_kind.asyncness() == IsAsync::Async {
|
if !span.from_expansion() && fn_kind.asyncness().is_async() {
|
||||||
let mut visitor = AsyncFnVisitor { cx, found_await: false };
|
let mut visitor = AsyncFnVisitor { cx, found_await: false };
|
||||||
walk_fn(&mut visitor, fn_kind, fn_decl, body.id(), hir_id);
|
walk_fn(&mut visitor, fn_kind, fn_decl, body.id(), hir_id);
|
||||||
if !visitor.found_await {
|
if !visitor.found_await {
|
||||||
|
|
|
@ -87,10 +87,10 @@ use rustc_hir::hir_id::{HirIdMap, HirIdSet};
|
||||||
use rustc_hir::intravisit::{walk_expr, FnKind, Visitor};
|
use rustc_hir::intravisit::{walk_expr, FnKind, Visitor};
|
||||||
use rustc_hir::LangItem::{OptionNone, ResultErr, ResultOk};
|
use rustc_hir::LangItem::{OptionNone, ResultErr, ResultOk};
|
||||||
use rustc_hir::{
|
use rustc_hir::{
|
||||||
def, Arm, ArrayLen, BindingAnnotation, Block, BlockCheckMode, Body, Closure, Constness, Destination, Expr,
|
def, Arm, ArrayLen, BindingAnnotation, Block, BlockCheckMode, Body, Closure, Constness,
|
||||||
ExprKind, FnDecl, HirId, Impl, ImplItem, ImplItemKind, IsAsync, Item, ItemKind, LangItem, Local, MatchSource,
|
Destination, Expr, ExprKind, FnDecl, HirId, Impl, ImplItem, ImplItemKind, Item, ItemKind,
|
||||||
Mutability, Node, Param, Pat, PatKind, Path, PathSegment, PrimTy, QPath, Stmt, StmtKind, TraitItem, TraitItemKind,
|
LangItem, Local, MatchSource, Mutability, Node, Param, Pat, PatKind, Path, PathSegment, PrimTy,
|
||||||
TraitRef, TyKind, UnOp,
|
QPath, Stmt, StmtKind, TraitItem, TraitItemKind, TraitRef, TyKind, UnOp,
|
||||||
};
|
};
|
||||||
use rustc_lexer::{tokenize, TokenKind};
|
use rustc_lexer::{tokenize, TokenKind};
|
||||||
use rustc_lint::{LateContext, Level, Lint, LintContext};
|
use rustc_lint::{LateContext, Level, Lint, LintContext};
|
||||||
|
@ -1861,7 +1861,7 @@ pub fn if_sequence<'tcx>(mut expr: &'tcx Expr<'tcx>) -> (Vec<&'tcx Expr<'tcx>>,
|
||||||
|
|
||||||
/// Checks if the given function kind is an async function.
|
/// Checks if the given function kind is an async function.
|
||||||
pub fn is_async_fn(kind: FnKind<'_>) -> bool {
|
pub fn is_async_fn(kind: FnKind<'_>) -> bool {
|
||||||
matches!(kind, FnKind::ItemFn(_, _, header) if header.asyncness == IsAsync::Async)
|
matches!(kind, FnKind::ItemFn(_, _, header) if header.asyncness.is_async())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Peels away all the compiler generated code surrounding the body of an async function,
|
/// Peels away all the compiler generated code surrounding the body of an async function,
|
||||||
|
|
|
@ -230,6 +230,9 @@ pub struct Config {
|
||||||
/// The directory where programs should be built
|
/// The directory where programs should be built
|
||||||
pub build_base: PathBuf,
|
pub build_base: PathBuf,
|
||||||
|
|
||||||
|
/// The directory containing the compiler sysroot
|
||||||
|
pub sysroot_base: PathBuf,
|
||||||
|
|
||||||
/// The name of the stage being built (stage1, etc)
|
/// The name of the stage being built (stage1, etc)
|
||||||
pub stage_id: String,
|
pub stage_id: String,
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ fn config() -> Config {
|
||||||
"--jsondocck-path=",
|
"--jsondocck-path=",
|
||||||
"--src-base=",
|
"--src-base=",
|
||||||
"--build-base=",
|
"--build-base=",
|
||||||
|
"--sysroot-base=",
|
||||||
"--stage-id=stage2",
|
"--stage-id=stage2",
|
||||||
"--cc=c",
|
"--cc=c",
|
||||||
"--cxx=c++",
|
"--cxx=c++",
|
||||||
|
|
|
@ -69,6 +69,7 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
||||||
.optopt("", "llvm-filecheck", "path to LLVM's FileCheck binary", "DIR")
|
.optopt("", "llvm-filecheck", "path to LLVM's FileCheck binary", "DIR")
|
||||||
.reqopt("", "src-base", "directory to scan for test files", "PATH")
|
.reqopt("", "src-base", "directory to scan for test files", "PATH")
|
||||||
.reqopt("", "build-base", "directory to deposit test outputs", "PATH")
|
.reqopt("", "build-base", "directory to deposit test outputs", "PATH")
|
||||||
|
.reqopt("", "sysroot-base", "directory containing the compiler sysroot", "PATH")
|
||||||
.reqopt("", "stage-id", "the target-stage identifier", "stageN-TARGET")
|
.reqopt("", "stage-id", "the target-stage identifier", "stageN-TARGET")
|
||||||
.reqopt(
|
.reqopt(
|
||||||
"",
|
"",
|
||||||
|
@ -234,6 +235,7 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
||||||
llvm_bin_dir: matches.opt_str("llvm-bin-dir").map(PathBuf::from),
|
llvm_bin_dir: matches.opt_str("llvm-bin-dir").map(PathBuf::from),
|
||||||
src_base,
|
src_base,
|
||||||
build_base: opt_path(matches, "build-base"),
|
build_base: opt_path(matches, "build-base"),
|
||||||
|
sysroot_base: opt_path(matches, "sysroot-base"),
|
||||||
stage_id: matches.opt_str("stage-id").unwrap(),
|
stage_id: matches.opt_str("stage-id").unwrap(),
|
||||||
mode,
|
mode,
|
||||||
suite: matches.opt_str("suite").unwrap(),
|
suite: matches.opt_str("suite").unwrap(),
|
||||||
|
|
|
@ -3533,22 +3533,25 @@ impl<'test> TestCx<'test> {
|
||||||
let parent_dir = self.testpaths.file.parent().unwrap();
|
let parent_dir = self.testpaths.file.parent().unwrap();
|
||||||
normalize_path(parent_dir, "$DIR");
|
normalize_path(parent_dir, "$DIR");
|
||||||
|
|
||||||
// Paths into the libstd/libcore
|
let source_bases = &[
|
||||||
let base_dir = self.config.src_base.parent().unwrap().parent().unwrap().parent().unwrap();
|
// Source base on the current filesystem (calculated as parent of `src/test/$suite`):
|
||||||
let src_dir = base_dir.join("library");
|
Some(self.config.src_base.parent().unwrap().parent().unwrap().parent().unwrap().into()),
|
||||||
normalize_path(&src_dir, "$SRC_DIR");
|
// Source base on the sysroot (from the src components downloaded by `download-rustc`):
|
||||||
|
Some(self.config.sysroot_base.join("lib").join("rustlib").join("src").join("rust")),
|
||||||
// `ui-fulldeps` tests can show paths to the compiler source when testing macros from
|
// Virtual `/rustc/$sha` remapped paths (if `remap-debuginfo` is enabled):
|
||||||
// `rustc_macros`
|
option_env!("CFG_VIRTUAL_RUST_SOURCE_BASE_DIR").map(PathBuf::from),
|
||||||
// eg. /home/user/rust/compiler
|
// Virtual `/rustc/$sha` coming from download-rustc:
|
||||||
let compiler_src_dir = base_dir.join("compiler");
|
std::env::var_os("FAKE_DOWNLOAD_RUSTC_PREFIX").map(PathBuf::from),
|
||||||
normalize_path(&compiler_src_dir, "$COMPILER_DIR");
|
];
|
||||||
|
for base_dir in source_bases {
|
||||||
if let Some(virtual_rust_source_base_dir) =
|
if let Some(base_dir) = base_dir {
|
||||||
option_env!("CFG_VIRTUAL_RUST_SOURCE_BASE_DIR").map(PathBuf::from)
|
// Paths into the libstd/libcore
|
||||||
{
|
normalize_path(&base_dir.join("library"), "$SRC_DIR");
|
||||||
normalize_path(&virtual_rust_source_base_dir.join("library"), "$SRC_DIR");
|
// `ui-fulldeps` tests can show paths to the compiler source when testing macros from
|
||||||
normalize_path(&virtual_rust_source_base_dir.join("compiler"), "$COMPILER_DIR");
|
// `rustc_macros`
|
||||||
|
// eg. /home/user/rust/compiler
|
||||||
|
normalize_path(&base_dir.join("compiler"), "$COMPILER_DIR");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Paths into the build directory
|
// Paths into the build directory
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue