Skip to content

Commit 10345ff

Browse files
committed
Detect cross-mode and skip doc-tests
1 parent 154fb52 commit 10345ff

File tree

4 files changed

+46
-12
lines changed

4 files changed

+46
-12
lines changed

cargo-miri/bin.rs

+14-6
Original file line numberDiff line numberDiff line change
@@ -882,26 +882,34 @@ fn phase_cargo_rustdoc(fst_arg: &str, mut args: env::Args) {
882882

883883
// Because of the way the main function is structured, we have to take the first argument spearately
884884
// from the rest; to simplify the following argument patching loop, we'll just skip that one.
885-
// This is fine for now, because cargo will never pass the relevant arguments in the first position,
885+
// This is fine for now, because cargo will never pass --extern arguments in the first position,
886886
// but we should defensively assert that this will work.
887887
let extern_flag = "--extern";
888-
let runtool_flag = "--runtool";
889888
assert!(fst_arg != extern_flag);
890-
assert!(fst_arg != runtool_flag);
891889
cmd.arg(fst_arg);
892-
890+
891+
let runtool_flag = "--runtool";
892+
let mut crossmode = fst_arg == runtool_flag;
893893
while let Some(arg) = args.next() {
894894
if arg == extern_flag {
895895
// Patch --extern arguments to use *.rmeta files, since phase_cargo_rustc only creates stub *.rlib files.
896896
forward_patched_extern_arg(&mut args, &mut cmd);
897897
} else if arg == runtool_flag {
898-
// Do not forward an existing --runtool argument, since we will set this ourselves
899-
let _ = args.next().expect("`--runtool` should be followed by an executable name");
898+
// An existing --runtool flag indicates cargo is running in cross-target mode, which we don't support.
899+
// Note that this is only passed when cargo is run with the unstable -Zdoctest-xcompile flag;
900+
// otherwise, we won't be called as rustdoc at all.
901+
crossmode = true;
902+
break;
900903
} else {
901904
cmd.arg(arg);
902905
}
903906
}
904907

908+
if crossmode {
909+
eprintln!("Cross-interpreting doc-tests is not currently supported by Miri.");
910+
return;
911+
}
912+
905913
// For each doc-test, rustdoc starts two child processes: first the test is compiled,
906914
// then the produced executable is invoked. We want to reroute both of these to cargo-miri,
907915
// such that the first time we'll enter phase_cargo_rustc, and phase_cargo_runner second.

test-cargo-miri/run-test.py

+11-6
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ def fail(msg):
1616
sys.exit(1)
1717

1818
def cargo_miri(cmd):
19-
args = ["cargo", "+nightly", "miri", cmd, "-q"]
19+
args = ["cargo", "miri", cmd, "-q"]
2020
if 'MIRI_TEST_TARGET' in os.environ:
21-
args += ["-Zdoctest-xcompile"]
2221
args += ["--target", os.environ['MIRI_TEST_TARGET']]
2322
return args
2423

2524
def normalize_stdout(str):
25+
str = str.replace("src\\", "src/") # normalize paths across platforms
2626
return re.sub("finished in \d+\.\d\ds", "finished in $TIME", str)
2727

2828
def test(name, cmd, stdout_ref, stderr_ref, stdin=b'', env={}):
@@ -73,24 +73,29 @@ def test_cargo_miri_run():
7373
)
7474

7575
def test_cargo_miri_test():
76+
# rustdoc is not run on foreign targets
77+
is_foreign = 'MIRI_TEST_TARGET' in os.environ
78+
default_ref = "test.cross-target.stdout.ref" if is_foreign else "test.default.stdout.ref"
79+
filter_ref = "test.filter.cross-target.stdout.ref" if is_foreign else "test.filter.stdout.ref"
80+
7681
test("`cargo miri test`",
7782
cargo_miri("test"),
78-
"test.default.stdout.ref", "test.stderr-empty.ref",
83+
default_ref, "test.stderr-empty.ref",
7984
env={'MIRIFLAGS': "-Zmiri-seed=feed"},
8085
)
8186
test("`cargo miri test` (no isolation)",
8287
cargo_miri("test"),
83-
"test.default.stdout.ref", "test.stderr-empty.ref",
88+
default_ref, "test.stderr-empty.ref",
8489
env={'MIRIFLAGS': "-Zmiri-disable-isolation"},
8590
)
8691
test("`cargo miri test` (raw-ptr tracking)",
8792
cargo_miri("test"),
88-
"test.default.stdout.ref", "test.stderr-empty.ref",
93+
default_ref, "test.stderr-empty.ref",
8994
env={'MIRIFLAGS': "-Zmiri-track-raw-pointers"},
9095
)
9196
test("`cargo miri test` (with filter)",
9297
cargo_miri("test") + ["--", "--format=pretty", "le1"],
93-
"test.filter.stdout.ref", "test.stderr-empty.ref",
98+
filter_ref, "test.stderr-empty.ref",
9499
)
95100
test("`cargo miri test` (test target)",
96101
cargo_miri("test") + ["--test", "test", "--", "--format=pretty"],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
running 1 test
3+
.
4+
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
5+
6+
7+
running 7 tests
8+
..i....
9+
test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
running 0 tests
3+
4+
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out
5+
6+
7+
running 1 test
8+
test simple1 ... ok
9+
10+
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out
11+

0 commit comments

Comments
 (0)