mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Auto merge of #134096 - fmease:rollup-0asgoo8, r=fmease
Rollup of 9 pull requests Successful merges: - #133996 (Move most tests for `-l` and `#[link(..)]` into `tests/ui/link-native-libs`) - #134012 (Grammar fixes) - #134032 (docs: better examples for `std::ops::ControlFlow`) - #134040 (bootstrap: print{ln}! -> eprint{ln}! (take 2)) - #134043 (Add test to check unicode identifier version) - #134053 (rustdoc: rename `issue-\d+.rs` tests to have meaningful names (part 10)) - #134055 (interpret: clean up deduplicating allocation functions) - #134073 (dataflow_const_prop: do not eval a ptr address in SwitchInt) - #134084 (Fix typo in RFC mention 3598 -> 3593) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
ff7906bfe1
@ -21,7 +21,7 @@ standard library, and documentation.
|
||||
|
||||
## Why Rust?
|
||||
|
||||
- **Performance:** Fast and memory-efficient, suitable for critical services, embedded devices, and easily integrate with other languages.
|
||||
- **Performance:** Fast and memory-efficient, suitable for critical services, embedded devices, and easily integrated with other languages.
|
||||
|
||||
- **Reliability:** Our rich type system and ownership model ensure memory and thread safety, reducing bugs at compile-time.
|
||||
|
||||
|
@ -5,8 +5,7 @@
|
||||
use std::assert_matches::assert_matches;
|
||||
|
||||
use either::{Either, Left, Right};
|
||||
use rustc_abi::{Align, BackendRepr, HasDataLayout, Size};
|
||||
use rustc_ast::Mutability;
|
||||
use rustc_abi::{BackendRepr, HasDataLayout, Size};
|
||||
use rustc_middle::ty::Ty;
|
||||
use rustc_middle::ty::layout::{LayoutOf, TyAndLayout};
|
||||
use rustc_middle::{bug, mir, span_bug};
|
||||
@ -1018,40 +1017,31 @@ where
|
||||
self.allocate_dyn(layout, kind, MemPlaceMeta::None)
|
||||
}
|
||||
|
||||
/// Allocates a sequence of bytes in the interpreter's memory.
|
||||
/// For immutable allocations, uses deduplication to reuse existing memory.
|
||||
/// For mutable allocations, creates a new unique allocation.
|
||||
pub fn allocate_bytes(
|
||||
/// Allocates a sequence of bytes in the interpreter's memory with alignment 1.
|
||||
/// This is allocated in immutable global memory and deduplicated.
|
||||
pub fn allocate_bytes_dedup(
|
||||
&mut self,
|
||||
bytes: &[u8],
|
||||
align: Align,
|
||||
kind: MemoryKind<M::MemoryKind>,
|
||||
mutbl: Mutability,
|
||||
) -> InterpResult<'tcx, Pointer<M::Provenance>> {
|
||||
// Use cache for immutable strings.
|
||||
if mutbl.is_not() {
|
||||
// Use dedup'd allocation function.
|
||||
let salt = M::get_global_alloc_salt(self, None);
|
||||
let id = self.tcx.allocate_bytes_dedup(bytes, salt);
|
||||
let salt = M::get_global_alloc_salt(self, None);
|
||||
let id = self.tcx.allocate_bytes_dedup(bytes, salt);
|
||||
|
||||
// Turn untagged "global" pointers (obtained via `tcx`) into the machine pointer to the allocation.
|
||||
M::adjust_alloc_root_pointer(&self, Pointer::from(id), Some(kind))
|
||||
} else {
|
||||
// Allocate new memory for mutable data.
|
||||
self.allocate_bytes_ptr(bytes, align, kind, mutbl)
|
||||
}
|
||||
// Turn untagged "global" pointers (obtained via `tcx`) into the machine pointer to the allocation.
|
||||
M::adjust_alloc_root_pointer(
|
||||
&self,
|
||||
Pointer::from(id),
|
||||
M::GLOBAL_KIND.map(MemoryKind::Machine),
|
||||
)
|
||||
}
|
||||
|
||||
/// Allocates a string in the interpreter's memory with metadata for length.
|
||||
/// Uses `allocate_bytes` internally but adds string-specific metadata handling.
|
||||
pub fn allocate_str(
|
||||
/// Allocates a string in the interpreter's memory, returning it as a (wide) place.
|
||||
/// This is allocated in immutable global memory and deduplicated.
|
||||
pub fn allocate_str_dedup(
|
||||
&mut self,
|
||||
str: &str,
|
||||
kind: MemoryKind<M::MemoryKind>,
|
||||
mutbl: Mutability,
|
||||
) -> InterpResult<'tcx, MPlaceTy<'tcx, M::Provenance>> {
|
||||
let bytes = str.as_bytes();
|
||||
let ptr = self.allocate_bytes(bytes, Align::ONE, kind, mutbl)?;
|
||||
let ptr = self.allocate_bytes_dedup(bytes)?;
|
||||
|
||||
// Create length metadata for the string.
|
||||
let meta = Scalar::from_target_usize(u64::try_from(bytes.len()).unwrap(), self);
|
||||
|
@ -1,7 +1,7 @@
|
||||
use rustc_hir::LangItem;
|
||||
use rustc_middle::query::TyCtxtAt;
|
||||
use rustc_middle::ty::layout::LayoutOf;
|
||||
use rustc_middle::ty::{self, Mutability};
|
||||
use rustc_middle::ty::{self};
|
||||
use rustc_middle::{bug, mir};
|
||||
use rustc_span::symbol::Symbol;
|
||||
use tracing::trace;
|
||||
@ -20,12 +20,9 @@ fn alloc_caller_location<'tcx>(
|
||||
// This can fail if rustc runs out of memory right here. Trying to emit an error would be
|
||||
// pointless, since that would require allocating more memory than these short strings.
|
||||
let file = if loc_details.file {
|
||||
ecx.allocate_str(filename.as_str(), MemoryKind::CallerLocation, Mutability::Not).unwrap()
|
||||
ecx.allocate_str_dedup(filename.as_str()).unwrap()
|
||||
} else {
|
||||
// FIXME: This creates a new allocation each time. It might be preferable to
|
||||
// perform this allocation only once, and re-use the `MPlaceTy`.
|
||||
// See https://github.com/rust-lang/rust/pull/89920#discussion_r730012398
|
||||
ecx.allocate_str("<redacted>", MemoryKind::CallerLocation, Mutability::Not).unwrap()
|
||||
ecx.allocate_str_dedup("<redacted>").unwrap()
|
||||
};
|
||||
let file = file.map_provenance(CtfeProvenance::as_immutable);
|
||||
let line = if loc_details.line { Scalar::from_u32(line) } else { Scalar::from_u32(0) };
|
||||
|
@ -33,6 +33,7 @@ pub mod unescape;
|
||||
mod tests;
|
||||
|
||||
use unicode_properties::UnicodeEmoji;
|
||||
pub use unicode_xid::UNICODE_VERSION as UNICODE_XID_VERSION;
|
||||
|
||||
use self::LiteralKind::*;
|
||||
use self::TokenKind::*;
|
||||
|
@ -1479,7 +1479,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
self.mk_adt_def_from_data(ty::AdtDefData::new(self, did, kind, variants, repr))
|
||||
}
|
||||
|
||||
/// Allocates a read-only byte or string literal for `mir::interpret`.
|
||||
/// Allocates a read-only byte or string literal for `mir::interpret` with alignment 1.
|
||||
/// Returns the same `AllocId` if called again with the same bytes.
|
||||
pub fn allocate_bytes_dedup(self, bytes: &[u8], salt: usize) -> interpret::AllocId {
|
||||
// Create an allocation that just contains these bytes.
|
||||
|
@ -534,8 +534,13 @@ impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> {
|
||||
// This allows the set of visited edges to grow monotonically with the lattice.
|
||||
FlatSet::Bottom => TerminatorEdges::None,
|
||||
FlatSet::Elem(scalar) => {
|
||||
let choice = scalar.assert_scalar_int().to_bits_unchecked();
|
||||
TerminatorEdges::Single(targets.target_for_value(choice))
|
||||
if let Ok(scalar_int) = scalar.try_to_scalar_int() {
|
||||
TerminatorEdges::Single(
|
||||
targets.target_for_value(scalar_int.to_bits_unchecked()),
|
||||
)
|
||||
} else {
|
||||
TerminatorEdges::SwitchInt { discr, targets }
|
||||
}
|
||||
}
|
||||
FlatSet::Top => TerminatorEdges::SwitchInt { discr, targets },
|
||||
}
|
||||
|
@ -822,7 +822,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
|
||||
|
||||
/// Detect guarded string literal syntax
|
||||
///
|
||||
/// RFC 3598 reserved this syntax for future use. As of Rust 2024,
|
||||
/// RFC 3593 reserved this syntax for future use. As of Rust 2024,
|
||||
/// using this syntax produces an error. In earlier editions, however, it
|
||||
/// only results in an (allowed by default) lint, and is treated as
|
||||
/// separate tokens.
|
||||
|
@ -24,6 +24,7 @@ use rustc_data_structures::sync::Lrc;
|
||||
use rustc_errors::{Diag, FatalError, PResult};
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::{FileName, SourceFile, Span};
|
||||
pub use unicode_normalization::UNICODE_VERSION as UNICODE_NORMALIZATION_VERSION;
|
||||
|
||||
pub const MACRO_ARGUMENTS: Option<&str> = Some("macro arguments");
|
||||
|
||||
|
@ -141,8 +141,8 @@ impl<B, C> ControlFlow<B, C> {
|
||||
/// ```
|
||||
/// use std::ops::ControlFlow;
|
||||
///
|
||||
/// assert!(ControlFlow::<i32, String>::Break(3).is_break());
|
||||
/// assert!(!ControlFlow::<String, i32>::Continue(3).is_break());
|
||||
/// assert!(ControlFlow::<&str, i32>::Break("Stop right there!").is_break());
|
||||
/// assert!(!ControlFlow::<&str, i32>::Continue(3).is_break());
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "control_flow_enum_is", since = "1.59.0")]
|
||||
@ -157,8 +157,8 @@ impl<B, C> ControlFlow<B, C> {
|
||||
/// ```
|
||||
/// use std::ops::ControlFlow;
|
||||
///
|
||||
/// assert!(!ControlFlow::<i32, String>::Break(3).is_continue());
|
||||
/// assert!(ControlFlow::<String, i32>::Continue(3).is_continue());
|
||||
/// assert!(!ControlFlow::<&str, i32>::Break("Stop right there!").is_continue());
|
||||
/// assert!(ControlFlow::<&str, i32>::Continue(3).is_continue());
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "control_flow_enum_is", since = "1.59.0")]
|
||||
@ -174,8 +174,8 @@ impl<B, C> ControlFlow<B, C> {
|
||||
/// ```
|
||||
/// use std::ops::ControlFlow;
|
||||
///
|
||||
/// assert_eq!(ControlFlow::<i32, String>::Break(3).break_value(), Some(3));
|
||||
/// assert_eq!(ControlFlow::<String, i32>::Continue(3).break_value(), None);
|
||||
/// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").break_value(), Some("Stop right there!"));
|
||||
/// assert_eq!(ControlFlow::<&str, i32>::Continue(3).break_value(), None);
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "control_flow_enum", since = "1.83.0")]
|
||||
@ -205,8 +205,8 @@ impl<B, C> ControlFlow<B, C> {
|
||||
/// ```
|
||||
/// use std::ops::ControlFlow;
|
||||
///
|
||||
/// assert_eq!(ControlFlow::<i32, String>::Break(3).continue_value(), None);
|
||||
/// assert_eq!(ControlFlow::<String, i32>::Continue(3).continue_value(), Some(3));
|
||||
/// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").continue_value(), None);
|
||||
/// assert_eq!(ControlFlow::<&str, i32>::Continue(3).continue_value(), Some(3));
|
||||
/// ```
|
||||
#[inline]
|
||||
#[stable(feature = "control_flow_enum", since = "1.83.0")]
|
||||
|
@ -48,9 +48,9 @@ fn main() {
|
||||
err => {
|
||||
drop(err);
|
||||
if let Ok(pid) = pid {
|
||||
println!("WARNING: build directory locked by process {pid}, waiting for lock");
|
||||
eprintln!("WARNING: build directory locked by process {pid}, waiting for lock");
|
||||
} else {
|
||||
println!("WARNING: build directory locked, waiting for lock");
|
||||
eprintln!("WARNING: build directory locked, waiting for lock");
|
||||
}
|
||||
let mut lock = t!(build_lock.write());
|
||||
t!(lock.write(process::id().to_string().as_ref()));
|
||||
@ -70,13 +70,13 @@ fn main() {
|
||||
// changelog warning, not the `x.py setup` message.
|
||||
let suggest_setup = config.config.is_none() && !matches!(config.cmd, Subcommand::Setup { .. });
|
||||
if suggest_setup {
|
||||
println!("WARNING: you have not made a `config.toml`");
|
||||
println!(
|
||||
eprintln!("WARNING: you have not made a `config.toml`");
|
||||
eprintln!(
|
||||
"HELP: consider running `./x.py setup` or copying `config.example.toml` by running \
|
||||
`cp config.example.toml config.toml`"
|
||||
);
|
||||
} else if let Some(suggestion) = &changelog_suggestion {
|
||||
println!("{suggestion}");
|
||||
eprintln!("{suggestion}");
|
||||
}
|
||||
|
||||
let pre_commit = config.src.join(".git").join("hooks").join("pre-commit");
|
||||
@ -86,13 +86,13 @@ fn main() {
|
||||
Build::new(config).build();
|
||||
|
||||
if suggest_setup {
|
||||
println!("WARNING: you have not made a `config.toml`");
|
||||
println!(
|
||||
eprintln!("WARNING: you have not made a `config.toml`");
|
||||
eprintln!(
|
||||
"HELP: consider running `./x.py setup` or copying `config.example.toml` by running \
|
||||
`cp config.example.toml config.toml`"
|
||||
);
|
||||
} else if let Some(suggestion) = &changelog_suggestion {
|
||||
println!("{suggestion}");
|
||||
eprintln!("{suggestion}");
|
||||
}
|
||||
|
||||
// Give a warning if the pre-commit script is in pre-commit and not pre-push.
|
||||
@ -102,14 +102,14 @@ fn main() {
|
||||
if fs::read_to_string(pre_commit).is_ok_and(|contents| {
|
||||
contents.contains("https://github.com/rust-lang/rust/issues/77620#issuecomment-705144570")
|
||||
}) {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: You have the pre-push script installed to .git/hooks/pre-commit. \
|
||||
Consider moving it to .git/hooks/pre-push instead, which runs less often."
|
||||
);
|
||||
}
|
||||
|
||||
if suggest_setup || changelog_suggestion.is_some() {
|
||||
println!("NOTE: this message was printed twice to make it more likely to be seen");
|
||||
eprintln!("NOTE: this message was printed twice to make it more likely to be seen");
|
||||
}
|
||||
|
||||
if dump_bootstrap_shims {
|
||||
|
@ -306,7 +306,7 @@ fn main() {
|
||||
// should run on success, after this block.
|
||||
}
|
||||
if verbose > 0 {
|
||||
println!("\nDid not run successfully: {status}\n{cmd:?}\n-------------");
|
||||
eprintln!("\nDid not run successfully: {status}\n{cmd:?}\n-------------");
|
||||
}
|
||||
|
||||
if let Some(mut on_fail) = on_fail {
|
||||
|
@ -287,7 +287,7 @@ impl Step for CodegenBackend {
|
||||
fn run(self, builder: &Builder<'_>) {
|
||||
// FIXME: remove once https://github.com/rust-lang/rust/issues/112393 is resolved
|
||||
if builder.build.config.vendor && self.backend == "gcc" {
|
||||
println!("Skipping checking of `rustc_codegen_gcc` with vendoring enabled.");
|
||||
eprintln!("Skipping checking of `rustc_codegen_gcc` with vendoring enabled.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1611,7 +1611,7 @@ impl Step for Sysroot {
|
||||
let sysroot = sysroot_dir(compiler.stage);
|
||||
|
||||
builder
|
||||
.verbose(|| println!("Removing sysroot {} to avoid caching bugs", sysroot.display()));
|
||||
.verbose(|| eprintln!("Removing sysroot {} to avoid caching bugs", sysroot.display()));
|
||||
let _ = fs::remove_dir_all(&sysroot);
|
||||
t!(fs::create_dir_all(&sysroot));
|
||||
|
||||
@ -1681,7 +1681,7 @@ impl Step for Sysroot {
|
||||
return true;
|
||||
}
|
||||
if !filtered_files.iter().all(|f| f != path.file_name().unwrap()) {
|
||||
builder.verbose_than(1, || println!("ignoring {}", path.display()));
|
||||
builder.verbose_than(1, || eprintln!("ignoring {}", path.display()));
|
||||
false
|
||||
} else {
|
||||
true
|
||||
@ -2240,7 +2240,7 @@ pub fn stream_cargo(
|
||||
cargo.arg(arg);
|
||||
}
|
||||
|
||||
builder.verbose(|| println!("running: {cargo:?}"));
|
||||
builder.verbose(|| eprintln!("running: {cargo:?}"));
|
||||
|
||||
if builder.config.dry_run() {
|
||||
return true;
|
||||
@ -2261,12 +2261,12 @@ pub fn stream_cargo(
|
||||
Ok(msg) => {
|
||||
if builder.config.json_output {
|
||||
// Forward JSON to stdout.
|
||||
println!("{line}");
|
||||
eprintln!("{line}");
|
||||
}
|
||||
cb(msg)
|
||||
}
|
||||
// If this was informational, just print it out and continue
|
||||
Err(_) => println!("{line}"),
|
||||
Err(_) => eprintln!("{line}"),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2080,7 +2080,7 @@ fn maybe_install_llvm(
|
||||
{
|
||||
let mut cmd = command(llvm_config);
|
||||
cmd.arg("--libfiles");
|
||||
builder.verbose(|| println!("running {cmd:?}"));
|
||||
builder.verbose(|| eprintln!("running {cmd:?}"));
|
||||
let files = cmd.run_capture_stdout(builder).stdout();
|
||||
let build_llvm_out = &builder.llvm_out(builder.config.build);
|
||||
let target_llvm_out = &builder.llvm_out(target);
|
||||
|
@ -107,10 +107,10 @@ fn print_paths(verb: &str, adjective: Option<&str>, paths: &[String]) {
|
||||
if let Some(adjective) = adjective { format!("{adjective} ") } else { String::new() };
|
||||
if len <= 10 {
|
||||
for path in paths {
|
||||
println!("fmt: {verb} {adjective}file {path}");
|
||||
eprintln!("fmt: {verb} {adjective}file {path}");
|
||||
}
|
||||
} else {
|
||||
println!("fmt: {verb} {len} {adjective}files");
|
||||
eprintln!("fmt: {verb} {len} {adjective}files");
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,7 +199,7 @@ pub fn format(build: &Builder<'_>, check: bool, all: bool, paths: &[PathBuf]) {
|
||||
match get_modified_rs_files(build) {
|
||||
Ok(Some(files)) => {
|
||||
if files.is_empty() {
|
||||
println!("fmt info: No modified files detected for formatting.");
|
||||
eprintln!("fmt info: No modified files detected for formatting.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -134,7 +134,7 @@ impl Step for Profile {
|
||||
t!(fs::remove_file(path));
|
||||
}
|
||||
_ => {
|
||||
println!("Exiting.");
|
||||
eprintln!("Exiting.");
|
||||
crate::exit!(1);
|
||||
}
|
||||
}
|
||||
@ -184,15 +184,15 @@ pub fn setup(config: &Config, profile: Profile) {
|
||||
Profile::Dist => &["dist", "build"],
|
||||
};
|
||||
|
||||
println!();
|
||||
eprintln!();
|
||||
|
||||
println!("To get started, try one of the following commands:");
|
||||
eprintln!("To get started, try one of the following commands:");
|
||||
for cmd in suggestions {
|
||||
println!("- `x.py {cmd}`");
|
||||
eprintln!("- `x.py {cmd}`");
|
||||
}
|
||||
|
||||
if profile != Profile::Dist {
|
||||
println!(
|
||||
eprintln!(
|
||||
"For more suggestions, see https://rustc-dev-guide.rust-lang.org/building/suggested.html"
|
||||
);
|
||||
}
|
||||
@ -224,7 +224,7 @@ fn setup_config_toml(path: &PathBuf, profile: Profile, config: &Config) {
|
||||
t!(fs::write(path, settings));
|
||||
|
||||
let include_path = profile.include_path(&config.src);
|
||||
println!("`x.py` will now use the configuration at {}", include_path.display());
|
||||
eprintln!("`x.py` will now use the configuration at {}", include_path.display());
|
||||
}
|
||||
|
||||
/// Creates a toolchain link for stage1 using `rustup`
|
||||
@ -256,7 +256,7 @@ impl Step for Link {
|
||||
}
|
||||
|
||||
if !rustup_installed(builder) {
|
||||
println!("WARNING: `rustup` is not installed; Skipping `stage1` toolchain linking.");
|
||||
eprintln!("WARNING: `rustup` is not installed; Skipping `stage1` toolchain linking.");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -296,7 +296,7 @@ fn attempt_toolchain_link(builder: &Builder<'_>, stage_path: &str) {
|
||||
}
|
||||
|
||||
if try_link_toolchain(builder, stage_path) {
|
||||
println!(
|
||||
eprintln!(
|
||||
"Added `stage1` rustup toolchain; try `cargo +stage1 build` on a separate rust project to run a newly-built toolchain"
|
||||
);
|
||||
} else {
|
||||
@ -321,14 +321,14 @@ fn toolchain_is_linked(builder: &Builder<'_>) -> bool {
|
||||
return false;
|
||||
}
|
||||
// The toolchain has already been linked.
|
||||
println!(
|
||||
eprintln!(
|
||||
"`stage1` toolchain already linked; not attempting to link `stage1` toolchain"
|
||||
);
|
||||
}
|
||||
None => {
|
||||
// In this case, we don't know if the `stage1` toolchain has been linked;
|
||||
// but `rustup` failed, so let's not go any further.
|
||||
println!(
|
||||
eprintln!(
|
||||
"`rustup` failed to list current toolchains; not attempting to link `stage1` toolchain"
|
||||
);
|
||||
}
|
||||
@ -389,12 +389,12 @@ pub fn interactive_path() -> io::Result<Profile> {
|
||||
input.parse()
|
||||
}
|
||||
|
||||
println!("Welcome to the Rust project! What do you want to do with x.py?");
|
||||
eprintln!("Welcome to the Rust project! What do you want to do with x.py?");
|
||||
for ((letter, _), profile) in abbrev_all() {
|
||||
println!("{}) {}: {}", letter, profile, profile.purpose());
|
||||
eprintln!("{}) {}: {}", letter, profile, profile.purpose());
|
||||
}
|
||||
let template = loop {
|
||||
print!(
|
||||
eprint!(
|
||||
"Please choose one ({}): ",
|
||||
abbrev_all().map(|((l, _), _)| l).collect::<Vec<_>>().join("/")
|
||||
);
|
||||
@ -428,7 +428,7 @@ enum PromptResult {
|
||||
fn prompt_user(prompt: &str) -> io::Result<Option<PromptResult>> {
|
||||
let mut input = String::new();
|
||||
loop {
|
||||
print!("{prompt} ");
|
||||
eprint!("{prompt} ");
|
||||
io::stdout().flush()?;
|
||||
input.clear();
|
||||
io::stdin().read_line(&mut input)?;
|
||||
@ -490,7 +490,7 @@ fn install_git_hook_maybe(builder: &Builder<'_>, config: &Config) -> io::Result<
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
println!(
|
||||
eprintln!(
|
||||
"\nRust's CI will automatically fail if it doesn't pass `tidy`, the internal tool for ensuring code quality.
|
||||
If you'd like, x.py can install a git hook for you that will automatically run `test tidy` before
|
||||
pushing your code to ensure your code is up to par. If you decide later that this behavior is
|
||||
@ -498,7 +498,7 @@ undesirable, simply delete the `pre-push` file from .git/hooks."
|
||||
);
|
||||
|
||||
if prompt_user("Would you like to install the git hook?: [y/N]")? != Some(PromptResult::Yes) {
|
||||
println!("Ok, skipping installation!");
|
||||
eprintln!("Ok, skipping installation!");
|
||||
return Ok(());
|
||||
}
|
||||
if !hooks_dir.exists() {
|
||||
@ -515,7 +515,7 @@ undesirable, simply delete the `pre-push` file from .git/hooks."
|
||||
);
|
||||
return Err(e);
|
||||
}
|
||||
Ok(_) => println!("Linked `src/etc/pre-push.sh` to `.git/hooks/pre-push`"),
|
||||
Ok(_) => eprintln!("Linked `src/etc/pre-push.sh` to `.git/hooks/pre-push`"),
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
@ -541,7 +541,7 @@ Select which editor you would like to set up [default: None]: ";
|
||||
|
||||
let mut input = String::new();
|
||||
loop {
|
||||
print!("{}", prompt_str);
|
||||
eprint!("{}", prompt_str);
|
||||
io::stdout().flush()?;
|
||||
input.clear();
|
||||
io::stdin().read_line(&mut input)?;
|
||||
@ -656,7 +656,7 @@ impl Step for Editor {
|
||||
if let Some(editor_kind) = editor_kind {
|
||||
while !t!(create_editor_settings_maybe(config, editor_kind.clone())) {}
|
||||
} else {
|
||||
println!("Ok, skipping editor setup!");
|
||||
eprintln!("Ok, skipping editor setup!");
|
||||
}
|
||||
}
|
||||
Err(e) => eprintln!("Could not determine the editor: {e}"),
|
||||
@ -689,7 +689,7 @@ fn create_editor_settings_maybe(config: &Config, editor: EditorKind) -> io::Resu
|
||||
mismatched_settings = Some(false);
|
||||
}
|
||||
}
|
||||
println!(
|
||||
eprintln!(
|
||||
"\nx.py can automatically install the recommended `{settings_filename}` file for rustc development"
|
||||
);
|
||||
|
||||
@ -708,7 +708,7 @@ fn create_editor_settings_maybe(config: &Config, editor: EditorKind) -> io::Resu
|
||||
Some(PromptResult::Yes) => true,
|
||||
Some(PromptResult::Print) => false,
|
||||
_ => {
|
||||
println!("Ok, skipping settings!");
|
||||
eprintln!("Ok, skipping settings!");
|
||||
return Ok(true);
|
||||
}
|
||||
};
|
||||
@ -735,9 +735,9 @@ fn create_editor_settings_maybe(config: &Config, editor: EditorKind) -> io::Resu
|
||||
_ => "Created",
|
||||
};
|
||||
fs::write(&settings_path, editor.settings_template())?;
|
||||
println!("{verb} `{}`", settings_filename);
|
||||
eprintln!("{verb} `{}`", settings_filename);
|
||||
} else {
|
||||
println!("\n{}", editor.settings_template());
|
||||
eprintln!("\n{}", editor.settings_template());
|
||||
}
|
||||
Ok(should_create)
|
||||
}
|
||||
|
@ -66,6 +66,6 @@ pub fn suggest(builder: &Builder<'_>, run: bool) {
|
||||
build.build();
|
||||
}
|
||||
} else {
|
||||
println!("HELP: consider using the `--run` flag to automatically run suggested tests");
|
||||
eprintln!("HELP: consider using the `--run` flag to automatically run suggested tests");
|
||||
}
|
||||
}
|
||||
|
@ -471,11 +471,11 @@ impl Miri {
|
||||
// We re-use the `cargo` from above.
|
||||
cargo.arg("--print-sysroot");
|
||||
|
||||
builder.verbose(|| println!("running: {cargo:?}"));
|
||||
builder.verbose(|| eprintln!("running: {cargo:?}"));
|
||||
let stdout = cargo.run_capture_stdout(builder).stdout();
|
||||
// Output is "<sysroot>\n".
|
||||
let sysroot = stdout.trim_end();
|
||||
builder.verbose(|| println!("`cargo miri setup --print-sysroot` said: {sysroot:?}"));
|
||||
builder.verbose(|| eprintln!("`cargo miri setup --print-sysroot` said: {sysroot:?}"));
|
||||
PathBuf::from(sysroot)
|
||||
}
|
||||
}
|
||||
@ -2488,7 +2488,7 @@ fn markdown_test(builder: &Builder<'_>, compiler: Compiler, markdown: &Path) ->
|
||||
}
|
||||
}
|
||||
|
||||
builder.verbose(|| println!("doc tests for: {}", markdown.display()));
|
||||
builder.verbose(|| eprintln!("doc tests for: {}", markdown.display()));
|
||||
let mut cmd = builder.rustdoc_cmd(compiler);
|
||||
builder.add_rust_test_threads(&mut cmd);
|
||||
// allow for unstable options such as new editions
|
||||
|
@ -523,7 +523,7 @@ impl Builder<'_> {
|
||||
|
||||
let sysroot_str = sysroot.as_os_str().to_str().expect("sysroot should be UTF-8");
|
||||
if self.is_verbose() && !matches!(self.config.dry_run, DryRun::SelfCheck) {
|
||||
println!("using sysroot {sysroot_str}");
|
||||
eprintln!("using sysroot {sysroot_str}");
|
||||
}
|
||||
|
||||
let mut rustflags = Rustflags::new(target);
|
||||
|
@ -392,14 +392,14 @@ impl StepDescription {
|
||||
fn is_excluded(&self, builder: &Builder<'_>, pathset: &PathSet) -> bool {
|
||||
if builder.config.skip.iter().any(|e| pathset.has(e, builder.kind)) {
|
||||
if !matches!(builder.config.dry_run, DryRun::SelfCheck) {
|
||||
println!("Skipping {pathset:?} because it is excluded");
|
||||
eprintln!("Skipping {pathset:?} because it is excluded");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
if !builder.config.skip.is_empty() && !matches!(builder.config.dry_run, DryRun::SelfCheck) {
|
||||
builder.verbose(|| {
|
||||
println!(
|
||||
eprintln!(
|
||||
"{:?} not skipped for {:?} -- not in {:?}",
|
||||
pathset, self.name, builder.config.skip
|
||||
)
|
||||
@ -1437,11 +1437,11 @@ impl<'a> Builder<'a> {
|
||||
panic!("{}", out);
|
||||
}
|
||||
if let Some(out) = self.cache.get(&step) {
|
||||
self.verbose_than(1, || println!("{}c {:?}", " ".repeat(stack.len()), step));
|
||||
self.verbose_than(1, || eprintln!("{}c {:?}", " ".repeat(stack.len()), step));
|
||||
|
||||
return out;
|
||||
}
|
||||
self.verbose_than(1, || println!("{}> {:?}", " ".repeat(stack.len()), step));
|
||||
self.verbose_than(1, || eprintln!("{}> {:?}", " ".repeat(stack.len()), step));
|
||||
stack.push(Box::new(step.clone()));
|
||||
}
|
||||
|
||||
@ -1462,7 +1462,7 @@ impl<'a> Builder<'a> {
|
||||
let step_string = format!("{step:?}");
|
||||
let brace_index = step_string.find('{').unwrap_or(0);
|
||||
let type_string = type_name::<S>();
|
||||
println!(
|
||||
eprintln!(
|
||||
"[TIMING] {} {} -- {}.{:03}",
|
||||
&type_string.strip_prefix("bootstrap::").unwrap_or(type_string),
|
||||
&step_string[brace_index..],
|
||||
@ -1479,7 +1479,9 @@ impl<'a> Builder<'a> {
|
||||
let cur_step = stack.pop().expect("step stack empty");
|
||||
assert_eq!(cur_step.downcast_ref(), Some(&step));
|
||||
}
|
||||
self.verbose_than(1, || println!("{}< {:?}", " ".repeat(self.stack.borrow().len()), step));
|
||||
self.verbose_than(1, || {
|
||||
eprintln!("{}< {:?}", " ".repeat(self.stack.borrow().len()), step)
|
||||
});
|
||||
self.cache.put(step, out.clone());
|
||||
out
|
||||
}
|
||||
|
@ -1293,7 +1293,7 @@ impl Config {
|
||||
.map(|change_id| change_id.inner.map(crate::find_recent_config_change_ids))
|
||||
{
|
||||
if !changes.is_empty() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: There have been changes to x.py since you last updated:\n{}",
|
||||
crate::human_readable_changes(&changes)
|
||||
);
|
||||
@ -1559,7 +1559,7 @@ impl Config {
|
||||
}
|
||||
|
||||
if cargo_clippy.is_some() && rustc.is_none() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: Using `build.cargo-clippy` without `build.rustc` usually fails due to toolchain conflict."
|
||||
);
|
||||
}
|
||||
@ -1841,7 +1841,7 @@ impl Config {
|
||||
|
||||
// FIXME: Remove this option at the end of 2024.
|
||||
if parallel_compiler.is_some() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: The `rust.parallel-compiler` option is deprecated and does nothing. The parallel compiler (with one thread) is now the default"
|
||||
);
|
||||
}
|
||||
@ -1873,7 +1873,7 @@ impl Config {
|
||||
if available_backends.contains(&backend) {
|
||||
panic!("Invalid value '{s}' for 'rust.codegen-backends'. Instead, please use '{backend}'.");
|
||||
} else {
|
||||
println!("HELP: '{s}' for 'rust.codegen-backends' might fail. \
|
||||
eprintln!("HELP: '{s}' for 'rust.codegen-backends' might fail. \
|
||||
Codegen backends are mostly defined without the '{CODEGEN_BACKEND_PREFIX}' prefix. \
|
||||
In this case, it would be referred to as '{backend}'.");
|
||||
}
|
||||
@ -1902,7 +1902,7 @@ impl Config {
|
||||
// tests may fail due to using a different channel than the one used by the compiler during tests.
|
||||
if let Some(commit) = &config.download_rustc_commit {
|
||||
if is_user_configured_rust_channel {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: `rust.download-rustc` is enabled. The `rust.channel` option will be overridden by the CI rustc's channel."
|
||||
);
|
||||
|
||||
@ -1992,10 +1992,10 @@ impl Config {
|
||||
|
||||
if config.llvm_from_ci {
|
||||
let warn = |option: &str| {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: `{option}` will only be used on `compiler/rustc_llvm` build, not for the LLVM build."
|
||||
);
|
||||
println!(
|
||||
eprintln!(
|
||||
"HELP: To use `{option}` for LLVM builds, set `download-ci-llvm` option to false."
|
||||
);
|
||||
};
|
||||
@ -2014,12 +2014,12 @@ impl Config {
|
||||
// if they've chosen a different value.
|
||||
|
||||
if libzstd.is_some() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: when using `download-ci-llvm`, the local `llvm.libzstd` option, \
|
||||
like almost all `llvm.*` options, will be ignored and set by the LLVM CI \
|
||||
artifacts builder config."
|
||||
);
|
||||
println!(
|
||||
eprintln!(
|
||||
"HELP: To use `llvm.libzstd` for LLVM/LLD builds, set `download-ci-llvm` option to false."
|
||||
);
|
||||
}
|
||||
@ -2088,7 +2088,7 @@ impl Config {
|
||||
if available_backends.contains(&backend) {
|
||||
panic!("Invalid value '{s}' for 'target.{triple}.codegen-backends'. Instead, please use '{backend}'.");
|
||||
} else {
|
||||
println!("HELP: '{s}' for 'target.{triple}.codegen-backends' might fail. \
|
||||
eprintln!("HELP: '{s}' for 'target.{triple}.codegen-backends' might fail. \
|
||||
Codegen backends are mostly defined without the '{CODEGEN_BACKEND_PREFIX}' prefix. \
|
||||
In this case, it would be referred to as '{backend}'.");
|
||||
}
|
||||
@ -2304,7 +2304,7 @@ impl Config {
|
||||
if self.dry_run() {
|
||||
return Ok(());
|
||||
}
|
||||
self.verbose(|| println!("running: {cmd:?}"));
|
||||
self.verbose(|| eprintln!("running: {cmd:?}"));
|
||||
build_helper::util::try_run(cmd, self.is_verbose())
|
||||
}
|
||||
|
||||
@ -2479,7 +2479,7 @@ impl Config {
|
||||
// This happens when LLVM submodule is updated in CI, we should disable ci-rustc without an error
|
||||
// to not break CI. For non-CI environments, we should return an error.
|
||||
if CiEnv::is_ci() {
|
||||
println!("WARNING: LLVM submodule has changes, `download-rustc` will be disabled.");
|
||||
eprintln!("WARNING: LLVM submodule has changes, `download-rustc` will be disabled.");
|
||||
return None;
|
||||
} else {
|
||||
panic!("ERROR: LLVM submodule has changes, `download-rustc` can't be used.");
|
||||
@ -2490,8 +2490,8 @@ impl Config {
|
||||
let ci_config_toml = match self.get_builder_toml("ci-rustc") {
|
||||
Ok(ci_config_toml) => ci_config_toml,
|
||||
Err(e) if e.to_string().contains("unknown field") => {
|
||||
println!("WARNING: CI rustc has some fields that are no longer supported in bootstrap; download-rustc will be disabled.");
|
||||
println!("HELP: Consider rebasing to a newer commit if available.");
|
||||
eprintln!("WARNING: CI rustc has some fields that are no longer supported in bootstrap; download-rustc will be disabled.");
|
||||
eprintln!("HELP: Consider rebasing to a newer commit if available.");
|
||||
return None;
|
||||
},
|
||||
Err(e) => {
|
||||
@ -2516,7 +2516,7 @@ impl Config {
|
||||
.is_some_and(|s| s == "1" || s == "true");
|
||||
|
||||
if disable_ci_rustc_if_incompatible && res.is_err() {
|
||||
println!("WARNING: download-rustc is disabled with `DISABLE_CI_RUSTC_IF_INCOMPATIBLE` env.");
|
||||
eprintln!("WARNING: download-rustc is disabled with `DISABLE_CI_RUSTC_IF_INCOMPATIBLE` env.");
|
||||
return None;
|
||||
}
|
||||
|
||||
@ -2701,7 +2701,7 @@ impl Config {
|
||||
return;
|
||||
}
|
||||
|
||||
println!("Updating submodule {relative_path}");
|
||||
eprintln!("Updating submodule {relative_path}");
|
||||
self.check_run(
|
||||
helpers::git(Some(&self.src))
|
||||
.run_always()
|
||||
@ -2824,7 +2824,7 @@ impl Config {
|
||||
Some(StringOrBool::Bool(true)) => false,
|
||||
Some(StringOrBool::String(s)) if s == "if-unchanged" => {
|
||||
if !self.rust_info.is_managed_git_subrepository() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"ERROR: `download-rustc=if-unchanged` is only compatible with Git managed sources."
|
||||
);
|
||||
crate::exit!(1);
|
||||
@ -2857,10 +2857,10 @@ impl Config {
|
||||
if if_unchanged {
|
||||
return None;
|
||||
}
|
||||
println!("ERROR: could not find commit hash for downloading rustc");
|
||||
println!("HELP: maybe your repository history is too shallow?");
|
||||
println!("HELP: consider setting `rust.download-rustc=false` in config.toml");
|
||||
println!("HELP: or fetch enough history to include one upstream commit");
|
||||
eprintln!("ERROR: could not find commit hash for downloading rustc");
|
||||
eprintln!("HELP: maybe your repository history is too shallow?");
|
||||
eprintln!("HELP: consider setting `rust.download-rustc=false` in config.toml");
|
||||
eprintln!("HELP: or fetch enough history to include one upstream commit");
|
||||
crate::exit!(1);
|
||||
}
|
||||
};
|
||||
@ -2899,7 +2899,7 @@ impl Config {
|
||||
let if_unchanged = || {
|
||||
if self.rust_info.is_from_tarball() {
|
||||
// Git is needed for running "if-unchanged" logic.
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: 'if-unchanged' has no effect on tarball sources; ignoring `download-ci-llvm`."
|
||||
);
|
||||
return false;
|
||||
@ -2948,10 +2948,10 @@ impl Config {
|
||||
// Only commits merged by bors will have CI artifacts.
|
||||
let commit = get_closest_merge_commit(Some(&self.src), &self.git_config(), &[]).unwrap();
|
||||
if commit.is_empty() {
|
||||
println!("error: could not find commit hash for downloading components from CI");
|
||||
println!("help: maybe your repository history is too shallow?");
|
||||
println!("help: consider disabling `{option_name}`");
|
||||
println!("help: or fetch enough history to include one upstream commit");
|
||||
eprintln!("error: could not find commit hash for downloading components from CI");
|
||||
eprintln!("help: maybe your repository history is too shallow?");
|
||||
eprintln!("help: consider disabling `{option_name}`");
|
||||
eprintln!("help: or fetch enough history to include one upstream commit");
|
||||
crate::exit!(1);
|
||||
}
|
||||
|
||||
@ -2963,14 +2963,14 @@ impl Config {
|
||||
if has_changes {
|
||||
if if_unchanged {
|
||||
if self.is_verbose() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"warning: saw changes to one of {modified_paths:?} since {commit}; \
|
||||
ignoring `{option_name}`"
|
||||
);
|
||||
}
|
||||
return None;
|
||||
}
|
||||
println!(
|
||||
eprintln!(
|
||||
"warning: `{option_name}` is enabled, but there are changes to one of {modified_paths:?}"
|
||||
);
|
||||
}
|
||||
@ -3007,7 +3007,7 @@ pub(crate) fn check_incompatible_options_for_ci_llvm(
|
||||
($current:expr, $expected:expr) => {
|
||||
if let Some(current) = &$current {
|
||||
if Some(current) != $expected.as_ref() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: `llvm.{}` has no effect with `llvm.download-ci-llvm`. \
|
||||
Current value: {:?}, Expected value(s): {}{:?}",
|
||||
stringify!($expected).replace("_", "-"),
|
||||
@ -3112,7 +3112,7 @@ fn check_incompatible_options_for_ci_rustc(
|
||||
($current:expr, $expected:expr, $config_section:expr) => {
|
||||
if let Some(current) = &$current {
|
||||
if Some(current) != $expected.as_ref() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: `{}` has no effect with `rust.download-rustc`. \
|
||||
Current value: {:?}, Expected value(s): {}{:?}",
|
||||
format!("{}.{}", $config_section, stringify!($expected).replace("_", "-")),
|
||||
|
@ -196,12 +196,12 @@ impl Flags {
|
||||
if let Ok(HelpVerboseOnly { help: true, verbose: 1.., cmd: subcommand }) =
|
||||
HelpVerboseOnly::try_parse_from(normalize_args(args))
|
||||
{
|
||||
println!("NOTE: updating submodules before printing available paths");
|
||||
eprintln!("NOTE: updating submodules before printing available paths");
|
||||
let config = Config::parse(Self::parse(&[String::from("build")]));
|
||||
let build = Build::new(config);
|
||||
let paths = Builder::get_help(&build, subcommand);
|
||||
if let Some(s) = paths {
|
||||
println!("{s}");
|
||||
eprintln!("{s}");
|
||||
} else {
|
||||
panic!("No paths available for subcommand `{}`", subcommand.as_str());
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ impl Config {
|
||||
if self.dry_run() && !cmd.run_always {
|
||||
return true;
|
||||
}
|
||||
self.verbose(|| println!("running: {cmd:?}"));
|
||||
self.verbose(|| eprintln!("running: {cmd:?}"));
|
||||
check_run(cmd, self.is_verbose())
|
||||
}
|
||||
|
||||
@ -144,7 +144,7 @@ impl Config {
|
||||
/// Please see <https://nixos.org/patchelf.html> for more information
|
||||
fn fix_bin_or_dylib(&self, fname: &Path) {
|
||||
assert_eq!(SHOULD_FIX_BINS_AND_DYLIBS.get(), Some(&true));
|
||||
println!("attempting to patch {}", fname.display());
|
||||
eprintln!("attempting to patch {}", fname.display());
|
||||
|
||||
// Only build `.nix-deps` once.
|
||||
static NIX_DEPS_DIR: OnceLock<PathBuf> = OnceLock::new();
|
||||
@ -206,7 +206,7 @@ impl Config {
|
||||
}
|
||||
|
||||
fn download_file(&self, url: &str, dest_path: &Path, help_on_error: &str) {
|
||||
self.verbose(|| println!("download {url}"));
|
||||
self.verbose(|| eprintln!("download {url}"));
|
||||
// Use a temporary file in case we crash while downloading, to avoid a corrupt download in cache/.
|
||||
let tempfile = self.tempdir().join(dest_path.file_name().unwrap());
|
||||
// While bootstrap itself only supports http and https downloads, downstream forks might
|
||||
@ -226,7 +226,7 @@ impl Config {
|
||||
}
|
||||
|
||||
fn download_http_with_retries(&self, tempfile: &Path, url: &str, help_on_error: &str) {
|
||||
println!("downloading {url}");
|
||||
eprintln!("downloading {url}");
|
||||
// Try curl. If that fails and we are on windows, fallback to PowerShell.
|
||||
// options should be kept in sync with
|
||||
// src/bootstrap/src/core/download.rs
|
||||
@ -341,7 +341,7 @@ impl Config {
|
||||
short_path = short_path.strip_prefix(pattern).unwrap_or(short_path);
|
||||
let dst_path = dst.join(short_path);
|
||||
self.verbose(|| {
|
||||
println!("extracting {} to {}", original_path.display(), dst.display())
|
||||
eprintln!("extracting {} to {}", original_path.display(), dst.display())
|
||||
});
|
||||
if !t!(member.unpack_in(dst)) {
|
||||
panic!("path traversal attack ??");
|
||||
@ -365,7 +365,7 @@ impl Config {
|
||||
pub(crate) fn verify(&self, path: &Path, expected: &str) -> bool {
|
||||
use sha2::Digest;
|
||||
|
||||
self.verbose(|| println!("verifying {}", path.display()));
|
||||
self.verbose(|| eprintln!("verifying {}", path.display()));
|
||||
|
||||
if self.dry_run() {
|
||||
return false;
|
||||
@ -391,7 +391,7 @@ impl Config {
|
||||
let verified = checksum == expected;
|
||||
|
||||
if !verified {
|
||||
println!(
|
||||
eprintln!(
|
||||
"invalid checksum: \n\
|
||||
found: {checksum}\n\
|
||||
expected: {expected}",
|
||||
@ -421,7 +421,7 @@ enum DownloadSource {
|
||||
/// Functions that are only ever called once, but named for clarify and to avoid thousand-line functions.
|
||||
impl Config {
|
||||
pub(crate) fn download_clippy(&self) -> PathBuf {
|
||||
self.verbose(|| println!("downloading stage0 clippy artifacts"));
|
||||
self.verbose(|| eprintln!("downloading stage0 clippy artifacts"));
|
||||
|
||||
let date = &self.stage0_metadata.compiler.date;
|
||||
let version = &self.stage0_metadata.compiler.version;
|
||||
@ -518,7 +518,7 @@ impl Config {
|
||||
}
|
||||
|
||||
pub(crate) fn download_ci_rustc(&self, commit: &str) {
|
||||
self.verbose(|| println!("using downloaded stage2 artifacts from CI (commit {commit})"));
|
||||
self.verbose(|| eprintln!("using downloaded stage2 artifacts from CI (commit {commit})"));
|
||||
|
||||
let version = self.artifact_version_part(commit);
|
||||
// download-rustc doesn't need its own cargo, it can just use beta's. But it does need the
|
||||
@ -539,7 +539,7 @@ impl Config {
|
||||
|
||||
#[cfg(not(feature = "bootstrap-self-test"))]
|
||||
pub(crate) fn download_beta_toolchain(&self) {
|
||||
self.verbose(|| println!("downloading stage0 beta artifacts"));
|
||||
self.verbose(|| eprintln!("downloading stage0 beta artifacts"));
|
||||
|
||||
let date = &self.stage0_metadata.compiler.date;
|
||||
let version = &self.stage0_metadata.compiler.version;
|
||||
@ -677,7 +677,7 @@ impl Config {
|
||||
return;
|
||||
} else {
|
||||
self.verbose(|| {
|
||||
println!(
|
||||
eprintln!(
|
||||
"ignoring cached file {} due to failed verification",
|
||||
tarball.display()
|
||||
)
|
||||
@ -776,10 +776,10 @@ download-rustc = false
|
||||
t!(check_incompatible_options_for_ci_llvm(current_config_toml, ci_config_toml));
|
||||
}
|
||||
Err(e) if e.to_string().contains("unknown field") => {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: CI LLVM has some fields that are no longer supported in bootstrap; download-ci-llvm will be disabled."
|
||||
);
|
||||
println!("HELP: Consider rebasing to a newer commit if available.");
|
||||
eprintln!("HELP: Consider rebasing to a newer commit if available.");
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("ERROR: Failed to parse CI LLVM config.toml: {e}");
|
||||
|
@ -237,11 +237,11 @@ than building it.
|
||||
stage0_supported_target_list.intersection(&missing_targets_hashset).collect();
|
||||
|
||||
if !duplicated_targets.is_empty() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"Following targets supported from the stage0 compiler, please remove them from STAGE0_MISSING_TARGETS list."
|
||||
);
|
||||
for duplicated_target in duplicated_targets {
|
||||
println!(" {duplicated_target}");
|
||||
eprintln!(" {duplicated_target}");
|
||||
}
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
@ -406,11 +406,11 @@ impl Build {
|
||||
.unwrap()
|
||||
.trim();
|
||||
if local_release.split('.').take(2).eq(version.split('.').take(2)) {
|
||||
build.verbose(|| println!("auto-detected local-rebuild {local_release}"));
|
||||
build.verbose(|| eprintln!("auto-detected local-rebuild {local_release}"));
|
||||
build.local_rebuild = true;
|
||||
}
|
||||
|
||||
build.verbose(|| println!("finding compilers"));
|
||||
build.verbose(|| eprintln!("finding compilers"));
|
||||
utils::cc_detect::find(&build);
|
||||
// When running `setup`, the profile is about to change, so any requirements we have now may
|
||||
// be different on the next invocation. Don't check for them until the next time x.py is
|
||||
@ -418,7 +418,7 @@ impl Build {
|
||||
//
|
||||
// Similarly, for `setup` we don't actually need submodules or cargo metadata.
|
||||
if !matches!(build.config.cmd, Subcommand::Setup { .. }) {
|
||||
build.verbose(|| println!("running sanity check"));
|
||||
build.verbose(|| eprintln!("running sanity check"));
|
||||
crate::core::sanity::check(&mut build);
|
||||
|
||||
// Make sure we update these before gathering metadata so we don't get an error about missing
|
||||
@ -436,7 +436,7 @@ impl Build {
|
||||
// Now, update all existing submodules.
|
||||
build.update_existing_submodules();
|
||||
|
||||
build.verbose(|| println!("learning about cargo"));
|
||||
build.verbose(|| eprintln!("learning about cargo"));
|
||||
crate::core::metadata::build(&mut build);
|
||||
}
|
||||
|
||||
@ -605,7 +605,7 @@ impl Build {
|
||||
let stamp = dir.join(".stamp");
|
||||
let mut cleared = false;
|
||||
if mtime(&stamp) < mtime(input) {
|
||||
self.verbose(|| println!("Dirty - {}", dir.display()));
|
||||
self.verbose(|| eprintln!("Dirty - {}", dir.display()));
|
||||
let _ = fs::remove_dir_all(dir);
|
||||
cleared = true;
|
||||
} else if stamp.exists() {
|
||||
@ -890,7 +890,7 @@ impl Build {
|
||||
let executed_at = std::panic::Location::caller();
|
||||
|
||||
self.verbose(|| {
|
||||
println!("running: {command:?} (created at {created_at}, executed at {executed_at})")
|
||||
eprintln!("running: {command:?} (created at {created_at}, executed at {executed_at})")
|
||||
});
|
||||
|
||||
let cmd = command.as_command_mut();
|
||||
@ -947,7 +947,7 @@ Executed at: {executed_at}"#,
|
||||
|
||||
let fail = |message: &str, output: CommandOutput| -> ! {
|
||||
if self.is_verbose() {
|
||||
println!("{message}");
|
||||
eprintln!("{message}");
|
||||
} else {
|
||||
let (stdout, stderr) = (output.stdout_if_present(), output.stderr_if_present());
|
||||
// If the command captures output, the user would not see any indication that
|
||||
@ -957,16 +957,16 @@ Executed at: {executed_at}"#,
|
||||
if let Some(stdout) =
|
||||
output.stdout_if_present().take_if(|s| !s.trim().is_empty())
|
||||
{
|
||||
println!("STDOUT:\n{stdout}\n");
|
||||
eprintln!("STDOUT:\n{stdout}\n");
|
||||
}
|
||||
if let Some(stderr) =
|
||||
output.stderr_if_present().take_if(|s| !s.trim().is_empty())
|
||||
{
|
||||
println!("STDERR:\n{stderr}\n");
|
||||
eprintln!("STDERR:\n{stderr}\n");
|
||||
}
|
||||
println!("Command {command:?} has failed. Rerun with -v to see more details.");
|
||||
eprintln!("Command {command:?} has failed. Rerun with -v to see more details.");
|
||||
} else {
|
||||
println!("Command has failed. Rerun with -v to see more details.");
|
||||
eprintln!("Command has failed. Rerun with -v to see more details.");
|
||||
}
|
||||
}
|
||||
exit!(1);
|
||||
@ -1011,7 +1011,7 @@ Executed at: {executed_at}"#,
|
||||
match self.config.dry_run {
|
||||
DryRun::SelfCheck => (),
|
||||
DryRun::Disabled | DryRun::UserSelected => {
|
||||
println!("{msg}");
|
||||
eprintln!("{msg}");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1666,7 +1666,7 @@ Executed at: {executed_at}"#,
|
||||
if self.config.dry_run() {
|
||||
return;
|
||||
}
|
||||
self.verbose_than(1, || println!("Copy/Link {src:?} to {dst:?}"));
|
||||
self.verbose_than(1, || eprintln!("Copy/Link {src:?} to {dst:?}"));
|
||||
if src == dst {
|
||||
return;
|
||||
}
|
||||
@ -1775,7 +1775,7 @@ Executed at: {executed_at}"#,
|
||||
return;
|
||||
}
|
||||
let dst = dstdir.join(src.file_name().unwrap());
|
||||
self.verbose_than(1, || println!("Install {src:?} to {dst:?}"));
|
||||
self.verbose_than(1, || eprintln!("Install {src:?} to {dst:?}"));
|
||||
t!(fs::create_dir_all(dstdir));
|
||||
if !src.exists() {
|
||||
panic!("ERROR: File \"{}\" not found!", src.display());
|
||||
|
@ -155,15 +155,15 @@ pub fn find_target(build: &Build, target: TargetSelection) {
|
||||
build.cxx.borrow_mut().insert(target, compiler);
|
||||
}
|
||||
|
||||
build.verbose(|| println!("CC_{} = {:?}", target.triple, build.cc(target)));
|
||||
build.verbose(|| println!("CFLAGS_{} = {cflags:?}", target.triple));
|
||||
build.verbose(|| eprintln!("CC_{} = {:?}", target.triple, build.cc(target)));
|
||||
build.verbose(|| eprintln!("CFLAGS_{} = {cflags:?}", target.triple));
|
||||
if let Ok(cxx) = build.cxx(target) {
|
||||
let cxxflags = build.cflags(target, GitRepo::Rustc, CLang::Cxx);
|
||||
build.verbose(|| println!("CXX_{} = {cxx:?}", target.triple));
|
||||
build.verbose(|| println!("CXXFLAGS_{} = {cxxflags:?}", target.triple));
|
||||
build.verbose(|| eprintln!("CXX_{} = {cxx:?}", target.triple));
|
||||
build.verbose(|| eprintln!("CXXFLAGS_{} = {cxxflags:?}", target.triple));
|
||||
}
|
||||
if let Some(ar) = ar {
|
||||
build.verbose(|| println!("AR_{} = {ar:?}", target.triple));
|
||||
build.verbose(|| eprintln!("AR_{} = {ar:?}", target.triple));
|
||||
build.ar.borrow_mut().insert(target, ar);
|
||||
}
|
||||
|
||||
|
@ -135,7 +135,7 @@ impl Drop for TimeIt {
|
||||
fn drop(&mut self) {
|
||||
let time = self.1.elapsed();
|
||||
if !self.0 {
|
||||
println!("\tfinished in {}.{:03} seconds", time.as_secs(), time.subsec_millis());
|
||||
eprintln!("\tfinished in {}.{:03} seconds", time.as_secs(), time.subsec_millis());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -267,12 +267,12 @@ pub fn check_run(cmd: &mut BootstrapCommand, print_cmd_on_fail: bool) -> bool {
|
||||
let status = match cmd.as_command_mut().status() {
|
||||
Ok(status) => status,
|
||||
Err(e) => {
|
||||
println!("failed to execute command: {cmd:?}\nERROR: {e}");
|
||||
eprintln!("failed to execute command: {cmd:?}\nERROR: {e}");
|
||||
return false;
|
||||
}
|
||||
};
|
||||
if !status.success() && print_cmd_on_fail {
|
||||
println!(
|
||||
eprintln!(
|
||||
"\n\ncommand did not execute successfully: {cmd:?}\n\
|
||||
expected success, got: {status}\n\n"
|
||||
);
|
||||
|
@ -185,7 +185,7 @@ impl BuildMetrics {
|
||||
if version.format_version == CURRENT_FORMAT_VERSION {
|
||||
t!(serde_json::from_slice::<JsonRoot>(&contents)).invocations
|
||||
} else {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: overriding existing build/metrics.json, as it's not \
|
||||
compatible with build metrics format version {CURRENT_FORMAT_VERSION}."
|
||||
);
|
||||
|
@ -56,7 +56,7 @@ fn run_tests(builder: &Builder<'_>, cmd: &mut BootstrapCommand, stream: bool) ->
|
||||
let cmd = cmd.as_command_mut();
|
||||
cmd.stdout(Stdio::piped());
|
||||
|
||||
builder.verbose(|| println!("running: {cmd:?}"));
|
||||
builder.verbose(|| eprintln!("running: {cmd:?}"));
|
||||
|
||||
let mut process = cmd.spawn().unwrap();
|
||||
|
||||
@ -71,7 +71,7 @@ fn run_tests(builder: &Builder<'_>, cmd: &mut BootstrapCommand, stream: bool) ->
|
||||
|
||||
let result = process.wait_with_output().unwrap();
|
||||
if !result.status.success() && builder.is_verbose() {
|
||||
println!(
|
||||
eprintln!(
|
||||
"\n\ncommand did not execute successfully: {cmd:?}\n\
|
||||
expected success, got: {}",
|
||||
result.status
|
||||
@ -135,7 +135,9 @@ impl<'a> Renderer<'a> {
|
||||
if self.up_to_date_tests > 0 {
|
||||
let n = self.up_to_date_tests;
|
||||
let s = if n > 1 { "s" } else { "" };
|
||||
println!("help: ignored {n} up-to-date test{s}; use `--force-rerun` to prevent this\n");
|
||||
eprintln!(
|
||||
"help: ignored {n} up-to-date test{s}; use `--force-rerun` to prevent this\n"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -185,12 +187,12 @@ impl<'a> Renderer<'a> {
|
||||
}
|
||||
|
||||
fn render_test_outcome_verbose(&self, outcome: Outcome<'_>, test: &TestOutcome) {
|
||||
print!("test {} ... ", test.name);
|
||||
self.builder.colored_stdout(|stdout| outcome.write_long(stdout)).unwrap();
|
||||
eprint!("test {} ... ", test.name);
|
||||
self.builder.colored_stderr(|stdout| outcome.write_long(stdout)).unwrap();
|
||||
if let Some(exec_time) = test.exec_time {
|
||||
print!(" ({exec_time:.2?})");
|
||||
eprint!(" ({exec_time:.2?})");
|
||||
}
|
||||
println!();
|
||||
eprintln!();
|
||||
}
|
||||
|
||||
fn render_test_outcome_terse(&mut self, outcome: Outcome<'_>, test: &TestOutcome) {
|
||||
@ -198,45 +200,45 @@ impl<'a> Renderer<'a> {
|
||||
if let Some(total) = self.tests_count {
|
||||
let total = total.to_string();
|
||||
let executed = format!("{:>width$}", self.executed_tests - 1, width = total.len());
|
||||
print!(" {executed}/{total}");
|
||||
eprint!(" {executed}/{total}");
|
||||
}
|
||||
println!();
|
||||
eprintln!();
|
||||
self.terse_tests_in_line = 0;
|
||||
}
|
||||
|
||||
self.terse_tests_in_line += 1;
|
||||
self.builder.colored_stdout(|stdout| outcome.write_short(stdout, &test.name)).unwrap();
|
||||
self.builder.colored_stderr(|stdout| outcome.write_short(stdout, &test.name)).unwrap();
|
||||
let _ = std::io::stdout().flush();
|
||||
}
|
||||
|
||||
fn render_suite_outcome(&self, outcome: Outcome<'_>, suite: &SuiteOutcome) {
|
||||
// The terse output doesn't end with a newline, so we need to add it ourselves.
|
||||
if !self.builder.config.verbose_tests {
|
||||
println!();
|
||||
eprintln!();
|
||||
}
|
||||
|
||||
if !self.failures.is_empty() {
|
||||
println!("\nfailures:\n");
|
||||
eprintln!("\nfailures:\n");
|
||||
for failure in &self.failures {
|
||||
if failure.stdout.is_some() || failure.message.is_some() {
|
||||
println!("---- {} stdout ----", failure.name);
|
||||
eprintln!("---- {} stdout ----", failure.name);
|
||||
if let Some(stdout) = &failure.stdout {
|
||||
println!("{stdout}");
|
||||
eprintln!("{stdout}");
|
||||
}
|
||||
if let Some(message) = &failure.message {
|
||||
println!("NOTE: {message}");
|
||||
eprintln!("NOTE: {message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
println!("\nfailures:");
|
||||
eprintln!("\nfailures:");
|
||||
for failure in &self.failures {
|
||||
println!(" {}", failure.name);
|
||||
eprintln!(" {}", failure.name);
|
||||
}
|
||||
}
|
||||
|
||||
if !self.benches.is_empty() {
|
||||
println!("\nbenchmarks:");
|
||||
eprintln!("\nbenchmarks:");
|
||||
|
||||
let mut rows = Vec::new();
|
||||
for bench in &self.benches {
|
||||
@ -251,13 +253,13 @@ impl<'a> Renderer<'a> {
|
||||
let max_1 = rows.iter().map(|r| r.1.len()).max().unwrap_or(0);
|
||||
let max_2 = rows.iter().map(|r| r.2.len()).max().unwrap_or(0);
|
||||
for row in &rows {
|
||||
println!(" {:<max_0$} {:>max_1$} {:>max_2$}", row.0, row.1, row.2);
|
||||
eprintln!(" {:<max_0$} {:>max_1$} {:>max_2$}", row.0, row.1, row.2);
|
||||
}
|
||||
}
|
||||
|
||||
print!("\ntest result: ");
|
||||
self.builder.colored_stdout(|stdout| outcome.write_long(stdout)).unwrap();
|
||||
println!(
|
||||
eprint!("\ntest result: ");
|
||||
self.builder.colored_stderr(|stdout| outcome.write_long(stdout)).unwrap();
|
||||
eprintln!(
|
||||
". {} passed; {} failed; {} ignored; {} measured; {} filtered out{time}\n",
|
||||
suite.passed,
|
||||
suite.failed,
|
||||
@ -274,7 +276,7 @@ impl<'a> Renderer<'a> {
|
||||
fn render_message(&mut self, message: Message) {
|
||||
match message {
|
||||
Message::Suite(SuiteMessage::Started { test_count }) => {
|
||||
println!("\nrunning {test_count} tests");
|
||||
eprintln!("\nrunning {test_count} tests");
|
||||
self.executed_tests = 0;
|
||||
self.terse_tests_in_line = 0;
|
||||
self.tests_count = Some(test_count);
|
||||
@ -314,7 +316,7 @@ impl<'a> Renderer<'a> {
|
||||
self.failures.push(outcome);
|
||||
}
|
||||
Message::Test(TestMessage::Timeout { name }) => {
|
||||
println!("test {name} has been running for a long time");
|
||||
eprintln!("test {name} has been running for a long time");
|
||||
}
|
||||
Message::Test(TestMessage::Started) => {} // Not useful
|
||||
}
|
||||
|
@ -344,7 +344,7 @@ impl<'a> Tarball<'a> {
|
||||
// For `x install` tarball files aren't needed, so we can speed up the process by not producing them.
|
||||
let compression_profile = if self.builder.kind == Kind::Install {
|
||||
self.builder.verbose(|| {
|
||||
println!("Forcing dist.compression-profile = 'no-op' for `x install`.")
|
||||
eprintln!("Forcing dist.compression-profile = 'no-op' for `x install`.")
|
||||
});
|
||||
// "no-op" indicates that the rust-installer won't produce compressed tarball sources.
|
||||
"no-op"
|
||||
|
@ -144,7 +144,7 @@ where
|
||||
}
|
||||
|
||||
if !wrote_data {
|
||||
println!("note: diff is identical to nightly rustdoc");
|
||||
eprintln!("note: diff is identical to nightly rustdoc");
|
||||
assert!(diff_output.metadata().unwrap().len() == 0);
|
||||
return false;
|
||||
} else if verbose {
|
||||
|
@ -20,7 +20,7 @@ pub(crate) fn configure_gdb(config: &Config) -> Option<Arc<Config>> {
|
||||
}
|
||||
|
||||
if config.remote_test_client.is_some() && !config.target.contains("android") {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: debuginfo tests are not available when \
|
||||
testing with remote"
|
||||
);
|
||||
@ -28,7 +28,7 @@ pub(crate) fn configure_gdb(config: &Config) -> Option<Arc<Config>> {
|
||||
}
|
||||
|
||||
if config.target.contains("android") {
|
||||
println!(
|
||||
eprintln!(
|
||||
"{} debug-info test uses tcp 5039 port.\
|
||||
please reserve it",
|
||||
config.target
|
||||
@ -50,7 +50,7 @@ pub(crate) fn configure_lldb(config: &Config) -> Option<Arc<Config>> {
|
||||
config.lldb_python_dir.as_ref()?;
|
||||
|
||||
if let Some(350) = config.lldb_version {
|
||||
println!(
|
||||
eprintln!(
|
||||
"WARNING: The used version of LLDB (350) has a \
|
||||
known issue that breaks debuginfo tests. See \
|
||||
issue #32520 for more information. Skipping all \
|
||||
|
@ -188,8 +188,8 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
||||
let (argv0, args_) = args.split_first().unwrap();
|
||||
if args.len() == 1 || args[1] == "-h" || args[1] == "--help" {
|
||||
let message = format!("Usage: {} [OPTIONS] [TESTNAME...]", argv0);
|
||||
println!("{}", opts.usage(&message));
|
||||
println!();
|
||||
eprintln!("{}", opts.usage(&message));
|
||||
eprintln!();
|
||||
panic!()
|
||||
}
|
||||
|
||||
@ -200,8 +200,8 @@ pub fn parse_config(args: Vec<String>) -> Config {
|
||||
|
||||
if matches.opt_present("h") || matches.opt_present("help") {
|
||||
let message = format!("Usage: {} [OPTIONS] [TESTNAME...]", argv0);
|
||||
println!("{}", opts.usage(&message));
|
||||
println!();
|
||||
eprintln!("{}", opts.usage(&message));
|
||||
eprintln!();
|
||||
panic!()
|
||||
}
|
||||
|
||||
@ -508,7 +508,7 @@ pub fn run_tests(config: Arc<Config>) {
|
||||
// easy to miss which tests failed, and as such fail to reproduce
|
||||
// the failure locally.
|
||||
|
||||
println!(
|
||||
eprintln!(
|
||||
"Some tests failed in compiletest suite={}{} mode={} host={} target={}",
|
||||
config.suite,
|
||||
config
|
||||
|
@ -131,7 +131,7 @@ pub fn run(config: Arc<Config>, testpaths: &TestPaths, revision: Option<&str>) {
|
||||
|
||||
if config.verbose {
|
||||
// We're going to be dumping a lot of info. Start on a new line.
|
||||
print!("\n\n");
|
||||
eprintln!("\n");
|
||||
}
|
||||
debug!("running {:?}", testpaths.file.display());
|
||||
let mut props = TestProps::from_file(&testpaths.file, revision, &config);
|
||||
@ -353,7 +353,7 @@ impl<'test> TestCx<'test> {
|
||||
{
|
||||
self.error(&format!("{} test did not emit an error", self.config.mode));
|
||||
if self.config.mode == crate::common::Mode::Ui {
|
||||
println!("note: by default, ui tests are expected not to compile");
|
||||
eprintln!("note: by default, ui tests are expected not to compile");
|
||||
}
|
||||
proc_res.fatal(None, || ());
|
||||
};
|
||||
@ -774,20 +774,20 @@ impl<'test> TestCx<'test> {
|
||||
unexpected.len(),
|
||||
not_found.len()
|
||||
));
|
||||
println!("status: {}\ncommand: {}\n", proc_res.status, proc_res.cmdline);
|
||||
eprintln!("status: {}\ncommand: {}\n", proc_res.status, proc_res.cmdline);
|
||||
if !unexpected.is_empty() {
|
||||
println!("{}", "--- unexpected errors (from JSON output) ---".green());
|
||||
eprintln!("{}", "--- unexpected errors (from JSON output) ---".green());
|
||||
for error in &unexpected {
|
||||
println!("{}", error.render_for_expected());
|
||||
eprintln!("{}", error.render_for_expected());
|
||||
}
|
||||
println!("{}", "---".green());
|
||||
eprintln!("{}", "---".green());
|
||||
}
|
||||
if !not_found.is_empty() {
|
||||
println!("{}", "--- not found errors (from test file) ---".red());
|
||||
eprintln!("{}", "--- not found errors (from test file) ---".red());
|
||||
for error in ¬_found {
|
||||
println!("{}", error.render_for_expected());
|
||||
eprintln!("{}", error.render_for_expected());
|
||||
}
|
||||
println!("{}", "---\n".red());
|
||||
eprintln!("{}", "---\n".red());
|
||||
}
|
||||
panic!("errors differ from expected");
|
||||
}
|
||||
@ -1876,18 +1876,18 @@ impl<'test> TestCx<'test> {
|
||||
|
||||
fn maybe_dump_to_stdout(&self, out: &str, err: &str) {
|
||||
if self.config.verbose {
|
||||
println!("------stdout------------------------------");
|
||||
println!("{}", out);
|
||||
println!("------stderr------------------------------");
|
||||
println!("{}", err);
|
||||
println!("------------------------------------------");
|
||||
eprintln!("------stdout------------------------------");
|
||||
eprintln!("{}", out);
|
||||
eprintln!("------stderr------------------------------");
|
||||
eprintln!("{}", err);
|
||||
eprintln!("------------------------------------------");
|
||||
}
|
||||
}
|
||||
|
||||
fn error(&self, err: &str) {
|
||||
match self.revision {
|
||||
Some(rev) => println!("\nerror in revision `{}`: {}", rev, err),
|
||||
None => println!("\nerror: {}", err),
|
||||
Some(rev) => eprintln!("\nerror in revision `{}`: {}", rev, err),
|
||||
None => eprintln!("\nerror: {}", err),
|
||||
}
|
||||
}
|
||||
|
||||
@ -1972,7 +1972,7 @@ impl<'test> TestCx<'test> {
|
||||
if !self.config.has_html_tidy {
|
||||
return;
|
||||
}
|
||||
println!("info: generating a diff against nightly rustdoc");
|
||||
eprintln!("info: generating a diff against nightly rustdoc");
|
||||
|
||||
let suffix =
|
||||
self.safe_revision().map_or("nightly".into(), |path| path.to_owned() + "-nightly");
|
||||
@ -2082,7 +2082,7 @@ impl<'test> TestCx<'test> {
|
||||
.output()
|
||||
.unwrap();
|
||||
assert!(output.status.success());
|
||||
println!("{}", String::from_utf8_lossy(&output.stdout));
|
||||
eprintln!("{}", String::from_utf8_lossy(&output.stdout));
|
||||
eprintln!("{}", String::from_utf8_lossy(&output.stderr));
|
||||
} else {
|
||||
use colored::Colorize;
|
||||
@ -2496,7 +2496,7 @@ impl<'test> TestCx<'test> {
|
||||
)"#
|
||||
)
|
||||
.replace_all(&output, |caps: &Captures<'_>| {
|
||||
println!("{}", &caps[0]);
|
||||
eprintln!("{}", &caps[0]);
|
||||
caps[0].replace(r"\", "/")
|
||||
})
|
||||
.replace("\r\n", "\n")
|
||||
@ -2601,14 +2601,14 @@ impl<'test> TestCx<'test> {
|
||||
if let Err(err) = fs::write(&actual_path, &actual) {
|
||||
self.fatal(&format!("failed to write {stream} to `{actual_path:?}`: {err}",));
|
||||
}
|
||||
println!("Saved the actual {stream} to {actual_path:?}");
|
||||
eprintln!("Saved the actual {stream} to {actual_path:?}");
|
||||
|
||||
let expected_path =
|
||||
expected_output_path(self.testpaths, self.revision, &self.config.compare_mode, stream);
|
||||
|
||||
if !self.config.bless {
|
||||
if expected.is_empty() {
|
||||
println!("normalized {}:\n{}\n", stream, actual);
|
||||
eprintln!("normalized {}:\n{}\n", stream, actual);
|
||||
} else {
|
||||
self.show_diff(
|
||||
stream,
|
||||
@ -2631,10 +2631,10 @@ impl<'test> TestCx<'test> {
|
||||
if let Err(err) = fs::write(&expected_path, &actual) {
|
||||
self.fatal(&format!("failed to write {stream} to `{expected_path:?}`: {err}"));
|
||||
}
|
||||
println!("Blessing the {stream} of {test_name} in {expected_path:?}");
|
||||
eprintln!("Blessing the {stream} of {test_name} in {expected_path:?}");
|
||||
}
|
||||
|
||||
println!("\nThe actual {0} differed from the expected {0}.", stream);
|
||||
eprintln!("\nThe actual {0} differed from the expected {0}.", stream);
|
||||
|
||||
if self.config.bless { 0 } else { 1 }
|
||||
}
|
||||
@ -2783,7 +2783,7 @@ impl<'test> TestCx<'test> {
|
||||
fs::create_dir_all(&incremental_dir).unwrap();
|
||||
|
||||
if self.config.verbose {
|
||||
println!("init_incremental_test: incremental_dir={}", incremental_dir.display());
|
||||
eprintln!("init_incremental_test: incremental_dir={}", incremental_dir.display());
|
||||
}
|
||||
}
|
||||
|
||||
@ -2841,7 +2841,7 @@ impl ProcRes {
|
||||
}
|
||||
}
|
||||
|
||||
println!(
|
||||
eprintln!(
|
||||
"status: {}\ncommand: {}\n{}\n{}\n",
|
||||
self.status,
|
||||
self.cmdline,
|
||||
@ -2852,7 +2852,7 @@ impl ProcRes {
|
||||
|
||||
pub fn fatal(&self, err: Option<&str>, on_failure: impl FnOnce()) -> ! {
|
||||
if let Some(e) = err {
|
||||
println!("\nerror: {}", e);
|
||||
eprintln!("\nerror: {}", e);
|
||||
}
|
||||
self.print_info();
|
||||
on_failure();
|
||||
|
@ -64,13 +64,13 @@ impl TestCx<'_> {
|
||||
if !missing.is_empty() {
|
||||
missing.sort();
|
||||
|
||||
println!("\nThese items should have been contained but were not:\n");
|
||||
eprintln!("\nThese items should have been contained but were not:\n");
|
||||
|
||||
for item in &missing {
|
||||
println!("{}", item);
|
||||
eprintln!("{}", item);
|
||||
}
|
||||
|
||||
println!("\n");
|
||||
eprintln!("\n");
|
||||
}
|
||||
|
||||
if !unexpected.is_empty() {
|
||||
@ -80,24 +80,24 @@ impl TestCx<'_> {
|
||||
sorted
|
||||
};
|
||||
|
||||
println!("\nThese items were contained but should not have been:\n");
|
||||
eprintln!("\nThese items were contained but should not have been:\n");
|
||||
|
||||
for item in sorted {
|
||||
println!("{}", item);
|
||||
eprintln!("{}", item);
|
||||
}
|
||||
|
||||
println!("\n");
|
||||
eprintln!("\n");
|
||||
}
|
||||
|
||||
if !wrong_cgus.is_empty() {
|
||||
wrong_cgus.sort_by_key(|pair| pair.0.name.clone());
|
||||
println!("\nThe following items were assigned to wrong codegen units:\n");
|
||||
eprintln!("\nThe following items were assigned to wrong codegen units:\n");
|
||||
|
||||
for &(ref expected_item, ref actual_item) in &wrong_cgus {
|
||||
println!("{}", expected_item.name);
|
||||
println!(" expected: {}", codegen_units_to_str(&expected_item.codegen_units));
|
||||
println!(" actual: {}", codegen_units_to_str(&actual_item.codegen_units));
|
||||
println!();
|
||||
eprintln!("{}", expected_item.name);
|
||||
eprintln!(" expected: {}", codegen_units_to_str(&expected_item.codegen_units));
|
||||
eprintln!(" actual: {}", codegen_units_to_str(&actual_item.codegen_units));
|
||||
eprintln!();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -260,7 +260,7 @@ impl TestCx<'_> {
|
||||
cmdline,
|
||||
};
|
||||
if adb.kill().is_err() {
|
||||
println!("Adb process is already finished.");
|
||||
eprintln!("Adb process is already finished.");
|
||||
}
|
||||
} else {
|
||||
let rust_src_root =
|
||||
@ -275,7 +275,7 @@ impl TestCx<'_> {
|
||||
|
||||
match self.config.gdb_version {
|
||||
Some(version) => {
|
||||
println!("NOTE: compiletest thinks it is using GDB version {}", version);
|
||||
eprintln!("NOTE: compiletest thinks it is using GDB version {}", version);
|
||||
|
||||
if version > extract_gdb_version("7.4").unwrap() {
|
||||
// Add the directory containing the pretty printers to
|
||||
@ -297,7 +297,7 @@ impl TestCx<'_> {
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
eprintln!(
|
||||
"NOTE: compiletest does not know which version of \
|
||||
GDB it is using"
|
||||
);
|
||||
@ -392,10 +392,10 @@ impl TestCx<'_> {
|
||||
|
||||
match self.config.lldb_version {
|
||||
Some(ref version) => {
|
||||
println!("NOTE: compiletest thinks it is using LLDB version {}", version);
|
||||
eprintln!("NOTE: compiletest thinks it is using LLDB version {}", version);
|
||||
}
|
||||
_ => {
|
||||
println!(
|
||||
eprintln!(
|
||||
"NOTE: compiletest does not know which version of \
|
||||
LLDB it is using"
|
||||
);
|
||||
|
@ -30,7 +30,7 @@ impl TestCx<'_> {
|
||||
assert!(incremental_dir.exists(), "init_incremental_test failed to create incremental dir");
|
||||
|
||||
if self.config.verbose {
|
||||
print!("revision={:?} props={:#?}", revision, self.props);
|
||||
eprint!("revision={:?} props={:#?}", revision, self.props);
|
||||
}
|
||||
|
||||
if revision.starts_with("cpass") {
|
||||
|
@ -89,7 +89,7 @@ impl TestCx<'_> {
|
||||
}
|
||||
let expected_string = fs::read_to_string(&expected_file).unwrap();
|
||||
if dumped_string != expected_string {
|
||||
print!("{}", write_diff(&expected_string, &dumped_string, 3));
|
||||
eprint!("{}", write_diff(&expected_string, &dumped_string, 3));
|
||||
panic!(
|
||||
"Actual MIR output differs from expected MIR output {}",
|
||||
expected_file.display()
|
||||
|
@ -29,7 +29,7 @@ impl TestCx<'_> {
|
||||
|
||||
if !res.status.success() {
|
||||
self.fatal_proc_rec_with_ctx("jsondocck failed!", &res, |_| {
|
||||
println!("Rustdoc Output:");
|
||||
eprintln!("Rustdoc Output:");
|
||||
proc_res.print_info();
|
||||
})
|
||||
}
|
||||
|
@ -109,10 +109,10 @@ impl TestCx<'_> {
|
||||
}
|
||||
|
||||
if errors > 0 {
|
||||
println!("To update references, rerun the tests and pass the `--bless` flag");
|
||||
eprintln!("To update references, rerun the tests and pass the `--bless` flag");
|
||||
let relative_path_to_file =
|
||||
self.testpaths.relative_dir.join(self.testpaths.file.file_name().unwrap());
|
||||
println!(
|
||||
eprintln!(
|
||||
"To only update this specific test, also pass `--test-args {}`",
|
||||
relative_path_to_file.display(),
|
||||
);
|
||||
|
@ -30,7 +30,7 @@ fn path_div() -> &'static str {
|
||||
pub fn logv(config: &Config, s: String) {
|
||||
debug!("{}", s);
|
||||
if config.verbose {
|
||||
println!("{}", s);
|
||||
eprintln!("{}", s);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
use rustc_abi::{ExternAbi, Size};
|
||||
use rustc_ast::ast::Mutability;
|
||||
use rustc_middle::ty::layout::LayoutOf as _;
|
||||
use rustc_middle::ty::{self, Instance, Ty};
|
||||
use rustc_span::{BytePos, Loc, Symbol, hygiene};
|
||||
@ -179,14 +178,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
||||
|
||||
match flags {
|
||||
0 => {
|
||||
// These are "mutable" allocations as we consider them to be owned by the callee.
|
||||
let name_alloc =
|
||||
this.allocate_str(&name, MiriMemoryKind::Rust.into(), Mutability::Mut)?;
|
||||
let filename_alloc =
|
||||
this.allocate_str(&filename, MiriMemoryKind::Rust.into(), Mutability::Mut)?;
|
||||
|
||||
this.write_immediate(name_alloc.to_ref(this), &this.project_field(dest, 0)?)?;
|
||||
this.write_immediate(filename_alloc.to_ref(this), &this.project_field(dest, 1)?)?;
|
||||
throw_unsup_format!("miri_resolve_frame: v0 is not supported any more");
|
||||
}
|
||||
1 => {
|
||||
this.write_scalar(
|
||||
|
@ -12,7 +12,6 @@
|
||||
//! metadata we remembered when pushing said frame.
|
||||
|
||||
use rustc_abi::ExternAbi;
|
||||
use rustc_ast::Mutability;
|
||||
use rustc_middle::{mir, ty};
|
||||
use rustc_target::spec::PanicStrategy;
|
||||
|
||||
@ -161,7 +160,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
|
||||
// First arg: message.
|
||||
let msg = this.allocate_str(msg, MiriMemoryKind::Machine.into(), Mutability::Not)?;
|
||||
let msg = this.allocate_str_dedup(msg)?;
|
||||
|
||||
// Call the lang item.
|
||||
let panic = this.tcx.lang_items().panic_fn().unwrap();
|
||||
@ -180,7 +179,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
|
||||
let this = self.eval_context_mut();
|
||||
|
||||
// First arg: message.
|
||||
let msg = this.allocate_str(msg, MiriMemoryKind::Machine.into(), Mutability::Not)?;
|
||||
let msg = this.allocate_str_dedup(msg)?;
|
||||
|
||||
// Call the lang item.
|
||||
let panic = this.tcx.lang_items().panic_nounwind().unwrap();
|
||||
|
@ -1,69 +0,0 @@
|
||||
//@normalize-stderr-test: "::<.*>" -> ""
|
||||
|
||||
#[inline(never)]
|
||||
fn func_a() -> Box<[*mut ()]> {
|
||||
func_b::<u8>()
|
||||
}
|
||||
#[inline(never)]
|
||||
fn func_b<T>() -> Box<[*mut ()]> {
|
||||
func_c()
|
||||
}
|
||||
|
||||
macro_rules! invoke_func_d {
|
||||
() => {
|
||||
func_d()
|
||||
};
|
||||
}
|
||||
|
||||
#[inline(never)]
|
||||
fn func_c() -> Box<[*mut ()]> {
|
||||
invoke_func_d!()
|
||||
}
|
||||
#[inline(never)]
|
||||
fn func_d() -> Box<[*mut ()]> {
|
||||
unsafe { miri_get_backtrace(0) }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut seen_main = false;
|
||||
let frames = func_a();
|
||||
for frame in frames.iter() {
|
||||
let miri_frame = unsafe { miri_resolve_frame(*frame, 0) };
|
||||
let name = String::from_utf8(miri_frame.name.into()).unwrap();
|
||||
let filename = String::from_utf8(miri_frame.filename.into()).unwrap();
|
||||
|
||||
if name == "func_a" {
|
||||
assert_eq!(func_a as *mut (), miri_frame.fn_ptr);
|
||||
}
|
||||
|
||||
// Print every frame to stderr.
|
||||
let out = format!("{}:{}:{} ({})", filename, miri_frame.lineno, miri_frame.colno, name);
|
||||
eprintln!("{}", out);
|
||||
// Print the 'main' frame (and everything before it) to stdout, skipping
|
||||
// the printing of internal (and possibly fragile) libstd frames.
|
||||
// Stdout is less normalized so we see more, but it also means we can print less
|
||||
// as platform differences would lead to test suite failures.
|
||||
if !seen_main {
|
||||
println!("{}", out);
|
||||
seen_main = name == "main";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This goes at the bottom of the file so that we can change it
|
||||
// without disturbing line numbers of the functions in the backtrace.
|
||||
|
||||
extern "Rust" {
|
||||
fn miri_get_backtrace(flags: u64) -> Box<[*mut ()]>;
|
||||
fn miri_resolve_frame(ptr: *mut (), flags: u64) -> MiriFrame;
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
#[repr(C)]
|
||||
struct MiriFrame {
|
||||
name: Box<[u8]>,
|
||||
filename: Box<[u8]>,
|
||||
lineno: u32,
|
||||
colno: u32,
|
||||
fn_ptr: *mut (),
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:LL:CC (func_d)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:LL:CC (func_c)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:LL:CC (func_b)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:LL:CC (func_a)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:LL:CC (main)
|
||||
RUSTLIB/core/src/ops/function.rs:LL:CC (<fn() as std::ops::FnOnce<()>>::call_once - shim(fn()))
|
||||
RUSTLIB/std/src/sys/backtrace.rs:LL:CC (std::sys::backtrace::__rust_begin_short_backtrace)
|
||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start::{closure#0})
|
||||
RUSTLIB/core/src/ops/function.rs:LL:CC (std::ops::function::impls::call_once)
|
||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#1})
|
||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal)
|
||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start)
|
@ -1,5 +0,0 @@
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:24:14 (func_d)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:14:9 (func_c)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:9:5 (func_b::<u8>)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:5:5 (func_a)
|
||||
tests/pass/backtrace/backtrace-api-v0.rs:29:18 (main)
|
@ -2295,8 +2295,6 @@ ui/issues/issue-43853.rs
|
||||
ui/issues/issue-4387.rs
|
||||
ui/issues/issue-43910.rs
|
||||
ui/issues/issue-43923.rs
|
||||
ui/issues/issue-43925.rs
|
||||
ui/issues/issue-43926.rs
|
||||
ui/issues/issue-43988.rs
|
||||
ui/issues/issue-44023.rs
|
||||
ui/issues/issue-44056.rs
|
||||
@ -2545,8 +2543,6 @@ ui/issues/issue-6936.rs
|
||||
ui/issues/issue-69455.rs
|
||||
ui/issues/issue-69602-type-err-during-codegen-ice.rs
|
||||
ui/issues/issue-69683.rs
|
||||
ui/issues/issue-70093/issue-70093-link-directives.rs
|
||||
ui/issues/issue-70093/issue-70093.rs
|
||||
ui/issues/issue-7012.rs
|
||||
ui/issues/issue-70381.rs
|
||||
ui/issues/issue-7044.rs
|
||||
@ -2711,11 +2707,15 @@ ui/limits/issue-17913.rs
|
||||
ui/limits/issue-55878.rs
|
||||
ui/limits/issue-69485-var-size-diffs-too-large.rs
|
||||
ui/limits/issue-75158-64.rs
|
||||
ui/link-native-libs/issue-109144.rs
|
||||
ui/link-native-libs/issue-43925.rs
|
||||
ui/link-native-libs/issue-43926.rs
|
||||
ui/link-native-libs/issue-70093/issue-70093-link-directives.rs
|
||||
ui/link-native-libs/issue-70093/issue-70093.rs
|
||||
ui/linkage-attr/auxiliary/issue-12133-dylib.rs
|
||||
ui/linkage-attr/auxiliary/issue-12133-dylib2.rs
|
||||
ui/linkage-attr/auxiliary/issue-12133-rlib.rs
|
||||
ui/linkage-attr/issue-10755.rs
|
||||
ui/linkage-attr/issue-109144.rs
|
||||
ui/linkage-attr/issue-12133-1.rs
|
||||
ui/linkage-attr/issue-12133-2.rs
|
||||
ui/linkage-attr/issue-12133-3.rs
|
||||
|
@ -17,7 +17,7 @@ use ignore::Walk;
|
||||
const ENTRY_LIMIT: u32 = 901;
|
||||
// FIXME: The following limits should be reduced eventually.
|
||||
|
||||
const ISSUES_ENTRY_LIMIT: u32 = 1672;
|
||||
const ISSUES_ENTRY_LIMIT: u32 = 1667;
|
||||
|
||||
const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[
|
||||
"rs", // test source files
|
||||
|
@ -1,16 +0,0 @@
|
||||
//@ known-bug: #131227
|
||||
//@ compile-flags: -Zmir-opt-level=3
|
||||
|
||||
static mut G: () = ();
|
||||
|
||||
fn myfunc() -> i32 {
|
||||
let var = &raw mut G;
|
||||
if var.is_null() {
|
||||
return 0;
|
||||
}
|
||||
0
|
||||
}
|
||||
|
||||
fn main() {
|
||||
myfunc();
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
//@ compile-flags: --document-private-items
|
||||
//@ build-pass
|
||||
//@ only-linux
|
||||
// https://github.com/rust-lang/rust/issues/107918
|
||||
|
||||
#![no_std]
|
||||
#![no_main]
|
@ -1,4 +1,5 @@
|
||||
//@ check-pass
|
||||
// https://github.com/rust-lang/rust/issues/110900
|
||||
|
||||
#![crate_type="lib"]
|
||||
|
@ -1,5 +1,6 @@
|
||||
//@ compile-flags: --document-private-items
|
||||
//@ edition:2021
|
||||
// https://github.com/rust-lang/rust/issues/106213
|
||||
|
||||
fn use_avx() -> dyn {
|
||||
//~^ ERROR at least one trait is required for an object type
|
@ -1,5 +1,5 @@
|
||||
error[E0224]: at least one trait is required for an object type
|
||||
--> $DIR/issue-106213.rs:4:17
|
||||
--> $DIR/ice-bare-dyn-106213.rs:5:17
|
||||
|
|
||||
LL | fn use_avx() -> dyn {
|
||||
| ^^^
|
@ -1,4 +1,5 @@
|
||||
//@ compile-flags: -Znormalize-docs
|
||||
// https://github.com/rust-lang/rust/issues/105742
|
||||
use std::ops::Index;
|
||||
|
||||
pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {
|
@ -1,11 +1,11 @@
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -15,13 +15,13 @@ LL | <Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -31,13 +31,13 @@ LL | <Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -47,13 +47,13 @@ LL | Output = <Index<<Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -63,13 +63,13 @@ LL | Output = <Index<<Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -79,13 +79,13 @@ LL | Output = <Self as SVec>::Item<'a>> as SVec>::Item,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -95,13 +95,13 @@ LL | Output = <Self as SVec>::Item<T>> as SVec>::Item,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -111,13 +111,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -127,13 +127,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:4:40
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:5:40
|
||||
|
|
||||
LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -143,13 +143,13 @@ LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item<'_> = T, Output = T>) {
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:4:40
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:5:40
|
||||
|
|
||||
LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -159,13 +159,13 @@ LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item<T> = T, Output = T>) {
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -176,13 +176,13 @@ LL | <Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -193,13 +193,13 @@ LL | <Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -210,13 +210,13 @@ LL | Output = <Index<<Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -227,13 +227,13 @@ LL | Output = <Index<<Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -244,13 +244,13 @@ LL | Output = <Self as SVec>::Item<'a>> as SVec>::Item,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -261,13 +261,13 @@ LL | Output = <Self as SVec>::Item<T>> as SVec>::Item,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -278,13 +278,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -295,13 +295,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0038]: the trait `SVec` cannot be made into an object
|
||||
--> $DIR/issue-105742.rs:4:31
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:5:31
|
||||
|
|
||||
LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SVec` cannot be made into an object
|
||||
|
|
||||
note: for a trait to be "dyn-compatible" 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/issue-105742.rs:14:17
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:15:17
|
||||
|
|
||||
LL | pub trait SVec: Index<
|
||||
| ____________----__^
|
||||
@ -329,13 +329,13 @@ LL | pub fn next<'a, T>(s: &'a mut impl SVec<Item = T, Output = T>) {
|
||||
| ~~~~
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -346,13 +346,13 @@ LL | <Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -363,13 +363,13 @@ LL | <Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -380,13 +380,13 @@ LL | Output = <Index<<Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -397,13 +397,13 @@ LL | Output = <Index<<Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -414,13 +414,13 @@ LL | Output = <Self as SVec>::Item<'a>> as SVec>::Item,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -431,13 +431,13 @@ LL | Output = <Self as SVec>::Item<T>> as SVec>::Item,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -448,13 +448,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -465,13 +465,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -482,13 +482,13 @@ LL | <Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:15:21
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:16:21
|
||||
|
|
||||
LL | <Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -499,13 +499,13 @@ LL | <Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -516,13 +516,13 @@ LL | Output = <Index<<Self as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:26:37
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:27:37
|
||||
|
|
||||
LL | Output = <Index<<Self as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -533,13 +533,13 @@ LL | Output = <Index<<Self as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -550,13 +550,13 @@ LL | Output = <Self as SVec>::Item<'a>> as SVec>::Item,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:30
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:30
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -567,13 +567,13 @@ LL | Output = <Self as SVec>::Item<T>> as SVec>::Item,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -584,13 +584,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<'a>,
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:37:46
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:38:46
|
||||
|
|
||||
LL | Output = <Self as SVec>::Item> as SVec>::Item,
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
||||
@ -601,13 +601,13 @@ LL | Output = <Self as SVec>::Item> as SVec>::Item<T>,
|
||||
| +++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:61:38
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:62:38
|
||||
|
|
||||
LL | fn len(&self) -> <Self as SVec>::Item;
|
||||
| ^^^^ expected 1 lifetime argument
|
||||
|
|
||||
note: associated type defined here, with 1 lifetime parameter: `'a`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ --
|
||||
@ -617,13 +617,13 @@ LL | fn len(&self) -> <Self as SVec>::Item<'_>;
|
||||
| ++++
|
||||
|
||||
error[E0107]: missing generics for associated type `SVec::Item`
|
||||
--> $DIR/issue-105742.rs:61:38
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:62:38
|
||||
|
|
||||
LL | fn len(&self) -> <Self as SVec>::Item;
|
||||
| ^^^^ expected 1 generic argument
|
||||
|
|
||||
note: associated type defined here, with 1 generic parameter: `T`
|
||||
--> $DIR/issue-105742.rs:59:10
|
||||
--> $DIR/ice-generic-type-alias-105742.rs:60:10
|
||||
|
|
||||
LL | type Item<'a, T>;
|
||||
| ^^^^ -
|
5
tests/rustdoc-ui/issues/ice-impl-fn-generic-105737.rs
Normal file
5
tests/rustdoc-ui/issues/ice-impl-fn-generic-105737.rs
Normal file
@ -0,0 +1,5 @@
|
||||
// https://github.com/rust-lang/rust/issues/105737
|
||||
impl Vec<lol> {}
|
||||
//~^ ERROR
|
||||
|
||||
pub fn lol() {}
|
@ -1,5 +1,5 @@
|
||||
error[E0747]: constant provided when a type was expected
|
||||
--> $DIR/issue-105737.rs:1:10
|
||||
--> $DIR/ice-impl-fn-generic-105737.rs:2:10
|
||||
|
|
||||
LL | impl Vec<lol> {}
|
||||
| ^^^
|
@ -1,4 +1,5 @@
|
||||
//@ check-pass
|
||||
// https://github.com/rust-lang/rust/issues/101076
|
||||
|
||||
const _: () = {
|
||||
#[macro_export]
|
@ -1,5 +1,5 @@
|
||||
error[E0121]: the placeholder `_` is not allowed within types on item signatures for type aliases
|
||||
--> $DIR/issue-106226.rs:2:11
|
||||
--> $DIR/ice-placeholder-type-alias-106226.rs:2:11
|
||||
|
|
||||
LL | type F = [_; ()];
|
||||
| ^ not allowed in type signatures
|
3
tests/rustdoc-ui/issues/ice-raw-str-105334.rs
Normal file
3
tests/rustdoc-ui/issues/ice-raw-str-105334.rs
Normal file
@ -0,0 +1,3 @@
|
||||
// https://github.com/rust-lang/rust/issues/105334
|
||||
impl Vec< br##"*.."## > {}
|
||||
//~^ ERROR
|
@ -1,5 +1,5 @@
|
||||
error[E0747]: constant provided when a type was expected
|
||||
--> $DIR/issue-105334.rs:1:11
|
||||
--> $DIR/ice-raw-str-105334.rs:2:11
|
||||
|
|
||||
LL | impl Vec< br##"*.."## > {}
|
||||
| ^^^^^^^^^^^
|
@ -1,3 +1,4 @@
|
||||
// https://github.com/rust-lang/rust/issues/102986
|
||||
struct Struct {
|
||||
y: (typeof("hey"),),
|
||||
//~^ `typeof` is a reserved keyword but unimplemented
|
@ -1,5 +1,5 @@
|
||||
error[E0516]: `typeof` is a reserved keyword but unimplemented
|
||||
--> $DIR/issue-102986.rs:2:9
|
||||
--> $DIR/ice-typeof-102986.rs:3:9
|
||||
|
|
||||
LL | y: (typeof("hey"),),
|
||||
| ^^^^^^^^^^^^^ reserved keyword
|
@ -1,4 +1,5 @@
|
||||
//@ check-pass
|
||||
// https://github.com/rust-lang/rust/issues/103997
|
||||
|
||||
pub fn foo() {}
|
||||
|
@ -1,5 +1,5 @@
|
||||
warning: unresolved link to `Self::foo`
|
||||
--> $DIR/issue-103997.rs:5:13
|
||||
--> $DIR/ice-unresolved-self-103997.rs:6:13
|
||||
|
|
||||
LL | /// [`foo`](Self::foo)
|
||||
| ^^^^^^^^^ no item named `Self` in scope
|
@ -1,2 +0,0 @@
|
||||
impl Vec< br##"*.."## > {}
|
||||
//~^ ERROR
|
@ -1,4 +0,0 @@
|
||||
impl Vec<lol> {}
|
||||
//~^ ERROR
|
||||
|
||||
pub fn lol() {}
|
27
tests/ui-fulldeps/lexer/unicode-version.rs
Normal file
27
tests/ui-fulldeps/lexer/unicode-version.rs
Normal file
@ -0,0 +1,27 @@
|
||||
// This test is used to validate which version of Unicode is used for parsing
|
||||
// identifiers. If the Unicode version changes, it should also be updated in
|
||||
// the reference at
|
||||
// https://github.com/rust-lang/reference/blob/HEAD/src/identifiers.md.
|
||||
|
||||
//@ run-pass
|
||||
//@ check-run-results
|
||||
//@ ignore-cross-compile
|
||||
//@ reference: ident.unicode
|
||||
//@ reference: ident.normalization
|
||||
|
||||
#![feature(rustc_private)]
|
||||
|
||||
extern crate rustc_driver;
|
||||
extern crate rustc_lexer;
|
||||
extern crate rustc_parse;
|
||||
|
||||
fn main() {
|
||||
println!("Checking if Unicode version changed.");
|
||||
println!(
|
||||
"If the Unicode version changes are intentional, \
|
||||
it should also be updated in the reference at \
|
||||
https://github.com/rust-lang/reference/blob/HEAD/src/identifiers.md."
|
||||
);
|
||||
println!("Unicode XID version is: {:?}", rustc_lexer::UNICODE_XID_VERSION);
|
||||
println!("Unicode normalization version is: {:?}", rustc_parse::UNICODE_NORMALIZATION_VERSION);
|
||||
}
|
4
tests/ui-fulldeps/lexer/unicode-version.run.stdout
Normal file
4
tests/ui-fulldeps/lexer/unicode-version.run.stdout
Normal file
@ -0,0 +1,4 @@
|
||||
Checking if Unicode version changed.
|
||||
If the Unicode version changes are intentional, it should also be updated in the reference at https://github.com/rust-lang/reference/blob/HEAD/src/identifiers.md.
|
||||
Unicode XID version is: (16, 0, 0)
|
||||
Unicode normalization version is: (16, 0, 0)
|
@ -0,0 +1,19 @@
|
||||
//! Issue: <https://github.com/rust-lang/rust/issues/131227>
|
||||
//! Test that constant propagation in SwitchInt does not crash
|
||||
//! when encountering a ptr-to-int transmute.
|
||||
|
||||
//@ check-pass
|
||||
//@ compile-flags: -Zmir-enable-passes=+InstSimplify-before-inline,+DataflowConstProp
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
static mut G: i32 = 0;
|
||||
|
||||
pub fn myfunc() -> i32 {
|
||||
let var = &raw mut G;
|
||||
let u: usize = unsafe { std::mem::transmute(var) };
|
||||
match u {
|
||||
0 => 0,
|
||||
_ => 1,
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user