1
Fork 0

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:
bors 2024-12-10 03:48:20 +00:00
commit ff7906bfe1
125 changed files with 411 additions and 464 deletions

View file

@ -21,7 +21,7 @@ standard library, and documentation.
## Why Rust? ## 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. - **Reliability:** Our rich type system and ownership model ensure memory and thread safety, reducing bugs at compile-time.

View file

@ -5,8 +5,7 @@
use std::assert_matches::assert_matches; use std::assert_matches::assert_matches;
use either::{Either, Left, Right}; use either::{Either, Left, Right};
use rustc_abi::{Align, BackendRepr, HasDataLayout, Size}; use rustc_abi::{BackendRepr, HasDataLayout, Size};
use rustc_ast::Mutability;
use rustc_middle::ty::Ty; use rustc_middle::ty::Ty;
use rustc_middle::ty::layout::{LayoutOf, TyAndLayout}; use rustc_middle::ty::layout::{LayoutOf, TyAndLayout};
use rustc_middle::{bug, mir, span_bug}; use rustc_middle::{bug, mir, span_bug};
@ -1018,40 +1017,31 @@ where
self.allocate_dyn(layout, kind, MemPlaceMeta::None) self.allocate_dyn(layout, kind, MemPlaceMeta::None)
} }
/// Allocates a sequence of bytes in the interpreter's memory. /// Allocates a sequence of bytes in the interpreter's memory with alignment 1.
/// For immutable allocations, uses deduplication to reuse existing memory. /// This is allocated in immutable global memory and deduplicated.
/// For mutable allocations, creates a new unique allocation. pub fn allocate_bytes_dedup(
pub fn allocate_bytes(
&mut self, &mut self,
bytes: &[u8], bytes: &[u8],
align: Align,
kind: MemoryKind<M::MemoryKind>,
mutbl: Mutability,
) -> InterpResult<'tcx, Pointer<M::Provenance>> { ) -> InterpResult<'tcx, Pointer<M::Provenance>> {
// Use cache for immutable strings. let salt = M::get_global_alloc_salt(self, None);
if mutbl.is_not() { let id = self.tcx.allocate_bytes_dedup(bytes, salt);
// Use dedup'd allocation function.
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. // 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)) M::adjust_alloc_root_pointer(
} else { &self,
// Allocate new memory for mutable data. Pointer::from(id),
self.allocate_bytes_ptr(bytes, align, kind, mutbl) M::GLOBAL_KIND.map(MemoryKind::Machine),
} )
} }
/// Allocates a string in the interpreter's memory with metadata for length. /// Allocates a string in the interpreter's memory, returning it as a (wide) place.
/// Uses `allocate_bytes` internally but adds string-specific metadata handling. /// This is allocated in immutable global memory and deduplicated.
pub fn allocate_str( pub fn allocate_str_dedup(
&mut self, &mut self,
str: &str, str: &str,
kind: MemoryKind<M::MemoryKind>,
mutbl: Mutability,
) -> InterpResult<'tcx, MPlaceTy<'tcx, M::Provenance>> { ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::Provenance>> {
let bytes = str.as_bytes(); 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. // Create length metadata for the string.
let meta = Scalar::from_target_usize(u64::try_from(bytes.len()).unwrap(), self); let meta = Scalar::from_target_usize(u64::try_from(bytes.len()).unwrap(), self);

View file

@ -1,7 +1,7 @@
use rustc_hir::LangItem; use rustc_hir::LangItem;
use rustc_middle::query::TyCtxtAt; use rustc_middle::query::TyCtxtAt;
use rustc_middle::ty::layout::LayoutOf; use rustc_middle::ty::layout::LayoutOf;
use rustc_middle::ty::{self, Mutability}; use rustc_middle::ty::{self};
use rustc_middle::{bug, mir}; use rustc_middle::{bug, mir};
use rustc_span::symbol::Symbol; use rustc_span::symbol::Symbol;
use tracing::trace; 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 // 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. // pointless, since that would require allocating more memory than these short strings.
let file = if loc_details.file { 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 { } else {
// FIXME: This creates a new allocation each time. It might be preferable to ecx.allocate_str_dedup("<redacted>").unwrap()
// 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()
}; };
let file = file.map_provenance(CtfeProvenance::as_immutable); let file = file.map_provenance(CtfeProvenance::as_immutable);
let line = if loc_details.line { Scalar::from_u32(line) } else { Scalar::from_u32(0) }; let line = if loc_details.line { Scalar::from_u32(line) } else { Scalar::from_u32(0) };

View file

@ -33,6 +33,7 @@ pub mod unescape;
mod tests; mod tests;
use unicode_properties::UnicodeEmoji; use unicode_properties::UnicodeEmoji;
pub use unicode_xid::UNICODE_VERSION as UNICODE_XID_VERSION;
use self::LiteralKind::*; use self::LiteralKind::*;
use self::TokenKind::*; use self::TokenKind::*;

View file

@ -1479,7 +1479,7 @@ impl<'tcx> TyCtxt<'tcx> {
self.mk_adt_def_from_data(ty::AdtDefData::new(self, did, kind, variants, repr)) 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. /// Returns the same `AllocId` if called again with the same bytes.
pub fn allocate_bytes_dedup(self, bytes: &[u8], salt: usize) -> interpret::AllocId { pub fn allocate_bytes_dedup(self, bytes: &[u8], salt: usize) -> interpret::AllocId {
// Create an allocation that just contains these bytes. // Create an allocation that just contains these bytes.

View file

@ -534,8 +534,13 @@ impl<'a, 'tcx> ConstAnalysis<'a, 'tcx> {
// This allows the set of visited edges to grow monotonically with the lattice. // This allows the set of visited edges to grow monotonically with the lattice.
FlatSet::Bottom => TerminatorEdges::None, FlatSet::Bottom => TerminatorEdges::None,
FlatSet::Elem(scalar) => { FlatSet::Elem(scalar) => {
let choice = scalar.assert_scalar_int().to_bits_unchecked(); if let Ok(scalar_int) = scalar.try_to_scalar_int() {
TerminatorEdges::Single(targets.target_for_value(choice)) TerminatorEdges::Single(
targets.target_for_value(scalar_int.to_bits_unchecked()),
)
} else {
TerminatorEdges::SwitchInt { discr, targets }
}
} }
FlatSet::Top => TerminatorEdges::SwitchInt { discr, targets }, FlatSet::Top => TerminatorEdges::SwitchInt { discr, targets },
} }

View file

@ -822,7 +822,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
/// Detect guarded string literal syntax /// 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 /// using this syntax produces an error. In earlier editions, however, it
/// only results in an (allowed by default) lint, and is treated as /// only results in an (allowed by default) lint, and is treated as
/// separate tokens. /// separate tokens.

View file

@ -24,6 +24,7 @@ use rustc_data_structures::sync::Lrc;
use rustc_errors::{Diag, FatalError, PResult}; use rustc_errors::{Diag, FatalError, PResult};
use rustc_session::parse::ParseSess; use rustc_session::parse::ParseSess;
use rustc_span::{FileName, SourceFile, Span}; 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"); pub const MACRO_ARGUMENTS: Option<&str> = Some("macro arguments");

View file

@ -141,8 +141,8 @@ impl<B, C> ControlFlow<B, C> {
/// ``` /// ```
/// use std::ops::ControlFlow; /// use std::ops::ControlFlow;
/// ///
/// assert!(ControlFlow::<i32, String>::Break(3).is_break()); /// assert!(ControlFlow::<&str, i32>::Break("Stop right there!").is_break());
/// assert!(!ControlFlow::<String, i32>::Continue(3).is_break()); /// assert!(!ControlFlow::<&str, i32>::Continue(3).is_break());
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "control_flow_enum_is", since = "1.59.0")] #[stable(feature = "control_flow_enum_is", since = "1.59.0")]
@ -157,8 +157,8 @@ impl<B, C> ControlFlow<B, C> {
/// ``` /// ```
/// use std::ops::ControlFlow; /// use std::ops::ControlFlow;
/// ///
/// assert!(!ControlFlow::<i32, String>::Break(3).is_continue()); /// assert!(!ControlFlow::<&str, i32>::Break("Stop right there!").is_continue());
/// assert!(ControlFlow::<String, i32>::Continue(3).is_continue()); /// assert!(ControlFlow::<&str, i32>::Continue(3).is_continue());
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "control_flow_enum_is", since = "1.59.0")] #[stable(feature = "control_flow_enum_is", since = "1.59.0")]
@ -174,8 +174,8 @@ impl<B, C> ControlFlow<B, C> {
/// ``` /// ```
/// use std::ops::ControlFlow; /// use std::ops::ControlFlow;
/// ///
/// assert_eq!(ControlFlow::<i32, String>::Break(3).break_value(), Some(3)); /// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").break_value(), Some("Stop right there!"));
/// assert_eq!(ControlFlow::<String, i32>::Continue(3).break_value(), None); /// assert_eq!(ControlFlow::<&str, i32>::Continue(3).break_value(), None);
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "control_flow_enum", since = "1.83.0")] #[stable(feature = "control_flow_enum", since = "1.83.0")]
@ -205,8 +205,8 @@ impl<B, C> ControlFlow<B, C> {
/// ``` /// ```
/// use std::ops::ControlFlow; /// use std::ops::ControlFlow;
/// ///
/// assert_eq!(ControlFlow::<i32, String>::Break(3).continue_value(), None); /// assert_eq!(ControlFlow::<&str, i32>::Break("Stop right there!").continue_value(), None);
/// assert_eq!(ControlFlow::<String, i32>::Continue(3).continue_value(), Some(3)); /// assert_eq!(ControlFlow::<&str, i32>::Continue(3).continue_value(), Some(3));
/// ``` /// ```
#[inline] #[inline]
#[stable(feature = "control_flow_enum", since = "1.83.0")] #[stable(feature = "control_flow_enum", since = "1.83.0")]

View file

@ -48,9 +48,9 @@ fn main() {
err => { err => {
drop(err); drop(err);
if let Ok(pid) = pid { 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 { } else {
println!("WARNING: build directory locked, waiting for lock"); eprintln!("WARNING: build directory locked, waiting for lock");
} }
let mut lock = t!(build_lock.write()); let mut lock = t!(build_lock.write());
t!(lock.write(process::id().to_string().as_ref())); t!(lock.write(process::id().to_string().as_ref()));
@ -70,13 +70,13 @@ fn main() {
// changelog warning, not the `x.py setup` message. // changelog warning, not the `x.py setup` message.
let suggest_setup = config.config.is_none() && !matches!(config.cmd, Subcommand::Setup { .. }); let suggest_setup = config.config.is_none() && !matches!(config.cmd, Subcommand::Setup { .. });
if suggest_setup { if suggest_setup {
println!("WARNING: you have not made a `config.toml`"); eprintln!("WARNING: you have not made a `config.toml`");
println!( eprintln!(
"HELP: consider running `./x.py setup` or copying `config.example.toml` by running \ "HELP: consider running `./x.py setup` or copying `config.example.toml` by running \
`cp config.example.toml config.toml`" `cp config.example.toml config.toml`"
); );
} else if let Some(suggestion) = &changelog_suggestion { } else if let Some(suggestion) = &changelog_suggestion {
println!("{suggestion}"); eprintln!("{suggestion}");
} }
let pre_commit = config.src.join(".git").join("hooks").join("pre-commit"); let pre_commit = config.src.join(".git").join("hooks").join("pre-commit");
@ -86,13 +86,13 @@ fn main() {
Build::new(config).build(); Build::new(config).build();
if suggest_setup { if suggest_setup {
println!("WARNING: you have not made a `config.toml`"); eprintln!("WARNING: you have not made a `config.toml`");
println!( eprintln!(
"HELP: consider running `./x.py setup` or copying `config.example.toml` by running \ "HELP: consider running `./x.py setup` or copying `config.example.toml` by running \
`cp config.example.toml config.toml`" `cp config.example.toml config.toml`"
); );
} else if let Some(suggestion) = &changelog_suggestion { } 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. // 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| { if fs::read_to_string(pre_commit).is_ok_and(|contents| {
contents.contains("https://github.com/rust-lang/rust/issues/77620#issuecomment-705144570") 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. \ "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." Consider moving it to .git/hooks/pre-push instead, which runs less often."
); );
} }
if suggest_setup || changelog_suggestion.is_some() { 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 { if dump_bootstrap_shims {

View file

@ -306,7 +306,7 @@ fn main() {
// should run on success, after this block. // should run on success, after this block.
} }
if verbose > 0 { 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 { if let Some(mut on_fail) = on_fail {

View file

@ -287,7 +287,7 @@ impl Step for CodegenBackend {
fn run(self, builder: &Builder<'_>) { fn run(self, builder: &Builder<'_>) {
// FIXME: remove once https://github.com/rust-lang/rust/issues/112393 is resolved // FIXME: remove once https://github.com/rust-lang/rust/issues/112393 is resolved
if builder.build.config.vendor && self.backend == "gcc" { 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; return;
} }

View file

@ -1611,7 +1611,7 @@ impl Step for Sysroot {
let sysroot = sysroot_dir(compiler.stage); let sysroot = sysroot_dir(compiler.stage);
builder 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); let _ = fs::remove_dir_all(&sysroot);
t!(fs::create_dir_all(&sysroot)); t!(fs::create_dir_all(&sysroot));
@ -1681,7 +1681,7 @@ impl Step for Sysroot {
return true; return true;
} }
if !filtered_files.iter().all(|f| f != path.file_name().unwrap()) { 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 false
} else { } else {
true true
@ -2240,7 +2240,7 @@ pub fn stream_cargo(
cargo.arg(arg); cargo.arg(arg);
} }
builder.verbose(|| println!("running: {cargo:?}")); builder.verbose(|| eprintln!("running: {cargo:?}"));
if builder.config.dry_run() { if builder.config.dry_run() {
return true; return true;
@ -2261,12 +2261,12 @@ pub fn stream_cargo(
Ok(msg) => { Ok(msg) => {
if builder.config.json_output { if builder.config.json_output {
// Forward JSON to stdout. // Forward JSON to stdout.
println!("{line}"); eprintln!("{line}");
} }
cb(msg) cb(msg)
} }
// If this was informational, just print it out and continue // If this was informational, just print it out and continue
Err(_) => println!("{line}"), Err(_) => eprintln!("{line}"),
} }
} }

View file

@ -2080,7 +2080,7 @@ fn maybe_install_llvm(
{ {
let mut cmd = command(llvm_config); let mut cmd = command(llvm_config);
cmd.arg("--libfiles"); cmd.arg("--libfiles");
builder.verbose(|| println!("running {cmd:?}")); builder.verbose(|| eprintln!("running {cmd:?}"));
let files = cmd.run_capture_stdout(builder).stdout(); let files = cmd.run_capture_stdout(builder).stdout();
let build_llvm_out = &builder.llvm_out(builder.config.build); let build_llvm_out = &builder.llvm_out(builder.config.build);
let target_llvm_out = &builder.llvm_out(target); let target_llvm_out = &builder.llvm_out(target);

View file

@ -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 let Some(adjective) = adjective { format!("{adjective} ") } else { String::new() };
if len <= 10 { if len <= 10 {
for path in paths { for path in paths {
println!("fmt: {verb} {adjective}file {path}"); eprintln!("fmt: {verb} {adjective}file {path}");
} }
} else { } 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) { match get_modified_rs_files(build) {
Ok(Some(files)) => { Ok(Some(files)) => {
if files.is_empty() { if files.is_empty() {
println!("fmt info: No modified files detected for formatting."); eprintln!("fmt info: No modified files detected for formatting.");
return; return;
} }

View file

@ -134,7 +134,7 @@ impl Step for Profile {
t!(fs::remove_file(path)); t!(fs::remove_file(path));
} }
_ => { _ => {
println!("Exiting."); eprintln!("Exiting.");
crate::exit!(1); crate::exit!(1);
} }
} }
@ -184,15 +184,15 @@ pub fn setup(config: &Config, profile: Profile) {
Profile::Dist => &["dist", "build"], 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 { for cmd in suggestions {
println!("- `x.py {cmd}`"); eprintln!("- `x.py {cmd}`");
} }
if profile != Profile::Dist { if profile != Profile::Dist {
println!( eprintln!(
"For more suggestions, see https://rustc-dev-guide.rust-lang.org/building/suggested.html" "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)); t!(fs::write(path, settings));
let include_path = profile.include_path(&config.src); 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` /// Creates a toolchain link for stage1 using `rustup`
@ -256,7 +256,7 @@ impl Step for Link {
} }
if !rustup_installed(builder) { 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; return;
} }
@ -296,7 +296,7 @@ fn attempt_toolchain_link(builder: &Builder<'_>, stage_path: &str) {
} }
if try_link_toolchain(builder, stage_path) { 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" "Added `stage1` rustup toolchain; try `cargo +stage1 build` on a separate rust project to run a newly-built toolchain"
); );
} else { } else {
@ -321,14 +321,14 @@ fn toolchain_is_linked(builder: &Builder<'_>) -> bool {
return false; return false;
} }
// The toolchain has already been linked. // The toolchain has already been linked.
println!( eprintln!(
"`stage1` toolchain already linked; not attempting to link `stage1` toolchain" "`stage1` toolchain already linked; not attempting to link `stage1` toolchain"
); );
} }
None => { None => {
// In this case, we don't know if the `stage1` toolchain has been linked; // In this case, we don't know if the `stage1` toolchain has been linked;
// but `rustup` failed, so let's not go any further. // but `rustup` failed, so let's not go any further.
println!( eprintln!(
"`rustup` failed to list current toolchains; not attempting to link `stage1` toolchain" "`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() 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() { for ((letter, _), profile) in abbrev_all() {
println!("{}) {}: {}", letter, profile, profile.purpose()); eprintln!("{}) {}: {}", letter, profile, profile.purpose());
} }
let template = loop { let template = loop {
print!( eprint!(
"Please choose one ({}): ", "Please choose one ({}): ",
abbrev_all().map(|((l, _), _)| l).collect::<Vec<_>>().join("/") abbrev_all().map(|((l, _), _)| l).collect::<Vec<_>>().join("/")
); );
@ -428,7 +428,7 @@ enum PromptResult {
fn prompt_user(prompt: &str) -> io::Result<Option<PromptResult>> { fn prompt_user(prompt: &str) -> io::Result<Option<PromptResult>> {
let mut input = String::new(); let mut input = String::new();
loop { loop {
print!("{prompt} "); eprint!("{prompt} ");
io::stdout().flush()?; io::stdout().flush()?;
input.clear(); input.clear();
io::stdin().read_line(&mut input)?; io::stdin().read_line(&mut input)?;
@ -490,7 +490,7 @@ fn install_git_hook_maybe(builder: &Builder<'_>, config: &Config) -> io::Result<
return Ok(()); return Ok(());
} }
println!( eprintln!(
"\nRust's CI will automatically fail if it doesn't pass `tidy`, the internal tool for ensuring code quality. "\nRust's CI will automatically fail if it doesn't pass `tidy`, the internal tool for ensuring code quality.
If you'd like, x.py can install a git hook for you that will automatically run `test tidy` before 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 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) { 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(()); return Ok(());
} }
if !hooks_dir.exists() { if !hooks_dir.exists() {
@ -515,7 +515,7 @@ undesirable, simply delete the `pre-push` file from .git/hooks."
); );
return Err(e); 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(()) Ok(())
} }
@ -541,7 +541,7 @@ Select which editor you would like to set up [default: None]: ";
let mut input = String::new(); let mut input = String::new();
loop { loop {
print!("{}", prompt_str); eprint!("{}", prompt_str);
io::stdout().flush()?; io::stdout().flush()?;
input.clear(); input.clear();
io::stdin().read_line(&mut input)?; io::stdin().read_line(&mut input)?;
@ -656,7 +656,7 @@ impl Step for Editor {
if let Some(editor_kind) = editor_kind { if let Some(editor_kind) = editor_kind {
while !t!(create_editor_settings_maybe(config, editor_kind.clone())) {} while !t!(create_editor_settings_maybe(config, editor_kind.clone())) {}
} else { } else {
println!("Ok, skipping editor setup!"); eprintln!("Ok, skipping editor setup!");
} }
} }
Err(e) => eprintln!("Could not determine the editor: {e}"), 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); mismatched_settings = Some(false);
} }
} }
println!( eprintln!(
"\nx.py can automatically install the recommended `{settings_filename}` file for rustc development" "\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::Yes) => true,
Some(PromptResult::Print) => false, Some(PromptResult::Print) => false,
_ => { _ => {
println!("Ok, skipping settings!"); eprintln!("Ok, skipping settings!");
return Ok(true); return Ok(true);
} }
}; };
@ -735,9 +735,9 @@ fn create_editor_settings_maybe(config: &Config, editor: EditorKind) -> io::Resu
_ => "Created", _ => "Created",
}; };
fs::write(&settings_path, editor.settings_template())?; fs::write(&settings_path, editor.settings_template())?;
println!("{verb} `{}`", settings_filename); eprintln!("{verb} `{}`", settings_filename);
} else { } else {
println!("\n{}", editor.settings_template()); eprintln!("\n{}", editor.settings_template());
} }
Ok(should_create) Ok(should_create)
} }

View file

@ -66,6 +66,6 @@ pub fn suggest(builder: &Builder<'_>, run: bool) {
build.build(); build.build();
} }
} else { } 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");
} }
} }

View file

@ -471,11 +471,11 @@ impl Miri {
// We re-use the `cargo` from above. // We re-use the `cargo` from above.
cargo.arg("--print-sysroot"); cargo.arg("--print-sysroot");
builder.verbose(|| println!("running: {cargo:?}")); builder.verbose(|| eprintln!("running: {cargo:?}"));
let stdout = cargo.run_capture_stdout(builder).stdout(); let stdout = cargo.run_capture_stdout(builder).stdout();
// Output is "<sysroot>\n". // Output is "<sysroot>\n".
let sysroot = stdout.trim_end(); 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) 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); let mut cmd = builder.rustdoc_cmd(compiler);
builder.add_rust_test_threads(&mut cmd); builder.add_rust_test_threads(&mut cmd);
// allow for unstable options such as new editions // allow for unstable options such as new editions

View file

@ -523,7 +523,7 @@ impl Builder<'_> {
let sysroot_str = sysroot.as_os_str().to_str().expect("sysroot should be UTF-8"); 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) { 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); let mut rustflags = Rustflags::new(target);

View file

@ -392,14 +392,14 @@ impl StepDescription {
fn is_excluded(&self, builder: &Builder<'_>, pathset: &PathSet) -> bool { fn is_excluded(&self, builder: &Builder<'_>, pathset: &PathSet) -> bool {
if builder.config.skip.iter().any(|e| pathset.has(e, builder.kind)) { if builder.config.skip.iter().any(|e| pathset.has(e, builder.kind)) {
if !matches!(builder.config.dry_run, DryRun::SelfCheck) { if !matches!(builder.config.dry_run, DryRun::SelfCheck) {
println!("Skipping {pathset:?} because it is excluded"); eprintln!("Skipping {pathset:?} because it is excluded");
} }
return true; return true;
} }
if !builder.config.skip.is_empty() && !matches!(builder.config.dry_run, DryRun::SelfCheck) { if !builder.config.skip.is_empty() && !matches!(builder.config.dry_run, DryRun::SelfCheck) {
builder.verbose(|| { builder.verbose(|| {
println!( eprintln!(
"{:?} not skipped for {:?} -- not in {:?}", "{:?} not skipped for {:?} -- not in {:?}",
pathset, self.name, builder.config.skip pathset, self.name, builder.config.skip
) )
@ -1437,11 +1437,11 @@ impl<'a> Builder<'a> {
panic!("{}", out); panic!("{}", out);
} }
if let Some(out) = self.cache.get(&step) { 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; 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())); stack.push(Box::new(step.clone()));
} }
@ -1462,7 +1462,7 @@ impl<'a> Builder<'a> {
let step_string = format!("{step:?}"); let step_string = format!("{step:?}");
let brace_index = step_string.find('{').unwrap_or(0); let brace_index = step_string.find('{').unwrap_or(0);
let type_string = type_name::<S>(); let type_string = type_name::<S>();
println!( eprintln!(
"[TIMING] {} {} -- {}.{:03}", "[TIMING] {} {} -- {}.{:03}",
&type_string.strip_prefix("bootstrap::").unwrap_or(type_string), &type_string.strip_prefix("bootstrap::").unwrap_or(type_string),
&step_string[brace_index..], &step_string[brace_index..],
@ -1479,7 +1479,9 @@ impl<'a> Builder<'a> {
let cur_step = stack.pop().expect("step stack empty"); let cur_step = stack.pop().expect("step stack empty");
assert_eq!(cur_step.downcast_ref(), Some(&step)); 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()); self.cache.put(step, out.clone());
out out
} }

View file

@ -1293,7 +1293,7 @@ impl Config {
.map(|change_id| change_id.inner.map(crate::find_recent_config_change_ids)) .map(|change_id| change_id.inner.map(crate::find_recent_config_change_ids))
{ {
if !changes.is_empty() { if !changes.is_empty() {
println!( eprintln!(
"WARNING: There have been changes to x.py since you last updated:\n{}", "WARNING: There have been changes to x.py since you last updated:\n{}",
crate::human_readable_changes(&changes) crate::human_readable_changes(&changes)
); );
@ -1559,7 +1559,7 @@ impl Config {
} }
if cargo_clippy.is_some() && rustc.is_none() { if cargo_clippy.is_some() && rustc.is_none() {
println!( eprintln!(
"WARNING: Using `build.cargo-clippy` without `build.rustc` usually fails due to toolchain conflict." "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. // FIXME: Remove this option at the end of 2024.
if parallel_compiler.is_some() { 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" "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) { if available_backends.contains(&backend) {
panic!("Invalid value '{s}' for 'rust.codegen-backends'. Instead, please use '{backend}'."); panic!("Invalid value '{s}' for 'rust.codegen-backends'. Instead, please use '{backend}'.");
} else { } 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. \ Codegen backends are mostly defined without the '{CODEGEN_BACKEND_PREFIX}' prefix. \
In this case, it would be referred to as '{backend}'."); 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. // 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 let Some(commit) = &config.download_rustc_commit {
if is_user_configured_rust_channel { 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." "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 { if config.llvm_from_ci {
let warn = |option: &str| { let warn = |option: &str| {
println!( eprintln!(
"WARNING: `{option}` will only be used on `compiler/rustc_llvm` build, not for the LLVM build." "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." "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 they've chosen a different value.
if libzstd.is_some() { if libzstd.is_some() {
println!( eprintln!(
"WARNING: when using `download-ci-llvm`, the local `llvm.libzstd` option, \ "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 \ like almost all `llvm.*` options, will be ignored and set by the LLVM CI \
artifacts builder config." artifacts builder config."
); );
println!( eprintln!(
"HELP: To use `llvm.libzstd` for LLVM/LLD builds, set `download-ci-llvm` option to false." "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) { if available_backends.contains(&backend) {
panic!("Invalid value '{s}' for 'target.{triple}.codegen-backends'. Instead, please use '{backend}'."); panic!("Invalid value '{s}' for 'target.{triple}.codegen-backends'. Instead, please use '{backend}'.");
} else { } 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. \ Codegen backends are mostly defined without the '{CODEGEN_BACKEND_PREFIX}' prefix. \
In this case, it would be referred to as '{backend}'."); In this case, it would be referred to as '{backend}'.");
} }
@ -2304,7 +2304,7 @@ impl Config {
if self.dry_run() { if self.dry_run() {
return Ok(()); return Ok(());
} }
self.verbose(|| println!("running: {cmd:?}")); self.verbose(|| eprintln!("running: {cmd:?}"));
build_helper::util::try_run(cmd, self.is_verbose()) 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 // 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. // to not break CI. For non-CI environments, we should return an error.
if CiEnv::is_ci() { 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; return None;
} else { } else {
panic!("ERROR: LLVM submodule has changes, `download-rustc` can't be used."); 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") { let ci_config_toml = match self.get_builder_toml("ci-rustc") {
Ok(ci_config_toml) => ci_config_toml, Ok(ci_config_toml) => ci_config_toml,
Err(e) if e.to_string().contains("unknown field") => { 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."); eprintln!("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!("HELP: Consider rebasing to a newer commit if available.");
return None; return None;
}, },
Err(e) => { Err(e) => {
@ -2516,7 +2516,7 @@ impl Config {
.is_some_and(|s| s == "1" || s == "true"); .is_some_and(|s| s == "1" || s == "true");
if disable_ci_rustc_if_incompatible && res.is_err() { 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; return None;
} }
@ -2701,7 +2701,7 @@ impl Config {
return; return;
} }
println!("Updating submodule {relative_path}"); eprintln!("Updating submodule {relative_path}");
self.check_run( self.check_run(
helpers::git(Some(&self.src)) helpers::git(Some(&self.src))
.run_always() .run_always()
@ -2824,7 +2824,7 @@ impl Config {
Some(StringOrBool::Bool(true)) => false, Some(StringOrBool::Bool(true)) => false,
Some(StringOrBool::String(s)) if s == "if-unchanged" => { Some(StringOrBool::String(s)) if s == "if-unchanged" => {
if !self.rust_info.is_managed_git_subrepository() { if !self.rust_info.is_managed_git_subrepository() {
println!( eprintln!(
"ERROR: `download-rustc=if-unchanged` is only compatible with Git managed sources." "ERROR: `download-rustc=if-unchanged` is only compatible with Git managed sources."
); );
crate::exit!(1); crate::exit!(1);
@ -2857,10 +2857,10 @@ impl Config {
if if_unchanged { if if_unchanged {
return None; return None;
} }
println!("ERROR: could not find commit hash for downloading rustc"); eprintln!("ERROR: could not find commit hash for downloading rustc");
println!("HELP: maybe your repository history is too shallow?"); eprintln!("HELP: maybe your repository history is too shallow?");
println!("HELP: consider setting `rust.download-rustc=false` in config.toml"); eprintln!("HELP: consider setting `rust.download-rustc=false` in config.toml");
println!("HELP: or fetch enough history to include one upstream commit"); eprintln!("HELP: or fetch enough history to include one upstream commit");
crate::exit!(1); crate::exit!(1);
} }
}; };
@ -2899,7 +2899,7 @@ impl Config {
let if_unchanged = || { let if_unchanged = || {
if self.rust_info.is_from_tarball() { if self.rust_info.is_from_tarball() {
// Git is needed for running "if-unchanged" logic. // Git is needed for running "if-unchanged" logic.
println!( eprintln!(
"WARNING: 'if-unchanged' has no effect on tarball sources; ignoring `download-ci-llvm`." "WARNING: 'if-unchanged' has no effect on tarball sources; ignoring `download-ci-llvm`."
); );
return false; return false;
@ -2948,10 +2948,10 @@ impl Config {
// Only commits merged by bors will have CI artifacts. // Only commits merged by bors will have CI artifacts.
let commit = get_closest_merge_commit(Some(&self.src), &self.git_config(), &[]).unwrap(); let commit = get_closest_merge_commit(Some(&self.src), &self.git_config(), &[]).unwrap();
if commit.is_empty() { if commit.is_empty() {
println!("error: could not find commit hash for downloading components from CI"); eprintln!("error: could not find commit hash for downloading components from CI");
println!("help: maybe your repository history is too shallow?"); eprintln!("help: maybe your repository history is too shallow?");
println!("help: consider disabling `{option_name}`"); eprintln!("help: consider disabling `{option_name}`");
println!("help: or fetch enough history to include one upstream commit"); eprintln!("help: or fetch enough history to include one upstream commit");
crate::exit!(1); crate::exit!(1);
} }
@ -2963,14 +2963,14 @@ impl Config {
if has_changes { if has_changes {
if if_unchanged { if if_unchanged {
if self.is_verbose() { if self.is_verbose() {
println!( eprintln!(
"warning: saw changes to one of {modified_paths:?} since {commit}; \ "warning: saw changes to one of {modified_paths:?} since {commit}; \
ignoring `{option_name}`" ignoring `{option_name}`"
); );
} }
return None; return None;
} }
println!( eprintln!(
"warning: `{option_name}` is enabled, but there are changes to one of {modified_paths:?}" "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) => { ($current:expr, $expected:expr) => {
if let Some(current) = &$current { if let Some(current) = &$current {
if Some(current) != $expected.as_ref() { if Some(current) != $expected.as_ref() {
println!( eprintln!(
"WARNING: `llvm.{}` has no effect with `llvm.download-ci-llvm`. \ "WARNING: `llvm.{}` has no effect with `llvm.download-ci-llvm`. \
Current value: {:?}, Expected value(s): {}{:?}", Current value: {:?}, Expected value(s): {}{:?}",
stringify!($expected).replace("_", "-"), stringify!($expected).replace("_", "-"),
@ -3112,7 +3112,7 @@ fn check_incompatible_options_for_ci_rustc(
($current:expr, $expected:expr, $config_section:expr) => { ($current:expr, $expected:expr, $config_section:expr) => {
if let Some(current) = &$current { if let Some(current) = &$current {
if Some(current) != $expected.as_ref() { if Some(current) != $expected.as_ref() {
println!( eprintln!(
"WARNING: `{}` has no effect with `rust.download-rustc`. \ "WARNING: `{}` has no effect with `rust.download-rustc`. \
Current value: {:?}, Expected value(s): {}{:?}", Current value: {:?}, Expected value(s): {}{:?}",
format!("{}.{}", $config_section, stringify!($expected).replace("_", "-")), format!("{}.{}", $config_section, stringify!($expected).replace("_", "-")),

View file

@ -196,12 +196,12 @@ impl Flags {
if let Ok(HelpVerboseOnly { help: true, verbose: 1.., cmd: subcommand }) = if let Ok(HelpVerboseOnly { help: true, verbose: 1.., cmd: subcommand }) =
HelpVerboseOnly::try_parse_from(normalize_args(args)) 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 config = Config::parse(Self::parse(&[String::from("build")]));
let build = Build::new(config); let build = Build::new(config);
let paths = Builder::get_help(&build, subcommand); let paths = Builder::get_help(&build, subcommand);
if let Some(s) = paths { if let Some(s) = paths {
println!("{s}"); eprintln!("{s}");
} else { } else {
panic!("No paths available for subcommand `{}`", subcommand.as_str()); panic!("No paths available for subcommand `{}`", subcommand.as_str());
} }

View file

@ -77,7 +77,7 @@ impl Config {
if self.dry_run() && !cmd.run_always { if self.dry_run() && !cmd.run_always {
return true; return true;
} }
self.verbose(|| println!("running: {cmd:?}")); self.verbose(|| eprintln!("running: {cmd:?}"));
check_run(cmd, self.is_verbose()) check_run(cmd, self.is_verbose())
} }
@ -144,7 +144,7 @@ impl Config {
/// Please see <https://nixos.org/patchelf.html> for more information /// Please see <https://nixos.org/patchelf.html> for more information
fn fix_bin_or_dylib(&self, fname: &Path) { fn fix_bin_or_dylib(&self, fname: &Path) {
assert_eq!(SHOULD_FIX_BINS_AND_DYLIBS.get(), Some(&true)); 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. // Only build `.nix-deps` once.
static NIX_DEPS_DIR: OnceLock<PathBuf> = OnceLock::new(); 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) { 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/. // 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()); let tempfile = self.tempdir().join(dest_path.file_name().unwrap());
// While bootstrap itself only supports http and https downloads, downstream forks might // 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) { 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. // Try curl. If that fails and we are on windows, fallback to PowerShell.
// options should be kept in sync with // options should be kept in sync with
// src/bootstrap/src/core/download.rs // src/bootstrap/src/core/download.rs
@ -341,7 +341,7 @@ impl Config {
short_path = short_path.strip_prefix(pattern).unwrap_or(short_path); short_path = short_path.strip_prefix(pattern).unwrap_or(short_path);
let dst_path = dst.join(short_path); let dst_path = dst.join(short_path);
self.verbose(|| { self.verbose(|| {
println!("extracting {} to {}", original_path.display(), dst.display()) eprintln!("extracting {} to {}", original_path.display(), dst.display())
}); });
if !t!(member.unpack_in(dst)) { if !t!(member.unpack_in(dst)) {
panic!("path traversal attack ??"); panic!("path traversal attack ??");
@ -365,7 +365,7 @@ impl Config {
pub(crate) fn verify(&self, path: &Path, expected: &str) -> bool { pub(crate) fn verify(&self, path: &Path, expected: &str) -> bool {
use sha2::Digest; use sha2::Digest;
self.verbose(|| println!("verifying {}", path.display())); self.verbose(|| eprintln!("verifying {}", path.display()));
if self.dry_run() { if self.dry_run() {
return false; return false;
@ -391,7 +391,7 @@ impl Config {
let verified = checksum == expected; let verified = checksum == expected;
if !verified { if !verified {
println!( eprintln!(
"invalid checksum: \n\ "invalid checksum: \n\
found: {checksum}\n\ found: {checksum}\n\
expected: {expected}", 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. /// Functions that are only ever called once, but named for clarify and to avoid thousand-line functions.
impl Config { impl Config {
pub(crate) fn download_clippy(&self) -> PathBuf { 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 date = &self.stage0_metadata.compiler.date;
let version = &self.stage0_metadata.compiler.version; let version = &self.stage0_metadata.compiler.version;
@ -518,7 +518,7 @@ impl Config {
} }
pub(crate) fn download_ci_rustc(&self, commit: &str) { 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); 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 // 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"))] #[cfg(not(feature = "bootstrap-self-test"))]
pub(crate) fn download_beta_toolchain(&self) { 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 date = &self.stage0_metadata.compiler.date;
let version = &self.stage0_metadata.compiler.version; let version = &self.stage0_metadata.compiler.version;
@ -677,7 +677,7 @@ impl Config {
return; return;
} else { } else {
self.verbose(|| { self.verbose(|| {
println!( eprintln!(
"ignoring cached file {} due to failed verification", "ignoring cached file {} due to failed verification",
tarball.display() tarball.display()
) )
@ -776,10 +776,10 @@ download-rustc = false
t!(check_incompatible_options_for_ci_llvm(current_config_toml, ci_config_toml)); t!(check_incompatible_options_for_ci_llvm(current_config_toml, ci_config_toml));
} }
Err(e) if e.to_string().contains("unknown field") => { 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." "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) => { Err(e) => {
eprintln!("ERROR: Failed to parse CI LLVM config.toml: {e}"); eprintln!("ERROR: Failed to parse CI LLVM config.toml: {e}");

View file

@ -237,11 +237,11 @@ than building it.
stage0_supported_target_list.intersection(&missing_targets_hashset).collect(); stage0_supported_target_list.intersection(&missing_targets_hashset).collect();
if !duplicated_targets.is_empty() { if !duplicated_targets.is_empty() {
println!( eprintln!(
"Following targets supported from the stage0 compiler, please remove them from STAGE0_MISSING_TARGETS list." "Following targets supported from the stage0 compiler, please remove them from STAGE0_MISSING_TARGETS list."
); );
for duplicated_target in duplicated_targets { for duplicated_target in duplicated_targets {
println!(" {duplicated_target}"); eprintln!(" {duplicated_target}");
} }
std::process::exit(1); std::process::exit(1);
} }

View file

@ -406,11 +406,11 @@ impl Build {
.unwrap() .unwrap()
.trim(); .trim();
if local_release.split('.').take(2).eq(version.split('.').take(2)) { 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.local_rebuild = true;
} }
build.verbose(|| println!("finding compilers")); build.verbose(|| eprintln!("finding compilers"));
utils::cc_detect::find(&build); utils::cc_detect::find(&build);
// When running `setup`, the profile is about to change, so any requirements we have now may // 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 // 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. // Similarly, for `setup` we don't actually need submodules or cargo metadata.
if !matches!(build.config.cmd, Subcommand::Setup { .. }) { 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); crate::core::sanity::check(&mut build);
// Make sure we update these before gathering metadata so we don't get an error about missing // 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. // Now, update all existing submodules.
build.update_existing_submodules(); build.update_existing_submodules();
build.verbose(|| println!("learning about cargo")); build.verbose(|| eprintln!("learning about cargo"));
crate::core::metadata::build(&mut build); crate::core::metadata::build(&mut build);
} }
@ -605,7 +605,7 @@ impl Build {
let stamp = dir.join(".stamp"); let stamp = dir.join(".stamp");
let mut cleared = false; let mut cleared = false;
if mtime(&stamp) < mtime(input) { if mtime(&stamp) < mtime(input) {
self.verbose(|| println!("Dirty - {}", dir.display())); self.verbose(|| eprintln!("Dirty - {}", dir.display()));
let _ = fs::remove_dir_all(dir); let _ = fs::remove_dir_all(dir);
cleared = true; cleared = true;
} else if stamp.exists() { } else if stamp.exists() {
@ -890,7 +890,7 @@ impl Build {
let executed_at = std::panic::Location::caller(); let executed_at = std::panic::Location::caller();
self.verbose(|| { 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(); let cmd = command.as_command_mut();
@ -947,7 +947,7 @@ Executed at: {executed_at}"#,
let fail = |message: &str, output: CommandOutput| -> ! { let fail = |message: &str, output: CommandOutput| -> ! {
if self.is_verbose() { if self.is_verbose() {
println!("{message}"); eprintln!("{message}");
} else { } else {
let (stdout, stderr) = (output.stdout_if_present(), output.stderr_if_present()); let (stdout, stderr) = (output.stdout_if_present(), output.stderr_if_present());
// If the command captures output, the user would not see any indication that // 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) = if let Some(stdout) =
output.stdout_if_present().take_if(|s| !s.trim().is_empty()) 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) = if let Some(stderr) =
output.stderr_if_present().take_if(|s| !s.trim().is_empty()) 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 { } 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); exit!(1);
@ -1011,7 +1011,7 @@ Executed at: {executed_at}"#,
match self.config.dry_run { match self.config.dry_run {
DryRun::SelfCheck => (), DryRun::SelfCheck => (),
DryRun::Disabled | DryRun::UserSelected => { DryRun::Disabled | DryRun::UserSelected => {
println!("{msg}"); eprintln!("{msg}");
} }
} }
} }
@ -1666,7 +1666,7 @@ Executed at: {executed_at}"#,
if self.config.dry_run() { if self.config.dry_run() {
return; return;
} }
self.verbose_than(1, || println!("Copy/Link {src:?} to {dst:?}")); self.verbose_than(1, || eprintln!("Copy/Link {src:?} to {dst:?}"));
if src == dst { if src == dst {
return; return;
} }
@ -1775,7 +1775,7 @@ Executed at: {executed_at}"#,
return; return;
} }
let dst = dstdir.join(src.file_name().unwrap()); 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)); t!(fs::create_dir_all(dstdir));
if !src.exists() { if !src.exists() {
panic!("ERROR: File \"{}\" not found!", src.display()); panic!("ERROR: File \"{}\" not found!", src.display());

View file

@ -155,15 +155,15 @@ pub fn find_target(build: &Build, target: TargetSelection) {
build.cxx.borrow_mut().insert(target, compiler); build.cxx.borrow_mut().insert(target, compiler);
} }
build.verbose(|| println!("CC_{} = {:?}", target.triple, build.cc(target))); build.verbose(|| eprintln!("CC_{} = {:?}", target.triple, build.cc(target)));
build.verbose(|| println!("CFLAGS_{} = {cflags:?}", target.triple)); build.verbose(|| eprintln!("CFLAGS_{} = {cflags:?}", target.triple));
if let Ok(cxx) = build.cxx(target) { if let Ok(cxx) = build.cxx(target) {
let cxxflags = build.cflags(target, GitRepo::Rustc, CLang::Cxx); let cxxflags = build.cflags(target, GitRepo::Rustc, CLang::Cxx);
build.verbose(|| println!("CXX_{} = {cxx:?}", target.triple)); build.verbose(|| eprintln!("CXX_{} = {cxx:?}", target.triple));
build.verbose(|| println!("CXXFLAGS_{} = {cxxflags:?}", target.triple)); build.verbose(|| eprintln!("CXXFLAGS_{} = {cxxflags:?}", target.triple));
} }
if let Some(ar) = ar { 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); build.ar.borrow_mut().insert(target, ar);
} }

View file

@ -135,7 +135,7 @@ impl Drop for TimeIt {
fn drop(&mut self) { fn drop(&mut self) {
let time = self.1.elapsed(); let time = self.1.elapsed();
if !self.0 { 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() { let status = match cmd.as_command_mut().status() {
Ok(status) => status, Ok(status) => status,
Err(e) => { Err(e) => {
println!("failed to execute command: {cmd:?}\nERROR: {e}"); eprintln!("failed to execute command: {cmd:?}\nERROR: {e}");
return false; return false;
} }
}; };
if !status.success() && print_cmd_on_fail { if !status.success() && print_cmd_on_fail {
println!( eprintln!(
"\n\ncommand did not execute successfully: {cmd:?}\n\ "\n\ncommand did not execute successfully: {cmd:?}\n\
expected success, got: {status}\n\n" expected success, got: {status}\n\n"
); );

View file

@ -185,7 +185,7 @@ impl BuildMetrics {
if version.format_version == CURRENT_FORMAT_VERSION { if version.format_version == CURRENT_FORMAT_VERSION {
t!(serde_json::from_slice::<JsonRoot>(&contents)).invocations t!(serde_json::from_slice::<JsonRoot>(&contents)).invocations
} else { } else {
println!( eprintln!(
"WARNING: overriding existing build/metrics.json, as it's not \ "WARNING: overriding existing build/metrics.json, as it's not \
compatible with build metrics format version {CURRENT_FORMAT_VERSION}." compatible with build metrics format version {CURRENT_FORMAT_VERSION}."
); );

View file

@ -56,7 +56,7 @@ fn run_tests(builder: &Builder<'_>, cmd: &mut BootstrapCommand, stream: bool) ->
let cmd = cmd.as_command_mut(); let cmd = cmd.as_command_mut();
cmd.stdout(Stdio::piped()); cmd.stdout(Stdio::piped());
builder.verbose(|| println!("running: {cmd:?}")); builder.verbose(|| eprintln!("running: {cmd:?}"));
let mut process = cmd.spawn().unwrap(); 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(); let result = process.wait_with_output().unwrap();
if !result.status.success() && builder.is_verbose() { if !result.status.success() && builder.is_verbose() {
println!( eprintln!(
"\n\ncommand did not execute successfully: {cmd:?}\n\ "\n\ncommand did not execute successfully: {cmd:?}\n\
expected success, got: {}", expected success, got: {}",
result.status result.status
@ -135,7 +135,9 @@ impl<'a> Renderer<'a> {
if self.up_to_date_tests > 0 { if self.up_to_date_tests > 0 {
let n = self.up_to_date_tests; let n = self.up_to_date_tests;
let s = if n > 1 { "s" } else { "" }; 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) { fn render_test_outcome_verbose(&self, outcome: Outcome<'_>, test: &TestOutcome) {
print!("test {} ... ", test.name); eprint!("test {} ... ", test.name);
self.builder.colored_stdout(|stdout| outcome.write_long(stdout)).unwrap(); self.builder.colored_stderr(|stdout| outcome.write_long(stdout)).unwrap();
if let Some(exec_time) = test.exec_time { 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) { 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 { if let Some(total) = self.tests_count {
let total = total.to_string(); let total = total.to_string();
let executed = format!("{:>width$}", self.executed_tests - 1, width = total.len()); 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 = 0;
} }
self.terse_tests_in_line += 1; 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(); let _ = std::io::stdout().flush();
} }
fn render_suite_outcome(&self, outcome: Outcome<'_>, suite: &SuiteOutcome) { 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. // The terse output doesn't end with a newline, so we need to add it ourselves.
if !self.builder.config.verbose_tests { if !self.builder.config.verbose_tests {
println!(); eprintln!();
} }
if !self.failures.is_empty() { if !self.failures.is_empty() {
println!("\nfailures:\n"); eprintln!("\nfailures:\n");
for failure in &self.failures { for failure in &self.failures {
if failure.stdout.is_some() || failure.message.is_some() { if failure.stdout.is_some() || failure.message.is_some() {
println!("---- {} stdout ----", failure.name); eprintln!("---- {} stdout ----", failure.name);
if let Some(stdout) = &failure.stdout { if let Some(stdout) = &failure.stdout {
println!("{stdout}"); eprintln!("{stdout}");
} }
if let Some(message) = &failure.message { if let Some(message) = &failure.message {
println!("NOTE: {message}"); eprintln!("NOTE: {message}");
} }
} }
} }
println!("\nfailures:"); eprintln!("\nfailures:");
for failure in &self.failures { for failure in &self.failures {
println!(" {}", failure.name); eprintln!(" {}", failure.name);
} }
} }
if !self.benches.is_empty() { if !self.benches.is_empty() {
println!("\nbenchmarks:"); eprintln!("\nbenchmarks:");
let mut rows = Vec::new(); let mut rows = Vec::new();
for bench in &self.benches { 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_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); let max_2 = rows.iter().map(|r| r.2.len()).max().unwrap_or(0);
for row in &rows { 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: "); eprint!("\ntest result: ");
self.builder.colored_stdout(|stdout| outcome.write_long(stdout)).unwrap(); self.builder.colored_stderr(|stdout| outcome.write_long(stdout)).unwrap();
println!( eprintln!(
". {} passed; {} failed; {} ignored; {} measured; {} filtered out{time}\n", ". {} passed; {} failed; {} ignored; {} measured; {} filtered out{time}\n",
suite.passed, suite.passed,
suite.failed, suite.failed,
@ -274,7 +276,7 @@ impl<'a> Renderer<'a> {
fn render_message(&mut self, message: Message) { fn render_message(&mut self, message: Message) {
match message { match message {
Message::Suite(SuiteMessage::Started { test_count }) => { Message::Suite(SuiteMessage::Started { test_count }) => {
println!("\nrunning {test_count} tests"); eprintln!("\nrunning {test_count} tests");
self.executed_tests = 0; self.executed_tests = 0;
self.terse_tests_in_line = 0; self.terse_tests_in_line = 0;
self.tests_count = Some(test_count); self.tests_count = Some(test_count);
@ -314,7 +316,7 @@ impl<'a> Renderer<'a> {
self.failures.push(outcome); self.failures.push(outcome);
} }
Message::Test(TestMessage::Timeout { name }) => { 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 Message::Test(TestMessage::Started) => {} // Not useful
} }

View file

@ -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. // 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 { let compression_profile = if self.builder.kind == Kind::Install {
self.builder.verbose(|| { 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" indicates that the rust-installer won't produce compressed tarball sources.
"no-op" "no-op"

View file

@ -144,7 +144,7 @@ where
} }
if !wrote_data { 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); assert!(diff_output.metadata().unwrap().len() == 0);
return false; return false;
} else if verbose { } else if verbose {

View file

@ -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") { if config.remote_test_client.is_some() && !config.target.contains("android") {
println!( eprintln!(
"WARNING: debuginfo tests are not available when \ "WARNING: debuginfo tests are not available when \
testing with remote" testing with remote"
); );
@ -28,7 +28,7 @@ pub(crate) fn configure_gdb(config: &Config) -> Option<Arc<Config>> {
} }
if config.target.contains("android") { if config.target.contains("android") {
println!( eprintln!(
"{} debug-info test uses tcp 5039 port.\ "{} debug-info test uses tcp 5039 port.\
please reserve it", please reserve it",
config.target config.target
@ -50,7 +50,7 @@ pub(crate) fn configure_lldb(config: &Config) -> Option<Arc<Config>> {
config.lldb_python_dir.as_ref()?; config.lldb_python_dir.as_ref()?;
if let Some(350) = config.lldb_version { if let Some(350) = config.lldb_version {
println!( eprintln!(
"WARNING: The used version of LLDB (350) has a \ "WARNING: The used version of LLDB (350) has a \
known issue that breaks debuginfo tests. See \ known issue that breaks debuginfo tests. See \
issue #32520 for more information. Skipping all \ issue #32520 for more information. Skipping all \

View file

@ -188,8 +188,8 @@ pub fn parse_config(args: Vec<String>) -> Config {
let (argv0, args_) = args.split_first().unwrap(); let (argv0, args_) = args.split_first().unwrap();
if args.len() == 1 || args[1] == "-h" || args[1] == "--help" { if args.len() == 1 || args[1] == "-h" || args[1] == "--help" {
let message = format!("Usage: {} [OPTIONS] [TESTNAME...]", argv0); let message = format!("Usage: {} [OPTIONS] [TESTNAME...]", argv0);
println!("{}", opts.usage(&message)); eprintln!("{}", opts.usage(&message));
println!(); eprintln!();
panic!() panic!()
} }
@ -200,8 +200,8 @@ pub fn parse_config(args: Vec<String>) -> Config {
if matches.opt_present("h") || matches.opt_present("help") { if matches.opt_present("h") || matches.opt_present("help") {
let message = format!("Usage: {} [OPTIONS] [TESTNAME...]", argv0); let message = format!("Usage: {} [OPTIONS] [TESTNAME...]", argv0);
println!("{}", opts.usage(&message)); eprintln!("{}", opts.usage(&message));
println!(); eprintln!();
panic!() panic!()
} }
@ -508,7 +508,7 @@ pub fn run_tests(config: Arc<Config>) {
// easy to miss which tests failed, and as such fail to reproduce // easy to miss which tests failed, and as such fail to reproduce
// the failure locally. // the failure locally.
println!( eprintln!(
"Some tests failed in compiletest suite={}{} mode={} host={} target={}", "Some tests failed in compiletest suite={}{} mode={} host={} target={}",
config.suite, config.suite,
config config

View file

@ -131,7 +131,7 @@ pub fn run(config: Arc<Config>, testpaths: &TestPaths, revision: Option<&str>) {
if config.verbose { if config.verbose {
// We're going to be dumping a lot of info. Start on a new line. // 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()); debug!("running {:?}", testpaths.file.display());
let mut props = TestProps::from_file(&testpaths.file, revision, &config); 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)); self.error(&format!("{} test did not emit an error", self.config.mode));
if self.config.mode == crate::common::Mode::Ui { 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, || ()); proc_res.fatal(None, || ());
}; };
@ -774,20 +774,20 @@ impl<'test> TestCx<'test> {
unexpected.len(), unexpected.len(),
not_found.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() { if !unexpected.is_empty() {
println!("{}", "--- unexpected errors (from JSON output) ---".green()); eprintln!("{}", "--- unexpected errors (from JSON output) ---".green());
for error in &unexpected { for error in &unexpected {
println!("{}", error.render_for_expected()); eprintln!("{}", error.render_for_expected());
} }
println!("{}", "---".green()); eprintln!("{}", "---".green());
} }
if !not_found.is_empty() { if !not_found.is_empty() {
println!("{}", "--- not found errors (from test file) ---".red()); eprintln!("{}", "--- not found errors (from test file) ---".red());
for error in &not_found { for error in &not_found {
println!("{}", error.render_for_expected()); eprintln!("{}", error.render_for_expected());
} }
println!("{}", "---\n".red()); eprintln!("{}", "---\n".red());
} }
panic!("errors differ from expected"); panic!("errors differ from expected");
} }
@ -1876,18 +1876,18 @@ impl<'test> TestCx<'test> {
fn maybe_dump_to_stdout(&self, out: &str, err: &str) { fn maybe_dump_to_stdout(&self, out: &str, err: &str) {
if self.config.verbose { if self.config.verbose {
println!("------stdout------------------------------"); eprintln!("------stdout------------------------------");
println!("{}", out); eprintln!("{}", out);
println!("------stderr------------------------------"); eprintln!("------stderr------------------------------");
println!("{}", err); eprintln!("{}", err);
println!("------------------------------------------"); eprintln!("------------------------------------------");
} }
} }
fn error(&self, err: &str) { fn error(&self, err: &str) {
match self.revision { match self.revision {
Some(rev) => println!("\nerror in revision `{}`: {}", rev, err), Some(rev) => eprintln!("\nerror in revision `{}`: {}", rev, err),
None => println!("\nerror: {}", err), None => eprintln!("\nerror: {}", err),
} }
} }
@ -1972,7 +1972,7 @@ impl<'test> TestCx<'test> {
if !self.config.has_html_tidy { if !self.config.has_html_tidy {
return; return;
} }
println!("info: generating a diff against nightly rustdoc"); eprintln!("info: generating a diff against nightly rustdoc");
let suffix = let suffix =
self.safe_revision().map_or("nightly".into(), |path| path.to_owned() + "-nightly"); self.safe_revision().map_or("nightly".into(), |path| path.to_owned() + "-nightly");
@ -2082,7 +2082,7 @@ impl<'test> TestCx<'test> {
.output() .output()
.unwrap(); .unwrap();
assert!(output.status.success()); 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)); eprintln!("{}", String::from_utf8_lossy(&output.stderr));
} else { } else {
use colored::Colorize; use colored::Colorize;
@ -2496,7 +2496,7 @@ impl<'test> TestCx<'test> {
)"# )"#
) )
.replace_all(&output, |caps: &Captures<'_>| { .replace_all(&output, |caps: &Captures<'_>| {
println!("{}", &caps[0]); eprintln!("{}", &caps[0]);
caps[0].replace(r"\", "/") caps[0].replace(r"\", "/")
}) })
.replace("\r\n", "\n") .replace("\r\n", "\n")
@ -2601,14 +2601,14 @@ impl<'test> TestCx<'test> {
if let Err(err) = fs::write(&actual_path, &actual) { if let Err(err) = fs::write(&actual_path, &actual) {
self.fatal(&format!("failed to write {stream} to `{actual_path:?}`: {err}",)); 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 = let expected_path =
expected_output_path(self.testpaths, self.revision, &self.config.compare_mode, stream); expected_output_path(self.testpaths, self.revision, &self.config.compare_mode, stream);
if !self.config.bless { if !self.config.bless {
if expected.is_empty() { if expected.is_empty() {
println!("normalized {}:\n{}\n", stream, actual); eprintln!("normalized {}:\n{}\n", stream, actual);
} else { } else {
self.show_diff( self.show_diff(
stream, stream,
@ -2631,10 +2631,10 @@ impl<'test> TestCx<'test> {
if let Err(err) = fs::write(&expected_path, &actual) { if let Err(err) = fs::write(&expected_path, &actual) {
self.fatal(&format!("failed to write {stream} to `{expected_path:?}`: {err}")); 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 } if self.config.bless { 0 } else { 1 }
} }
@ -2783,7 +2783,7 @@ impl<'test> TestCx<'test> {
fs::create_dir_all(&incremental_dir).unwrap(); fs::create_dir_all(&incremental_dir).unwrap();
if self.config.verbose { 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", "status: {}\ncommand: {}\n{}\n{}\n",
self.status, self.status,
self.cmdline, self.cmdline,
@ -2852,7 +2852,7 @@ impl ProcRes {
pub fn fatal(&self, err: Option<&str>, on_failure: impl FnOnce()) -> ! { pub fn fatal(&self, err: Option<&str>, on_failure: impl FnOnce()) -> ! {
if let Some(e) = err { if let Some(e) = err {
println!("\nerror: {}", e); eprintln!("\nerror: {}", e);
} }
self.print_info(); self.print_info();
on_failure(); on_failure();

View file

@ -64,13 +64,13 @@ impl TestCx<'_> {
if !missing.is_empty() { if !missing.is_empty() {
missing.sort(); 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 { for item in &missing {
println!("{}", item); eprintln!("{}", item);
} }
println!("\n"); eprintln!("\n");
} }
if !unexpected.is_empty() { if !unexpected.is_empty() {
@ -80,24 +80,24 @@ impl TestCx<'_> {
sorted 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 { for item in sorted {
println!("{}", item); eprintln!("{}", item);
} }
println!("\n"); eprintln!("\n");
} }
if !wrong_cgus.is_empty() { if !wrong_cgus.is_empty() {
wrong_cgus.sort_by_key(|pair| pair.0.name.clone()); 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 { for &(ref expected_item, ref actual_item) in &wrong_cgus {
println!("{}", expected_item.name); eprintln!("{}", expected_item.name);
println!(" expected: {}", codegen_units_to_str(&expected_item.codegen_units)); eprintln!(" expected: {}", codegen_units_to_str(&expected_item.codegen_units));
println!(" actual: {}", codegen_units_to_str(&actual_item.codegen_units)); eprintln!(" actual: {}", codegen_units_to_str(&actual_item.codegen_units));
println!(); eprintln!();
} }
} }

View file

@ -260,7 +260,7 @@ impl TestCx<'_> {
cmdline, cmdline,
}; };
if adb.kill().is_err() { if adb.kill().is_err() {
println!("Adb process is already finished."); eprintln!("Adb process is already finished.");
} }
} else { } else {
let rust_src_root = let rust_src_root =
@ -275,7 +275,7 @@ impl TestCx<'_> {
match self.config.gdb_version { match self.config.gdb_version {
Some(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() { if version > extract_gdb_version("7.4").unwrap() {
// Add the directory containing the pretty printers to // Add the directory containing the pretty printers to
@ -297,7 +297,7 @@ impl TestCx<'_> {
} }
} }
_ => { _ => {
println!( eprintln!(
"NOTE: compiletest does not know which version of \ "NOTE: compiletest does not know which version of \
GDB it is using" GDB it is using"
); );
@ -392,10 +392,10 @@ impl TestCx<'_> {
match self.config.lldb_version { match self.config.lldb_version {
Some(ref 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 \ "NOTE: compiletest does not know which version of \
LLDB it is using" LLDB it is using"
); );

View file

@ -30,7 +30,7 @@ impl TestCx<'_> {
assert!(incremental_dir.exists(), "init_incremental_test failed to create incremental dir"); assert!(incremental_dir.exists(), "init_incremental_test failed to create incremental dir");
if self.config.verbose { if self.config.verbose {
print!("revision={:?} props={:#?}", revision, self.props); eprint!("revision={:?} props={:#?}", revision, self.props);
} }
if revision.starts_with("cpass") { if revision.starts_with("cpass") {

View file

@ -89,7 +89,7 @@ impl TestCx<'_> {
} }
let expected_string = fs::read_to_string(&expected_file).unwrap(); let expected_string = fs::read_to_string(&expected_file).unwrap();
if dumped_string != expected_string { if dumped_string != expected_string {
print!("{}", write_diff(&expected_string, &dumped_string, 3)); eprint!("{}", write_diff(&expected_string, &dumped_string, 3));
panic!( panic!(
"Actual MIR output differs from expected MIR output {}", "Actual MIR output differs from expected MIR output {}",
expected_file.display() expected_file.display()

View file

@ -29,7 +29,7 @@ impl TestCx<'_> {
if !res.status.success() { if !res.status.success() {
self.fatal_proc_rec_with_ctx("jsondocck failed!", &res, |_| { self.fatal_proc_rec_with_ctx("jsondocck failed!", &res, |_| {
println!("Rustdoc Output:"); eprintln!("Rustdoc Output:");
proc_res.print_info(); proc_res.print_info();
}) })
} }

View file

@ -109,10 +109,10 @@ impl TestCx<'_> {
} }
if errors > 0 { 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 = let relative_path_to_file =
self.testpaths.relative_dir.join(self.testpaths.file.file_name().unwrap()); self.testpaths.relative_dir.join(self.testpaths.file.file_name().unwrap());
println!( eprintln!(
"To only update this specific test, also pass `--test-args {}`", "To only update this specific test, also pass `--test-args {}`",
relative_path_to_file.display(), relative_path_to_file.display(),
); );

View file

@ -30,7 +30,7 @@ fn path_div() -> &'static str {
pub fn logv(config: &Config, s: String) { pub fn logv(config: &Config, s: String) {
debug!("{}", s); debug!("{}", s);
if config.verbose { if config.verbose {
println!("{}", s); eprintln!("{}", s);
} }
} }

View file

@ -1,5 +1,4 @@
use rustc_abi::{ExternAbi, Size}; use rustc_abi::{ExternAbi, Size};
use rustc_ast::ast::Mutability;
use rustc_middle::ty::layout::LayoutOf as _; use rustc_middle::ty::layout::LayoutOf as _;
use rustc_middle::ty::{self, Instance, Ty}; use rustc_middle::ty::{self, Instance, Ty};
use rustc_span::{BytePos, Loc, Symbol, hygiene}; use rustc_span::{BytePos, Loc, Symbol, hygiene};
@ -179,14 +178,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
match flags { match flags {
0 => { 0 => {
// These are "mutable" allocations as we consider them to be owned by the callee. throw_unsup_format!("miri_resolve_frame: v0 is not supported any more");
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)?)?;
} }
1 => { 1 => {
this.write_scalar( this.write_scalar(

View file

@ -12,7 +12,6 @@
//! metadata we remembered when pushing said frame. //! metadata we remembered when pushing said frame.
use rustc_abi::ExternAbi; use rustc_abi::ExternAbi;
use rustc_ast::Mutability;
use rustc_middle::{mir, ty}; use rustc_middle::{mir, ty};
use rustc_target::spec::PanicStrategy; use rustc_target::spec::PanicStrategy;
@ -161,7 +160,7 @@ pub trait EvalContextExt<'tcx>: crate::MiriInterpCxExt<'tcx> {
let this = self.eval_context_mut(); let this = self.eval_context_mut();
// First arg: message. // 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. // Call the lang item.
let panic = this.tcx.lang_items().panic_fn().unwrap(); 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(); let this = self.eval_context_mut();
// First arg: message. // 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. // Call the lang item.
let panic = this.tcx.lang_items().panic_nounwind().unwrap(); let panic = this.tcx.lang_items().panic_nounwind().unwrap();

View file

@ -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 (),
}

View file

@ -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)

View file

@ -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)

View file

@ -2295,8 +2295,6 @@ ui/issues/issue-43853.rs
ui/issues/issue-4387.rs ui/issues/issue-4387.rs
ui/issues/issue-43910.rs ui/issues/issue-43910.rs
ui/issues/issue-43923.rs ui/issues/issue-43923.rs
ui/issues/issue-43925.rs
ui/issues/issue-43926.rs
ui/issues/issue-43988.rs ui/issues/issue-43988.rs
ui/issues/issue-44023.rs ui/issues/issue-44023.rs
ui/issues/issue-44056.rs ui/issues/issue-44056.rs
@ -2545,8 +2543,6 @@ ui/issues/issue-6936.rs
ui/issues/issue-69455.rs ui/issues/issue-69455.rs
ui/issues/issue-69602-type-err-during-codegen-ice.rs ui/issues/issue-69602-type-err-during-codegen-ice.rs
ui/issues/issue-69683.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-7012.rs
ui/issues/issue-70381.rs ui/issues/issue-70381.rs
ui/issues/issue-7044.rs ui/issues/issue-7044.rs
@ -2711,11 +2707,15 @@ ui/limits/issue-17913.rs
ui/limits/issue-55878.rs ui/limits/issue-55878.rs
ui/limits/issue-69485-var-size-diffs-too-large.rs ui/limits/issue-69485-var-size-diffs-too-large.rs
ui/limits/issue-75158-64.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-dylib.rs
ui/linkage-attr/auxiliary/issue-12133-dylib2.rs ui/linkage-attr/auxiliary/issue-12133-dylib2.rs
ui/linkage-attr/auxiliary/issue-12133-rlib.rs ui/linkage-attr/auxiliary/issue-12133-rlib.rs
ui/linkage-attr/issue-10755.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-1.rs
ui/linkage-attr/issue-12133-2.rs ui/linkage-attr/issue-12133-2.rs
ui/linkage-attr/issue-12133-3.rs ui/linkage-attr/issue-12133-3.rs

View file

@ -17,7 +17,7 @@ use ignore::Walk;
const ENTRY_LIMIT: u32 = 901; const ENTRY_LIMIT: u32 = 901;
// FIXME: The following limits should be reduced eventually. // 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] = &[ const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[
"rs", // test source files "rs", // test source files

View file

@ -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();
}

View file

@ -2,6 +2,7 @@
//@ compile-flags: --document-private-items //@ compile-flags: --document-private-items
//@ build-pass //@ build-pass
//@ only-linux //@ only-linux
// https://github.com/rust-lang/rust/issues/107918
#![no_std] #![no_std]
#![no_main] #![no_main]

View file

@ -1,4 +1,5 @@
//@ check-pass //@ check-pass
// https://github.com/rust-lang/rust/issues/110900
#![crate_type="lib"] #![crate_type="lib"]

View file

@ -1,5 +1,6 @@
//@ compile-flags: --document-private-items //@ compile-flags: --document-private-items
//@ edition:2021 //@ edition:2021
// https://github.com/rust-lang/rust/issues/106213
fn use_avx() -> dyn { fn use_avx() -> dyn {
//~^ ERROR at least one trait is required for an object type //~^ ERROR at least one trait is required for an object type

View file

@ -1,5 +1,5 @@
error[E0224]: at least one trait is required for an object type 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 { LL | fn use_avx() -> dyn {
| ^^^ | ^^^

View file

@ -1,4 +1,5 @@
//@ compile-flags: -Znormalize-docs //@ compile-flags: -Znormalize-docs
// https://github.com/rust-lang/rust/issues/105742
use std::ops::Index; use std::ops::Index;
pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) { pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {

View file

@ -1,11 +1,11 @@
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; LL | type Item<'a, T>;
| ^^^^ -- | ^^^^ --
@ -15,13 +15,13 @@ LL | <Self as SVec>::Item<'a>,
| ++++ | ++++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; LL | type Item<'a, T>;
| ^^^^ - | ^^^^ -
@ -31,13 +31,13 @@ LL | <Self as SVec>::Item<T>,
| +++ | +++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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>) { LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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>) { LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; LL | type Item<'a, T>;
| ^^^^ -- | ^^^^ --
@ -176,13 +176,13 @@ LL | <Self as SVec>::Item<'a>,
| ++++ | ++++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; LL | type Item<'a, T>;
| ^^^^ - | ^^^^ -
@ -193,13 +193,13 @@ LL | <Self as SVec>::Item<T>,
| +++ | +++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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 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>) { LL | pub fn next<'a, T>(s: &'a mut dyn SVec<Item = T, Output = T>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SVec` cannot be made into an object | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `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> 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< 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` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; LL | type Item<'a, T>;
| ^^^^ -- | ^^^^ --
@ -346,13 +346,13 @@ LL | <Self as SVec>::Item<'a>,
| ++++ | ++++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; LL | type Item<'a, T>;
| ^^^^ - | ^^^^ -
@ -363,13 +363,13 @@ LL | <Self as SVec>::Item<T>,
| +++ | +++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; LL | type Item<'a, T>;
| ^^^^ -- | ^^^^ --
@ -482,13 +482,13 @@ LL | <Self as SVec>::Item<'a>,
| ++++ | ++++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | <Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; LL | type Item<'a, T>;
| ^^^^ - | ^^^^ -
@ -499,13 +499,13 @@ LL | <Self as SVec>::Item<T>,
| +++ | +++
error[E0107]: missing generics for associated type `SVec::Item` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Index<<Self as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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, LL | Output = <Self as SVec>::Item> as SVec>::Item,
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; 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` 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; LL | fn len(&self) -> <Self as SVec>::Item;
| ^^^^ expected 1 lifetime argument | ^^^^ expected 1 lifetime argument
| |
note: associated type defined here, with 1 lifetime parameter: `'a` 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>; 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` 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; LL | fn len(&self) -> <Self as SVec>::Item;
| ^^^^ expected 1 generic argument | ^^^^ expected 1 generic argument
| |
note: associated type defined here, with 1 generic parameter: `T` 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>; LL | type Item<'a, T>;
| ^^^^ - | ^^^^ -

View file

@ -0,0 +1,5 @@
// https://github.com/rust-lang/rust/issues/105737
impl Vec<lol> {}
//~^ ERROR
pub fn lol() {}

View file

@ -1,5 +1,5 @@
error[E0747]: constant provided when a type was expected 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> {} LL | impl Vec<lol> {}
| ^^^ | ^^^

View file

@ -1,4 +1,5 @@
//@ check-pass //@ check-pass
// https://github.com/rust-lang/rust/issues/101076
const _: () = { const _: () = {
#[macro_export] #[macro_export]

View file

@ -1,5 +1,5 @@
error[E0121]: the placeholder `_` is not allowed within types on item signatures for type aliases 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 = [_; ()]; LL | type F = [_; ()];
| ^ not allowed in type signatures | ^ not allowed in type signatures

View file

@ -0,0 +1,3 @@
// https://github.com/rust-lang/rust/issues/105334
impl Vec< br##"*.."## > {}
//~^ ERROR

View file

@ -1,5 +1,5 @@
error[E0747]: constant provided when a type was expected 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##"*.."## > {} LL | impl Vec< br##"*.."## > {}
| ^^^^^^^^^^^ | ^^^^^^^^^^^

View file

@ -1,3 +1,4 @@
// https://github.com/rust-lang/rust/issues/102986
struct Struct { struct Struct {
y: (typeof("hey"),), y: (typeof("hey"),),
//~^ `typeof` is a reserved keyword but unimplemented //~^ `typeof` is a reserved keyword but unimplemented

View file

@ -1,5 +1,5 @@
error[E0516]: `typeof` is a reserved keyword but unimplemented 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"),), LL | y: (typeof("hey"),),
| ^^^^^^^^^^^^^ reserved keyword | ^^^^^^^^^^^^^ reserved keyword

View file

@ -1,4 +1,5 @@
//@ check-pass //@ check-pass
// https://github.com/rust-lang/rust/issues/103997
pub fn foo() {} pub fn foo() {}

View file

@ -1,5 +1,5 @@
warning: unresolved link to `Self::foo` warning: unresolved link to `Self::foo`
--> $DIR/issue-103997.rs:5:13 --> $DIR/ice-unresolved-self-103997.rs:6:13
| |
LL | /// [`foo`](Self::foo) LL | /// [`foo`](Self::foo)
| ^^^^^^^^^ no item named `Self` in scope | ^^^^^^^^^ no item named `Self` in scope

View file

@ -1,2 +0,0 @@
impl Vec< br##"*.."## > {}
//~^ ERROR

View file

@ -1,4 +0,0 @@
impl Vec<lol> {}
//~^ ERROR
pub fn lol() {}

View 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);
}

View 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)

View file

@ -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