Skip to content

Commit ded16b3

Browse files
authored
Rollup merge of #122842 - pacak:explicit_name, r=michaelwoerister
Don't emit an error about failing to produce a file with a specific name if user never gave an explicit name Fixes #122509 You can ask `rustc` to produce some intermediate results with `--emit foo`, this operation comes in two flavors: `--emit asm` and `--emit asm=foo.s`. First one produces one or more `.s` files without any name guarantees, second one renames it into `foo.s`. Second version only works when compiler produces a single file - for asm files this means using a single compilation unit for example. In case compilation produced more than a single file `rustc` runs following check to emit some warnings: ```rust if crate_output.outputs.contains_key(&output_type) { // 2) Multiple codegen units, with `--emit foo=some_name`. We have // no good solution for this case, so warn the user. sess.dcx().emit_warn(errors::IgnoringEmitPath { extension }); } else if crate_output.single_output_file.is_some() { // 3) Multiple codegen units, with `-o some_name`. We have // no good solution for this case, so warn the user. sess.dcx().emit_warn(errors::IgnoringOutput { extension }); } else { // 4) Multiple codegen units, but no explicit name. We // just leave the `foo.0.x` files in place. // (We don't have to do any work in this case.) } ``` Comment in the final `else` branch implies that if user didn't ask for a specific name - there's no need to emit warnings. However because of the internal representation of `crate_output.outputs` - this doesn't work as expected: if user asked to produce an asm file without giving it an implicit name it will contain `Some(None)`. To fix the problem new code actually checks if user gave an explicit name. I think this was an original intentional behavior, at least comments imply that.
2 parents af98101 + b84326e commit ded16b3

File tree

4 files changed

+30
-2
lines changed

4 files changed

+30
-2
lines changed

compiler/rustc_codegen_ssa/src/back/write.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ fn produce_final_output_artifacts(
592592
.unwrap()
593593
.to_owned();
594594

595-
if crate_output.outputs.contains_key(&output_type) {
595+
if crate_output.outputs.contains_explicit_name(&output_type) {
596596
// 2) Multiple codegen units, with `--emit foo=some_name`. We have
597597
// no good solution for this case, so warn the user.
598598
sess.dcx().emit_warn(errors::IgnoringEmitPath { extension });

compiler/rustc_session/src/config.rs

+5
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,11 @@ impl OutputTypes {
557557
self.0.contains_key(key)
558558
}
559559

560+
/// Returns `true` if user specified a name and not just produced type
561+
pub fn contains_explicit_name(&self, key: &OutputType) -> bool {
562+
self.0.get(key).map_or(false, |f| f.is_some())
563+
}
564+
560565
pub fn iter(&self) -> BTreeMapIter<'_, OutputType, Option<OutFileName>> {
561566
self.0.iter()
562567
}

src/tools/tidy/src/ui_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const ENTRY_LIMIT: usize = 900;
1818
// FIXME: The following limits should be reduced eventually.
1919

2020
const ISSUES_ENTRY_LIMIT: usize = 1750;
21-
const ROOT_ENTRY_LIMIT: usize = 859;
21+
const ROOT_ENTRY_LIMIT: usize = 860;
2222

2323
const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[
2424
"rs", // test source files
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//@ build-pass
2+
//@ compile-flags: -C codegen-units=2 --emit asm
3+
4+
fn one() -> usize {
5+
1
6+
}
7+
8+
pub mod a {
9+
pub fn two() -> usize {
10+
::one() + ::one()
11+
}
12+
}
13+
14+
pub mod b {
15+
pub fn three() -> usize {
16+
::one() + ::a::two()
17+
}
18+
}
19+
20+
fn main() {
21+
a::two();
22+
b::three();
23+
}

0 commit comments

Comments
 (0)