Auto merge of #106812 - oli-obk:output_filenames, r=petrochenkov
make `output_filenames` a real query part of #105462 This may be a perf regression and is not obviously the right way forward. We may store this information in the resolver after freezing it for example.
This commit is contained in:
commit
d7948c843d
@ -417,6 +417,7 @@ fn compute_hir_hash(
|
|||||||
|
|
||||||
pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
|
pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
|
||||||
let sess = tcx.sess;
|
let sess = tcx.sess;
|
||||||
|
tcx.ensure().output_filenames(());
|
||||||
let (mut resolver, krate) = tcx.resolver_for_lowering(()).steal();
|
let (mut resolver, krate) = tcx.resolver_for_lowering(()).steal();
|
||||||
|
|
||||||
let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);
|
let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);
|
||||||
|
@ -296,9 +296,8 @@ fn run_compiler(
|
|||||||
|
|
||||||
if let Some(ppm) = &sess.opts.pretty {
|
if let Some(ppm) = &sess.opts.pretty {
|
||||||
if ppm.needs_ast_map() {
|
if ppm.needs_ast_map() {
|
||||||
let expanded_crate = queries.expansion()?.borrow().0.clone();
|
|
||||||
queries.global_ctxt()?.enter(|tcx| {
|
queries.global_ctxt()?.enter(|tcx| {
|
||||||
pretty::print_after_hir_lowering(tcx, &*expanded_crate, *ppm);
|
pretty::print_after_hir_lowering(tcx, *ppm);
|
||||||
Ok(())
|
Ok(())
|
||||||
})?;
|
})?;
|
||||||
} else {
|
} else {
|
||||||
@ -328,11 +327,15 @@ fn run_compiler(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
queries.global_ctxt()?;
|
let mut gctxt = queries.global_ctxt()?;
|
||||||
if callbacks.after_expansion(compiler, queries) == Compilation::Stop {
|
if callbacks.after_expansion(compiler, queries) == Compilation::Stop {
|
||||||
return early_exit();
|
return early_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure the `output_filenames` query is run for its side
|
||||||
|
// effects of writing the dep-info and reporting errors.
|
||||||
|
gctxt.enter(|tcx| tcx.output_filenames(()));
|
||||||
|
|
||||||
if sess.opts.output_types.contains_key(&OutputType::DepInfo)
|
if sess.opts.output_types.contains_key(&OutputType::DepInfo)
|
||||||
&& sess.opts.output_types.len() == 1
|
&& sess.opts.output_types.len() == 1
|
||||||
{
|
{
|
||||||
@ -343,7 +346,7 @@ fn run_compiler(
|
|||||||
return early_exit();
|
return early_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
queries.global_ctxt()?.enter(|tcx| {
|
gctxt.enter(|tcx| {
|
||||||
let result = tcx.analysis(());
|
let result = tcx.analysis(());
|
||||||
if sess.opts.unstable_opts.save_analysis {
|
if sess.opts.unstable_opts.save_analysis {
|
||||||
let crate_name = tcx.crate_name(LOCAL_CRATE);
|
let crate_name = tcx.crate_name(LOCAL_CRATE);
|
||||||
@ -360,6 +363,8 @@ fn run_compiler(
|
|||||||
result
|
result
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
drop(gctxt);
|
||||||
|
|
||||||
if callbacks.after_analysis(compiler, queries) == Compilation::Stop {
|
if callbacks.after_analysis(compiler, queries) == Compilation::Stop {
|
||||||
return early_exit();
|
return early_exit();
|
||||||
}
|
}
|
||||||
|
@ -403,7 +403,7 @@ pub fn print_after_parsing(sess: &Session, krate: &ast::Crate, ppm: PpMode) {
|
|||||||
write_or_print(&out, sess);
|
write_or_print(&out, sess);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_after_hir_lowering<'tcx>(tcx: TyCtxt<'tcx>, krate: &ast::Crate, ppm: PpMode) {
|
pub fn print_after_hir_lowering<'tcx>(tcx: TyCtxt<'tcx>, ppm: PpMode) {
|
||||||
if ppm.needs_analysis() {
|
if ppm.needs_analysis() {
|
||||||
abort_on_err(print_with_analysis(tcx, ppm), tcx.sess);
|
abort_on_err(print_with_analysis(tcx, ppm), tcx.sess);
|
||||||
return;
|
return;
|
||||||
@ -420,7 +420,7 @@ pub fn print_after_hir_lowering<'tcx>(tcx: TyCtxt<'tcx>, krate: &ast::Crate, ppm
|
|||||||
let parse = &sess.parse_sess;
|
let parse = &sess.parse_sess;
|
||||||
pprust::print_crate(
|
pprust::print_crate(
|
||||||
sess.source_map(),
|
sess.source_map(),
|
||||||
krate,
|
&tcx.resolver_for_lowering(()).borrow().1,
|
||||||
src_name,
|
src_name,
|
||||||
src,
|
src,
|
||||||
annotation.pp_ann(),
|
annotation.pp_ann(),
|
||||||
@ -433,7 +433,7 @@ pub fn print_after_hir_lowering<'tcx>(tcx: TyCtxt<'tcx>, krate: &ast::Crate, ppm
|
|||||||
|
|
||||||
AstTree(PpAstTreeMode::Expanded) => {
|
AstTree(PpAstTreeMode::Expanded) => {
|
||||||
debug!("pretty-printing expanded AST");
|
debug!("pretty-printing expanded AST");
|
||||||
format!("{krate:#?}")
|
format!("{:#?}", tcx.resolver_for_lowering(()).borrow().1)
|
||||||
}
|
}
|
||||||
|
|
||||||
Hir(s) => call_with_pp_support_hir(&s, tcx, move |annotation, hir_map| {
|
Hir(s) => call_with_pp_support_hir(&s, tcx, move |annotation, hir_map| {
|
||||||
|
@ -16,7 +16,7 @@ use rustc_data_structures::parallel;
|
|||||||
use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal};
|
use rustc_data_structures::sync::{Lrc, OnceCell, WorkerLocal};
|
||||||
use rustc_errors::{ErrorGuaranteed, PResult};
|
use rustc_errors::{ErrorGuaranteed, PResult};
|
||||||
use rustc_expand::base::{ExtCtxt, LintStoreExpand, ResolverExpand};
|
use rustc_expand::base::{ExtCtxt, LintStoreExpand, ResolverExpand};
|
||||||
use rustc_hir::def_id::StableCrateId;
|
use rustc_hir::def_id::{StableCrateId, LOCAL_CRATE};
|
||||||
use rustc_lint::{BufferedEarlyLint, EarlyCheckNode, LintStore};
|
use rustc_lint::{BufferedEarlyLint, EarlyCheckNode, LintStore};
|
||||||
use rustc_metadata::creader::CStore;
|
use rustc_metadata::creader::CStore;
|
||||||
use rustc_middle::arena::Arena;
|
use rustc_middle::arena::Arena;
|
||||||
@ -30,7 +30,7 @@ use rustc_plugin_impl as plugin;
|
|||||||
use rustc_query_impl::{OnDiskCache, Queries as TcxQueries};
|
use rustc_query_impl::{OnDiskCache, Queries as TcxQueries};
|
||||||
use rustc_resolve::{Resolver, ResolverArenas};
|
use rustc_resolve::{Resolver, ResolverArenas};
|
||||||
use rustc_session::config::{CrateType, Input, OutputFilenames, OutputType};
|
use rustc_session::config::{CrateType, Input, OutputFilenames, OutputType};
|
||||||
use rustc_session::cstore::{MetadataLoader, MetadataLoaderDyn, Untracked};
|
use rustc_session::cstore::{CrateStoreDyn, MetadataLoader, MetadataLoaderDyn, Untracked};
|
||||||
use rustc_session::output::filename_for_input;
|
use rustc_session::output::filename_for_input;
|
||||||
use rustc_session::search_paths::PathKind;
|
use rustc_session::search_paths::PathKind;
|
||||||
use rustc_session::{Limit, Session};
|
use rustc_session::{Limit, Session};
|
||||||
@ -47,7 +47,7 @@ use std::marker::PhantomPinned;
|
|||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::LazyLock;
|
use std::sync::{Arc, LazyLock};
|
||||||
use std::{env, fs, iter};
|
use std::{env, fs, iter};
|
||||||
|
|
||||||
pub fn parse<'a>(sess: &'a Session) -> PResult<'a, ast::Crate> {
|
pub fn parse<'a>(sess: &'a Session) -> PResult<'a, ast::Crate> {
|
||||||
@ -548,7 +548,7 @@ fn escape_dep_env(symbol: Symbol) -> String {
|
|||||||
|
|
||||||
fn write_out_deps(
|
fn write_out_deps(
|
||||||
sess: &Session,
|
sess: &Session,
|
||||||
boxed_resolver: &RefCell<BoxedResolver>,
|
cstore: &CrateStoreDyn,
|
||||||
outputs: &OutputFilenames,
|
outputs: &OutputFilenames,
|
||||||
out_filenames: &[PathBuf],
|
out_filenames: &[PathBuf],
|
||||||
) {
|
) {
|
||||||
@ -600,20 +600,19 @@ fn write_out_deps(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boxed_resolver.borrow_mut().access(|resolver| {
|
let cstore = cstore.as_any().downcast_ref::<CStore>().unwrap();
|
||||||
for cnum in resolver.cstore().crates_untracked() {
|
for cnum in cstore.crates_untracked() {
|
||||||
let source = resolver.cstore().crate_source_untracked(cnum);
|
let source = cstore.crate_source_untracked(cnum);
|
||||||
if let Some((path, _)) = &source.dylib {
|
if let Some((path, _)) = &source.dylib {
|
||||||
files.push(escape_dep_filename(&path.display().to_string()));
|
files.push(escape_dep_filename(&path.display().to_string()));
|
||||||
}
|
|
||||||
if let Some((path, _)) = &source.rlib {
|
|
||||||
files.push(escape_dep_filename(&path.display().to_string()));
|
|
||||||
}
|
|
||||||
if let Some((path, _)) = &source.rmeta {
|
|
||||||
files.push(escape_dep_filename(&path.display().to_string()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
if let Some((path, _)) = &source.rlib {
|
||||||
|
files.push(escape_dep_filename(&path.display().to_string()));
|
||||||
|
}
|
||||||
|
if let Some((path, _)) = &source.rmeta {
|
||||||
|
files.push(escape_dep_filename(&path.display().to_string()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut file = BufWriter::new(fs::File::create(&deps_filename)?);
|
let mut file = BufWriter::new(fs::File::create(&deps_filename)?);
|
||||||
@ -661,13 +660,11 @@ fn write_out_deps(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prepare_outputs(
|
fn output_filenames(tcx: TyCtxt<'_>, (): ()) -> Arc<OutputFilenames> {
|
||||||
sess: &Session,
|
let sess = tcx.sess;
|
||||||
krate: &ast::Crate,
|
|
||||||
boxed_resolver: &RefCell<BoxedResolver>,
|
|
||||||
crate_name: Symbol,
|
|
||||||
) -> Result<OutputFilenames> {
|
|
||||||
let _timer = sess.timer("prepare_outputs");
|
let _timer = sess.timer("prepare_outputs");
|
||||||
|
let (_, krate) = &*tcx.resolver_for_lowering(()).borrow();
|
||||||
|
let crate_name = tcx.crate_name(LOCAL_CRATE);
|
||||||
|
|
||||||
// FIXME: rustdoc passes &[] instead of &krate.attrs here
|
// FIXME: rustdoc passes &[] instead of &krate.attrs here
|
||||||
let outputs = util::build_output_filenames(&krate.attrs, sess);
|
let outputs = util::build_output_filenames(&krate.attrs, sess);
|
||||||
@ -679,25 +676,21 @@ pub fn prepare_outputs(
|
|||||||
if let Some(ref input_path) = sess.io.input.opt_path() {
|
if let Some(ref input_path) = sess.io.input.opt_path() {
|
||||||
if sess.opts.will_create_output_file() {
|
if sess.opts.will_create_output_file() {
|
||||||
if output_contains_path(&output_paths, input_path) {
|
if output_contains_path(&output_paths, input_path) {
|
||||||
let reported = sess.emit_err(InputFileWouldBeOverWritten { path: input_path });
|
sess.emit_fatal(InputFileWouldBeOverWritten { path: input_path });
|
||||||
return Err(reported);
|
|
||||||
}
|
}
|
||||||
if let Some(ref dir_path) = output_conflicts_with_dir(&output_paths) {
|
if let Some(ref dir_path) = output_conflicts_with_dir(&output_paths) {
|
||||||
let reported =
|
sess.emit_fatal(GeneratedFileConflictsWithDirectory { input_path, dir_path });
|
||||||
sess.emit_err(GeneratedFileConflictsWithDirectory { input_path, dir_path });
|
|
||||||
return Err(reported);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ref dir) = sess.io.temps_dir {
|
if let Some(ref dir) = sess.io.temps_dir {
|
||||||
if fs::create_dir_all(dir).is_err() {
|
if fs::create_dir_all(dir).is_err() {
|
||||||
let reported = sess.emit_err(TempsDirError);
|
sess.emit_fatal(TempsDirError);
|
||||||
return Err(reported);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
write_out_deps(sess, boxed_resolver, &outputs, &output_paths);
|
write_out_deps(sess, tcx.cstore_untracked(), &outputs, &output_paths);
|
||||||
|
|
||||||
let only_dep_info = sess.opts.output_types.contains_key(&OutputType::DepInfo)
|
let only_dep_info = sess.opts.output_types.contains_key(&OutputType::DepInfo)
|
||||||
&& sess.opts.output_types.len() == 1;
|
&& sess.opts.output_types.len() == 1;
|
||||||
@ -705,19 +698,19 @@ pub fn prepare_outputs(
|
|||||||
if !only_dep_info {
|
if !only_dep_info {
|
||||||
if let Some(ref dir) = sess.io.output_dir {
|
if let Some(ref dir) = sess.io.output_dir {
|
||||||
if fs::create_dir_all(dir).is_err() {
|
if fs::create_dir_all(dir).is_err() {
|
||||||
let reported = sess.emit_err(OutDirError);
|
sess.emit_fatal(OutDirError);
|
||||||
return Err(reported);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(outputs)
|
outputs.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub static DEFAULT_QUERY_PROVIDERS: LazyLock<Providers> = LazyLock::new(|| {
|
pub static DEFAULT_QUERY_PROVIDERS: LazyLock<Providers> = LazyLock::new(|| {
|
||||||
let providers = &mut Providers::default();
|
let providers = &mut Providers::default();
|
||||||
providers.analysis = analysis;
|
providers.analysis = analysis;
|
||||||
providers.hir_crate = rustc_ast_lowering::lower_to_hir;
|
providers.hir_crate = rustc_ast_lowering::lower_to_hir;
|
||||||
|
providers.output_filenames = output_filenames;
|
||||||
proc_macro_decls::provide(providers);
|
proc_macro_decls::provide(providers);
|
||||||
rustc_const_eval::provide(providers);
|
rustc_const_eval::provide(providers);
|
||||||
rustc_middle::hir::provide(providers);
|
rustc_middle::hir::provide(providers);
|
||||||
|
@ -65,7 +65,7 @@ impl<'a, T> std::ops::DerefMut for QueryResult<'a, T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, 'tcx> QueryResult<'a, QueryContext<'tcx>> {
|
impl<'a, 'tcx> QueryResult<'a, QueryContext<'tcx>> {
|
||||||
pub fn enter<T>(mut self, f: impl FnOnce(TyCtxt<'tcx>) -> T) -> T {
|
pub fn enter<T>(&mut self, f: impl FnOnce(TyCtxt<'tcx>) -> T) -> T {
|
||||||
(*self.0).get_mut().enter(f)
|
(*self.0).get_mut().enter(f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -212,8 +212,6 @@ impl<'tcx> Queries<'tcx> {
|
|||||||
let crate_name = *self.crate_name()?.borrow();
|
let crate_name = *self.crate_name()?.borrow();
|
||||||
let (krate, resolver, lint_store) = self.expansion()?.steal();
|
let (krate, resolver, lint_store) = self.expansion()?.steal();
|
||||||
|
|
||||||
let outputs = passes::prepare_outputs(self.session(), &krate, &resolver, crate_name)?;
|
|
||||||
|
|
||||||
let ty::ResolverOutputs {
|
let ty::ResolverOutputs {
|
||||||
untracked,
|
untracked,
|
||||||
global_ctxt: untracked_resolutions,
|
global_ctxt: untracked_resolutions,
|
||||||
@ -237,7 +235,6 @@ impl<'tcx> Queries<'tcx> {
|
|||||||
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))),
|
tcx.arena.alloc(Steal::new((untracked_resolver_for_lowering, krate))),
|
||||||
);
|
);
|
||||||
feed.resolutions(tcx.arena.alloc(untracked_resolutions));
|
feed.resolutions(tcx.arena.alloc(untracked_resolutions));
|
||||||
feed.output_filenames(tcx.arena.alloc(std::sync::Arc::new(outputs)));
|
|
||||||
feed.features_query(tcx.sess.features_untracked());
|
feed.features_query(tcx.sess.features_untracked());
|
||||||
let feed = tcx.feed_local_crate();
|
let feed = tcx.feed_local_crate();
|
||||||
feed.crate_name(crate_name);
|
feed.crate_name(crate_name);
|
||||||
|
@ -1863,9 +1863,10 @@ rustc_queries! {
|
|||||||
///
|
///
|
||||||
/// This query returns an `&Arc` because codegen backends need the value even after the `TyCtxt`
|
/// This query returns an `&Arc` because codegen backends need the value even after the `TyCtxt`
|
||||||
/// has been destroyed.
|
/// has been destroyed.
|
||||||
query output_filenames(_: ()) -> &'tcx Arc<OutputFilenames> {
|
query output_filenames(_: ()) -> Arc<OutputFilenames> {
|
||||||
feedable
|
feedable
|
||||||
desc { "getting output filenames" }
|
desc { "getting output filenames" }
|
||||||
|
arena_cache
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Do not call this query directly: invoke `normalize` instead.
|
/// Do not call this query directly: invoke `normalize` instead.
|
||||||
|
@ -815,7 +815,7 @@ fn main_args(at_args: &[String]) -> MainResult {
|
|||||||
sess.fatal("Compilation failed, aborting rustdoc");
|
sess.fatal("Compilation failed, aborting rustdoc");
|
||||||
}
|
}
|
||||||
|
|
||||||
let global_ctxt = abort_on_err(queries.global_ctxt(), sess);
|
let mut global_ctxt = abort_on_err(queries.global_ctxt(), sess);
|
||||||
|
|
||||||
global_ctxt.enter(|tcx| {
|
global_ctxt.enter(|tcx| {
|
||||||
let (krate, render_opts, mut cache) = sess.time("run_global_ctxt", || {
|
let (krate, render_opts, mut cache) = sess.time("run_global_ctxt", || {
|
||||||
|
13
tests/run-make/overwrite-input/Makefile
Normal file
13
tests/run-make/overwrite-input/Makefile
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
include ../../run-make-fulldeps/tools.mk
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(RUSTC) main.rs -o main.rs 2> $(TMPDIR)/file.stderr || echo "failed successfully"
|
||||||
|
$(RUSTC) main.rs -o . 2> $(TMPDIR)/folder.stderr || echo "failed successfully"
|
||||||
|
|
||||||
|
ifdef RUSTC_BLESS_TEST
|
||||||
|
cp "$(TMPDIR)"/file.stderr file.stderr
|
||||||
|
cp "$(TMPDIR)"/folder.stderr folder.stderr
|
||||||
|
else
|
||||||
|
$(DIFF) file.stderr "$(TMPDIR)"/file.stderr
|
||||||
|
$(DIFF) folder.stderr "$(TMPDIR)"/folder.stderr
|
||||||
|
endif
|
6
tests/run-make/overwrite-input/file.stderr
Normal file
6
tests/run-make/overwrite-input/file.stderr
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
warning: ignoring --out-dir flag due to -o flag
|
||||||
|
|
||||||
|
error: the input file "main.rs" would be overwritten by the generated executable
|
||||||
|
|
||||||
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
6
tests/run-make/overwrite-input/folder.stderr
Normal file
6
tests/run-make/overwrite-input/folder.stderr
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
warning: ignoring --out-dir flag due to -o flag
|
||||||
|
|
||||||
|
error: the generated executable for the input file "main.rs" conflicts with the existing directory "."
|
||||||
|
|
||||||
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
1
tests/run-make/overwrite-input/main.rs
Normal file
1
tests/run-make/overwrite-input/main.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
fn main() {}
|
6
tests/run-make/overwrite-input/main.stderr
Normal file
6
tests/run-make/overwrite-input/main.stderr
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
warning: ignoring --out-dir flag due to -o flag
|
||||||
|
|
||||||
|
error: the input file "main.rs" would be overwritten by the generated executable
|
||||||
|
|
||||||
|
error: aborting due to previous error; 1 warning emitted
|
||||||
|
|
39
tests/ui/io-checks/inaccessbile-temp-dir.rs
Normal file
39
tests/ui/io-checks/inaccessbile-temp-dir.rs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
// Issue #66530: We would ICE if someone compiled with `-o /dev/null`,
|
||||||
|
// because we would try to generate auxiliary files in `/dev/` (which
|
||||||
|
// at least the OS X file system rejects).
|
||||||
|
//
|
||||||
|
// An attempt to `-o` into a directory we cannot write into should indeed
|
||||||
|
// be an error; but not an ICE.
|
||||||
|
//
|
||||||
|
// However, some folks run tests as root, which can write `/dev/` and end
|
||||||
|
// up clobbering `/dev/null`. Instead we'll use a non-existent path, which
|
||||||
|
// also used to ICE, but even root can't magically write there.
|
||||||
|
|
||||||
|
// compile-flags: -Z temps-dir=/does-not-exist/output
|
||||||
|
|
||||||
|
// The error-pattern check occurs *before* normalization, and the error patterns
|
||||||
|
// are wildly different between build environments. So this is a cop-out (and we
|
||||||
|
// rely on the checking of the normalized stderr output as our actual
|
||||||
|
// "verification" of the diagnostic).
|
||||||
|
|
||||||
|
// error-pattern: error
|
||||||
|
|
||||||
|
// On Mac OS X, we get an error like the below
|
||||||
|
// normalize-stderr-test "failed to write bytecode to /does-not-exist/output.non_ice_error_on_worker_io_fail.*" -> "io error modifying /does-not-exist/"
|
||||||
|
|
||||||
|
// On Linux, we get an error like the below
|
||||||
|
// normalize-stderr-test "couldn't create a temp dir.*" -> "io error modifying /does-not-exist/"
|
||||||
|
|
||||||
|
// ignore-windows - this is a unix-specific test
|
||||||
|
// ignore-emscripten - the file-system issues do not replicate here
|
||||||
|
// ignore-wasm - the file-system issues do not replicate here
|
||||||
|
// ignore-arm - the file-system issues do not replicate here, at least on armhf-gnu
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
pub mod task {
|
||||||
|
pub mod __internal {
|
||||||
|
use crate::task::Waker;
|
||||||
|
}
|
||||||
|
pub use core::task::Waker;
|
||||||
|
}
|
4
tests/ui/io-checks/inaccessbile-temp-dir.stderr
Normal file
4
tests/ui/io-checks/inaccessbile-temp-dir.stderr
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
error: failed to find or create the directory specified by `--temps-dir`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user