Merge from rustc
This commit is contained in:
commit
536723501a
324 changed files with 4409 additions and 3158 deletions
|
|
@ -1 +1 @@
|
|||
Subproject commit 34a6a87d8a2330d8c9d578f927489689328a652d
|
||||
Subproject commit b1feb75d062444e2cee8b3d2aaa95309d65e9ccd
|
||||
|
|
@ -6,7 +6,7 @@ use crate::{clip, is_direct_expn_of, sext, unsext};
|
|||
use rustc_ast::ast::{self, LitFloatType, LitKind};
|
||||
use rustc_data_structures::sync::Lrc;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::{BinOp, BinOpKind, Block, Expr, ExprKind, HirId, Item, ItemKind, Node, QPath, UnOp};
|
||||
use rustc_hir::{BinOp, BinOpKind, Block, ConstBlock, Expr, ExprKind, HirId, Item, ItemKind, Node, QPath, UnOp};
|
||||
use rustc_lexer::tokenize;
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::mir::interpret::{alloc_range, Scalar};
|
||||
|
|
@ -412,7 +412,7 @@ impl<'a, 'tcx> ConstEvalLateContext<'a, 'tcx> {
|
|||
/// Simple constant folding: Insert an expression, get a constant or none.
|
||||
pub fn expr(&mut self, e: &Expr<'_>) -> Option<Constant<'tcx>> {
|
||||
match e.kind {
|
||||
ExprKind::ConstBlock(e) | ExprKind::DropTemps(e) => self.expr(e),
|
||||
ExprKind::ConstBlock(ConstBlock { body, .. }) => self.expr(self.lcx.tcx.hir().body(body).value), ExprKind::DropTemps(e) => self.expr(e),
|
||||
ExprKind::Path(ref qpath) => {
|
||||
self.fetch_path_and_apply(qpath, e.hir_id, self.typeck_results.expr_ty(e), |this, result| {
|
||||
let result = mir_to_const(this.lcx, result)?;
|
||||
|
|
@ -490,7 +490,7 @@ impl<'a, 'tcx> ConstEvalLateContext<'a, 'tcx> {
|
|||
/// leaves the local crate.
|
||||
pub fn expr_is_empty(&mut self, e: &Expr<'_>) -> Option<bool> {
|
||||
match e.kind {
|
||||
ExprKind::ConstBlock(e) | ExprKind::DropTemps(e) => self.expr_is_empty(e),
|
||||
ExprKind::ConstBlock(ConstBlock { body, .. }) => self.expr_is_empty(self.lcx.tcx.hir().body(body).value), ExprKind::DropTemps(e) => self.expr_is_empty(e),
|
||||
ExprKind::Path(ref qpath) => {
|
||||
if !self
|
||||
.typeck_results
|
||||
|
|
|
|||
|
|
@ -295,7 +295,7 @@ impl HirEqInterExpr<'_, '_, '_> {
|
|||
self.eq_expr(lx, rx) && self.eq_ty(lt, rt)
|
||||
},
|
||||
(&ExprKind::Closure(_l), &ExprKind::Closure(_r)) => false,
|
||||
(&ExprKind::ConstBlock(lb), &ExprKind::ConstBlock(rb)) => self.eq_expr(lb, rb),
|
||||
(&ExprKind::ConstBlock(lb), &ExprKind::ConstBlock(rb)) => self.eq_body(lb.body, rb.body),
|
||||
(&ExprKind::Continue(li), &ExprKind::Continue(ri)) => {
|
||||
both(&li.label, &ri.label, |l, r| l.ident.name == r.ident.name)
|
||||
},
|
||||
|
|
@ -769,8 +769,8 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> {
|
|||
// closures inherit TypeckResults
|
||||
self.hash_expr(self.cx.tcx.hir().body(body).value);
|
||||
},
|
||||
ExprKind::ConstBlock(l_id) => {
|
||||
self.hash_expr(l_id);
|
||||
ExprKind::ConstBlock(ref l_id) => {
|
||||
self.hash_body(l_id.body);
|
||||
},
|
||||
ExprKind::DropTemps(e) | ExprKind::Yield(e, _) => {
|
||||
self.hash_expr(e);
|
||||
|
|
|
|||
|
|
@ -1,35 +1,11 @@
|
|||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> tests/ui/arithmetic_side_effects.rs:188:36
|
||||
|
|
||||
LL | let _ = const { let mut n = 1; n += 1; n };
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: `-D clippy::arithmetic-side-effects` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::arithmetic_side_effects)]`
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> tests/ui/arithmetic_side_effects.rs:191:40
|
||||
|
|
||||
LL | let _ = const { let mut n = 1; n = n + 1; n };
|
||||
| ^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> tests/ui/arithmetic_side_effects.rs:194:40
|
||||
|
|
||||
LL | let _ = const { let mut n = 1; n = 1 + n; n };
|
||||
| ^^^^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> tests/ui/arithmetic_side_effects.rs:200:59
|
||||
|
|
||||
LL | let _ = const { let mut n = 1; n = -1; n = -(-1); n = -n; n };
|
||||
| ^^
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> tests/ui/arithmetic_side_effects.rs:304:5
|
||||
|
|
||||
LL | _n += 1;
|
||||
| ^^^^^^^
|
||||
|
|
||||
= note: `-D clippy::arithmetic-side-effects` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::arithmetic_side_effects)]`
|
||||
|
||||
error: arithmetic operation that can potentially result in unexpected side-effects
|
||||
--> tests/ui/arithmetic_side_effects.rs:305:5
|
||||
|
|
@ -751,5 +727,5 @@ error: arithmetic operation that can potentially result in unexpected side-effec
|
|||
LL | one.sub_assign(1);
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 125 previous errors
|
||||
error: aborting due to 121 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ fn foo(
|
|||
|
||||
fn skip_on_statements() {
|
||||
#[rustfmt::skip]
|
||||
{ 5+3; }
|
||||
5+3;
|
||||
}
|
||||
|
||||
#[rustfmt::skip]
|
||||
|
|
@ -33,11 +33,11 @@ mod foo {
|
|||
#[clippy::msrv = "1.29"]
|
||||
fn msrv_1_29() {
|
||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||
{ 1+29; }
|
||||
1+29;
|
||||
}
|
||||
|
||||
#[clippy::msrv = "1.30"]
|
||||
fn msrv_1_30() {
|
||||
#[rustfmt::skip]
|
||||
{ 1+30; }
|
||||
1+30;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ fn foo(
|
|||
|
||||
fn skip_on_statements() {
|
||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||
{ 5+3; }
|
||||
5+3;
|
||||
}
|
||||
|
||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||
|
|
@ -33,11 +33,11 @@ mod foo {
|
|||
#[clippy::msrv = "1.29"]
|
||||
fn msrv_1_29() {
|
||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||
{ 1+29; }
|
||||
1+29;
|
||||
}
|
||||
|
||||
#[clippy::msrv = "1.30"]
|
||||
fn msrv_1_30() {
|
||||
#[cfg_attr(rustfmt, rustfmt::skip)]
|
||||
{ 1+30; }
|
||||
1+30;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@ fn std_instead_of_core() {
|
|||
|
||||
let _ = std::env!("PATH");
|
||||
|
||||
// do not lint until `error_in_core` is stable
|
||||
use std::error::Error;
|
||||
use core::error::Error;
|
||||
//~^ ERROR: used import from `std` instead of `core`
|
||||
|
||||
// lint items re-exported from private modules, `core::iter::traits::iterator::Iterator`
|
||||
use core::iter::Iterator;
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@ fn std_instead_of_core() {
|
|||
|
||||
let _ = std::env!("PATH");
|
||||
|
||||
// do not lint until `error_in_core` is stable
|
||||
use std::error::Error;
|
||||
//~^ ERROR: used import from `std` instead of `core`
|
||||
|
||||
// lint items re-exported from private modules, `core::iter::traits::iterator::Iterator`
|
||||
use std::iter::Iterator;
|
||||
|
|
|
|||
|
|
@ -49,6 +49,12 @@ error: used import from `std` instead of `core`
|
|||
LL | let cell_absolute = ::std::cell::Cell::new(8u32);
|
||||
| ^^^ help: consider importing the item from `core`: `core`
|
||||
|
||||
error: used import from `std` instead of `core`
|
||||
--> tests/ui/std_instead_of_core.rs:48:9
|
||||
|
|
||||
LL | use std::error::Error;
|
||||
| ^^^ help: consider importing the item from `core`: `core`
|
||||
|
||||
error: used import from `std` instead of `core`
|
||||
--> tests/ui/std_instead_of_core.rs:52:9
|
||||
|
|
||||
|
|
@ -79,5 +85,5 @@ LL | use alloc::slice::from_ref;
|
|||
= note: `-D clippy::alloc-instead-of-core` implied by `-D warnings`
|
||||
= help: to override `-D warnings` add `#[allow(clippy::alloc_instead_of_core)]`
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
error: aborting due to 13 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ use crate::errors::{self, Error, ErrorKind};
|
|||
use crate::header::TestProps;
|
||||
use crate::json;
|
||||
use crate::read2::{read2_abbreviated, Truncated};
|
||||
use crate::util::{add_dylib_path, dylib_env_var, logv, PathBufExt};
|
||||
use crate::util::{add_dylib_path, copy_dir_all, dylib_env_var, logv, PathBufExt};
|
||||
use crate::ColorConfig;
|
||||
use colored::Colorize;
|
||||
use miropt_test_tools::{files_for_miropt_test, MiroptTest, MiroptTestFile};
|
||||
|
|
@ -3471,6 +3471,21 @@ impl<'test> TestCx<'test> {
|
|||
let rmake_out_dir = base_dir.join("rmake_out");
|
||||
create_dir_all(&rmake_out_dir).unwrap();
|
||||
|
||||
// Copy all input files (apart from rmake.rs) to the temporary directory,
|
||||
// so that the input directory structure from `tests/run-make/<test>` is mirrored
|
||||
// to the `rmake_out` directory.
|
||||
for path in walkdir::WalkDir::new(&self.testpaths.file).min_depth(1) {
|
||||
let path = path.unwrap().path().to_path_buf();
|
||||
if path.file_name().is_some_and(|s| s != "rmake.rs") {
|
||||
let target = rmake_out_dir.join(path.strip_prefix(&self.testpaths.file).unwrap());
|
||||
if path.is_dir() {
|
||||
copy_dir_all(&path, target).unwrap();
|
||||
} else {
|
||||
fs::copy(&path, target).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// HACK: assume stageN-target, we only want stageN.
|
||||
let stage = self.config.stage_id.split('-').next().unwrap();
|
||||
|
||||
|
|
@ -3528,21 +3543,13 @@ impl<'test> TestCx<'test> {
|
|||
.arg(&self.testpaths.file.join("rmake.rs"))
|
||||
.env("TARGET", &self.config.target)
|
||||
.env("PYTHON", &self.config.python)
|
||||
.env("S", &src_root)
|
||||
.env("RUST_BUILD_STAGE", &self.config.stage_id)
|
||||
.env("RUSTC", cwd.join(&self.config.rustc_path))
|
||||
.env("TMPDIR", &rmake_out_dir)
|
||||
.env("LD_LIB_PATH_ENVVAR", dylib_env_var())
|
||||
.env(dylib_env_var(), &host_dylib_env_paths)
|
||||
.env("HOST_RPATH_DIR", cwd.join(&self.config.compile_lib_path))
|
||||
.env("TARGET_RPATH_DIR", cwd.join(&self.config.run_lib_path))
|
||||
.env("LLVM_COMPONENTS", &self.config.llvm_components)
|
||||
// We for sure don't want these tests to run in parallel, so make
|
||||
// sure they don't have access to these vars if we run via `make`
|
||||
// at the top level
|
||||
.env_remove("MAKEFLAGS")
|
||||
.env_remove("MFLAGS")
|
||||
.env_remove("CARGO_MAKEFLAGS");
|
||||
.env("LLVM_COMPONENTS", &self.config.llvm_components);
|
||||
|
||||
if std::env::var_os("COMPILETEST_FORCE_STAGE0").is_some() {
|
||||
let mut stage0_sysroot = build_root.clone();
|
||||
|
|
@ -3572,7 +3579,7 @@ impl<'test> TestCx<'test> {
|
|||
let target_rpath_env_path = env::join_paths(target_rpath_env_path).unwrap();
|
||||
|
||||
let mut cmd = Command::new(&recipe_bin);
|
||||
cmd.current_dir(&self.testpaths.file)
|
||||
cmd.current_dir(&rmake_out_dir)
|
||||
.stdout(Stdio::piped())
|
||||
.stderr(Stdio::piped())
|
||||
.env("LD_LIB_PATH_ENVVAR", dylib_env_var())
|
||||
|
|
@ -3580,19 +3587,12 @@ impl<'test> TestCx<'test> {
|
|||
.env(dylib_env_var(), &dylib_env_paths)
|
||||
.env("TARGET", &self.config.target)
|
||||
.env("PYTHON", &self.config.python)
|
||||
.env("S", &src_root)
|
||||
.env("SOURCE_ROOT", &src_root)
|
||||
.env("RUST_BUILD_STAGE", &self.config.stage_id)
|
||||
.env("RUSTC", cwd.join(&self.config.rustc_path))
|
||||
.env("TMPDIR", &rmake_out_dir)
|
||||
.env("HOST_RPATH_DIR", cwd.join(&self.config.compile_lib_path))
|
||||
.env("TARGET_RPATH_DIR", cwd.join(&self.config.run_lib_path))
|
||||
.env("LLVM_COMPONENTS", &self.config.llvm_components)
|
||||
// We for sure don't want these tests to run in parallel, so make
|
||||
// sure they don't have access to these vars if we run via `make`
|
||||
// at the top level
|
||||
.env_remove("MAKEFLAGS")
|
||||
.env_remove("MFLAGS")
|
||||
.env_remove("CARGO_MAKEFLAGS");
|
||||
.env("LLVM_COMPONENTS", &self.config.llvm_components);
|
||||
|
||||
if let Some(ref rustdoc) = self.config.rustdoc_path {
|
||||
cmd.env("RUSTDOC", cwd.join(rustdoc));
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
use crate::common::Config;
|
||||
use std::env;
|
||||
use std::ffi::OsStr;
|
||||
use std::path::PathBuf;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::process::Command;
|
||||
|
||||
use tracing::*;
|
||||
|
|
@ -76,3 +76,17 @@ pub fn add_dylib_path(cmd: &mut Command, paths: impl Iterator<Item = impl Into<P
|
|||
let new_paths = paths.map(Into::into).chain(old_paths.into_iter().flatten());
|
||||
cmd.env(dylib_env_var(), env::join_paths(new_paths).unwrap());
|
||||
}
|
||||
|
||||
pub fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> std::io::Result<()> {
|
||||
std::fs::create_dir_all(&dst)?;
|
||||
for entry in std::fs::read_dir(src)? {
|
||||
let entry = entry?;
|
||||
let ty = entry.file_type()?;
|
||||
if ty.is_dir() {
|
||||
copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?;
|
||||
} else {
|
||||
std::fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,7 @@
|
|||
use std::path::Path;
|
||||
use std::process::Command;
|
||||
|
||||
use crate::{
|
||||
bin_name, cygpath_windows, env_var, handle_failed_output, is_msvc, is_windows, tmp_dir, uname,
|
||||
};
|
||||
use crate::{bin_name, cygpath_windows, env_var, handle_failed_output, is_msvc, is_windows, uname};
|
||||
|
||||
/// Construct a new platform-specific C compiler invocation.
|
||||
///
|
||||
|
|
@ -54,8 +52,7 @@ impl Cc {
|
|||
self
|
||||
}
|
||||
|
||||
/// Specify `-o` or `-Fe`/`-Fo` depending on platform/compiler. This assumes that the executable
|
||||
/// is under `$TMPDIR`.
|
||||
/// Specify `-o` or `-Fe`/`-Fo` depending on platform/compiler.
|
||||
pub fn out_exe(&mut self, name: &str) -> &mut Self {
|
||||
// Ref: tools.mk (irrelevant lines omitted):
|
||||
//
|
||||
|
|
@ -69,13 +66,13 @@ impl Cc {
|
|||
// ```
|
||||
|
||||
if is_msvc() {
|
||||
let fe_path = cygpath_windows(tmp_dir().join(bin_name(name)));
|
||||
let fo_path = cygpath_windows(tmp_dir().join(format!("{name}.obj")));
|
||||
let fe_path = cygpath_windows(bin_name(name));
|
||||
let fo_path = cygpath_windows(format!("{name}.obj"));
|
||||
self.cmd.arg(format!("-Fe:{fe_path}"));
|
||||
self.cmd.arg(format!("-Fo:{fo_path}"));
|
||||
} else {
|
||||
self.cmd.arg("-o");
|
||||
self.cmd.arg(tmp_dir().join(name));
|
||||
self.cmd.arg(name);
|
||||
}
|
||||
|
||||
self
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
use std::path::Path;
|
||||
use std::process::Command;
|
||||
|
||||
use crate::{bin_name, env_var, handle_failed_output, tmp_dir};
|
||||
use crate::{bin_name, env_var, handle_failed_output};
|
||||
|
||||
/// Construct a new `clang` invocation. `clang` is not always available for all targets.
|
||||
pub fn clang() -> Clang {
|
||||
|
|
@ -30,11 +30,11 @@ impl Clang {
|
|||
self
|
||||
}
|
||||
|
||||
/// Specify the name of the executable. The executable will be placed under `$TMPDIR`, and the
|
||||
/// extension will be determined by [`bin_name`].
|
||||
/// Specify the name of the executable. The executable will be placed under the current directory
|
||||
/// and the extension will be determined by [`bin_name`].
|
||||
pub fn out_exe(&mut self, name: &str) -> &mut Self {
|
||||
self.cmd.arg("-o");
|
||||
self.cmd.arg(tmp_dir().join(bin_name(name)));
|
||||
self.cmd.arg(bin_name(name));
|
||||
self
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -45,11 +45,6 @@ pub fn env_var_os(name: &str) -> OsString {
|
|||
}
|
||||
}
|
||||
|
||||
/// Path of `TMPDIR` (a temporary build directory, not under `/tmp`).
|
||||
pub fn tmp_dir() -> PathBuf {
|
||||
env_var_os("TMPDIR").into()
|
||||
}
|
||||
|
||||
/// `TARGET`
|
||||
pub fn target() -> String {
|
||||
env_var("TARGET")
|
||||
|
|
@ -70,12 +65,6 @@ pub fn is_darwin() -> bool {
|
|||
target().contains("darwin")
|
||||
}
|
||||
|
||||
/// Construct a path to a static library under `$TMPDIR` given the library name. This will return a
|
||||
/// path with `$TMPDIR` joined with platform-and-compiler-specific library name.
|
||||
pub fn static_lib(name: &str) -> PathBuf {
|
||||
tmp_dir().join(static_lib_name(name))
|
||||
}
|
||||
|
||||
pub fn python_command() -> Command {
|
||||
let python_path = env_var("PYTHON");
|
||||
Command::new(python_path)
|
||||
|
|
@ -89,7 +78,7 @@ pub fn htmldocck() -> Command {
|
|||
|
||||
/// Path to the root rust-lang/rust source checkout.
|
||||
pub fn source_root() -> PathBuf {
|
||||
env_var("S").into()
|
||||
env_var("SOURCE_ROOT").into()
|
||||
}
|
||||
|
||||
/// Construct the static library name based on the platform.
|
||||
|
|
@ -116,12 +105,6 @@ pub fn static_lib_name(name: &str) -> String {
|
|||
if is_msvc() { format!("{name}.lib") } else { format!("lib{name}.a") }
|
||||
}
|
||||
|
||||
/// Construct a path to a dynamic library under `$TMPDIR` given the library name. This will return a
|
||||
/// path with `$TMPDIR` joined with platform-and-compiler-specific library name.
|
||||
pub fn dynamic_lib(name: &str) -> PathBuf {
|
||||
tmp_dir().join(dynamic_lib_name(name))
|
||||
}
|
||||
|
||||
/// Construct the dynamic library name based on the platform.
|
||||
pub fn dynamic_lib_name(name: &str) -> String {
|
||||
// See tools.mk (irrelevant lines omitted):
|
||||
|
|
@ -159,14 +142,7 @@ pub fn dynamic_lib_extension() -> &'static str {
|
|||
}
|
||||
}
|
||||
|
||||
/// Construct a path to a rust library (rlib) under `$TMPDIR` given the library name. This will return a
|
||||
/// path with `$TMPDIR` joined with the library name.
|
||||
pub fn rust_lib(name: &str) -> PathBuf {
|
||||
tmp_dir().join(rust_lib_name(name))
|
||||
}
|
||||
|
||||
/// Generate the name a rust library (rlib) would have. If you want the complete path, use
|
||||
/// [`rust_lib`] instead.
|
||||
/// Construct a rust library (rlib) name.
|
||||
pub fn rust_lib_name(name: &str) -> String {
|
||||
format!("lib{name}.rlib")
|
||||
}
|
||||
|
|
@ -176,6 +152,11 @@ pub fn bin_name(name: &str) -> String {
|
|||
if is_windows() { format!("{name}.exe") } else { name.to_string() }
|
||||
}
|
||||
|
||||
/// Return the current working directory.
|
||||
pub fn cwd() -> PathBuf {
|
||||
env::current_dir().unwrap()
|
||||
}
|
||||
|
||||
/// Use `cygpath -w` on a path to get a Windows path string back. This assumes that `cygpath` is
|
||||
/// available on the platform!
|
||||
#[track_caller]
|
||||
|
|
@ -227,7 +208,7 @@ pub fn set_host_rpath(cmd: &mut Command) {
|
|||
let ld_lib_path_envvar = env_var("LD_LIB_PATH_ENVVAR");
|
||||
cmd.env(&ld_lib_path_envvar, {
|
||||
let mut paths = vec![];
|
||||
paths.push(PathBuf::from(env_var("TMPDIR")));
|
||||
paths.push(cwd());
|
||||
paths.push(PathBuf::from(env_var("HOST_RPATH_DIR")));
|
||||
for p in env::split_paths(&env_var(&ld_lib_path_envvar)) {
|
||||
paths.push(p.to_path_buf());
|
||||
|
|
@ -315,6 +296,27 @@ pub fn assert_not_contains(haystack: &str, needle: &str) {
|
|||
}
|
||||
}
|
||||
|
||||
/// This function is designed for running commands in a temporary directory
|
||||
/// that is cleared after the function ends.
|
||||
///
|
||||
/// What this function does:
|
||||
/// 1) Creates a temporary directory (`tmpdir`)
|
||||
/// 2) Copies all files from the current directory to `tmpdir`
|
||||
/// 3) Changes the current working directory to `tmpdir`
|
||||
/// 4) Calls `callback`
|
||||
/// 5) Switches working directory back to the original one
|
||||
/// 6) Removes `tmpdir`
|
||||
pub fn run_in_tmpdir<F: FnOnce()>(callback: F) {
|
||||
let original_dir = cwd();
|
||||
let tmpdir = original_dir.join("../temporary-directory");
|
||||
copy_dir_all(".", &tmpdir);
|
||||
|
||||
env::set_current_dir(&tmpdir).unwrap();
|
||||
callback();
|
||||
env::set_current_dir(original_dir).unwrap();
|
||||
fs::remove_dir_all(tmpdir).unwrap();
|
||||
}
|
||||
|
||||
/// Implement common helpers for command wrappers. This assumes that the command wrapper is a struct
|
||||
/// containing a `cmd: Command` field and a `output` function. The provided helpers are:
|
||||
///
|
||||
|
|
|
|||
|
|
@ -2,19 +2,19 @@ use std::env;
|
|||
use std::path::{Path, PathBuf};
|
||||
use std::process::{Command, Output};
|
||||
|
||||
use crate::{env_var, is_windows};
|
||||
use crate::{cwd, env_var, is_windows};
|
||||
|
||||
use super::handle_failed_output;
|
||||
|
||||
fn run_common(name: &str) -> (Command, Output) {
|
||||
let mut bin_path = PathBuf::new();
|
||||
bin_path.push(env_var("TMPDIR"));
|
||||
bin_path.push(cwd());
|
||||
bin_path.push(name);
|
||||
let ld_lib_path_envvar = env_var("LD_LIB_PATH_ENVVAR");
|
||||
let mut cmd = Command::new(bin_path);
|
||||
cmd.env(&ld_lib_path_envvar, {
|
||||
let mut paths = vec![];
|
||||
paths.push(PathBuf::from(env_var("TMPDIR")));
|
||||
paths.push(cwd());
|
||||
for p in env::split_paths(&env_var("TARGET_RPATH_ENV")) {
|
||||
paths.push(p.to_path_buf());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ use std::io::Write;
|
|||
use std::path::Path;
|
||||
use std::process::{Command, Output, Stdio};
|
||||
|
||||
use crate::{env_var, handle_failed_output, set_host_rpath, tmp_dir};
|
||||
use crate::{cwd, env_var, handle_failed_output, set_host_rpath};
|
||||
|
||||
/// Construct a new `rustc` invocation.
|
||||
pub fn rustc() -> Rustc {
|
||||
|
|
@ -28,7 +28,7 @@ fn setup_common() -> Command {
|
|||
let rustc = env_var("RUSTC");
|
||||
let mut cmd = Command::new(rustc);
|
||||
set_host_rpath(&mut cmd);
|
||||
cmd.arg("--out-dir").arg(tmp_dir()).arg("-L").arg(tmp_dir());
|
||||
cmd.arg("-L").arg(cwd());
|
||||
cmd
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -214,22 +214,16 @@ impl Write for CombinedEncoder {
|
|||
}
|
||||
|
||||
fn write_all(&mut self, buf: &[u8]) -> std::io::Result<()> {
|
||||
self.encoders
|
||||
.par_iter_mut()
|
||||
.map(|w| w.write_all(buf))
|
||||
.collect::<std::io::Result<Vec<()>>>()?;
|
||||
Ok(())
|
||||
self.encoders.par_iter_mut().try_for_each(|w| w.write_all(buf))
|
||||
}
|
||||
|
||||
fn flush(&mut self) -> std::io::Result<()> {
|
||||
self.encoders.par_iter_mut().map(|w| w.flush()).collect::<std::io::Result<Vec<()>>>()?;
|
||||
Ok(())
|
||||
self.encoders.par_iter_mut().try_for_each(Write::flush)
|
||||
}
|
||||
}
|
||||
|
||||
impl Encoder for CombinedEncoder {
|
||||
fn finish(self: Box<Self>) -> Result<(), Error> {
|
||||
self.encoders.into_par_iter().map(|e| e.finish()).collect::<Result<Vec<()>, Error>>()?;
|
||||
Ok(())
|
||||
self.encoders.into_par_iter().try_for_each(Encoder::finish)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ module.exports = {
|
|||
},
|
||||
"extends": "eslint:recommended",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2018,
|
||||
"ecmaVersion": 2019,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ module.exports = {
|
|||
},
|
||||
"extends": "eslint:recommended",
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 8,
|
||||
"ecmaVersion": 2019,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"rules": {
|
||||
|
|
|
|||
|
|
@ -214,8 +214,8 @@ type Os = NoSource;
|
|||
// #3313
|
||||
fn stmt_expr_attributes() {
|
||||
let foo ;
|
||||
(#[must_use]
|
||||
foo) = false ;
|
||||
#[must_use]
|
||||
foo = false ;
|
||||
}
|
||||
|
||||
// #3509
|
||||
|
|
|
|||
|
|
@ -248,8 +248,8 @@ type Os = NoSource;
|
|||
// #3313
|
||||
fn stmt_expr_attributes() {
|
||||
let foo;
|
||||
(#[must_use]
|
||||
foo) = false;
|
||||
#[must_use]
|
||||
foo = false;
|
||||
}
|
||||
|
||||
// #3509
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue