Auto merge of #95987 - m-ou-se:rollup-sdevd9b, r=m-ou-se

Rollup of 4 pull requests

Successful merges:

 - #95783 (rustdoc doctest: include signal number in exit status)
 - #95794 (`parse_tt`: a few more tweaks)
 - #95963 ([bootstrap] Grab the right FileCheck binary for dist when cross-compiling.)
 - #95975 (Don't test -Cdefault-linker-libraries=yes when cross compiling.)

Failed merges:

r? `@ghost`
`@rustbot` modify labels: rollup
This commit is contained in:
bors 2022-04-12 18:44:05 +00:00
commit 52ca603da7
9 changed files with 95 additions and 45 deletions

View File

@ -81,22 +81,12 @@
use rustc_span::symbol::MacroRulesNormalizedIdent; use rustc_span::symbol::MacroRulesNormalizedIdent;
use rustc_span::Span; use rustc_span::Span;
use smallvec::{smallvec, SmallVec};
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_data_structures::sync::Lrc; use rustc_data_structures::sync::Lrc;
use rustc_span::symbol::Ident; use rustc_span::symbol::Ident;
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::hash_map::Entry::{Occupied, Vacant}; use std::collections::hash_map::Entry::{Occupied, Vacant};
// One element is enough to cover 95-99% of vectors for most benchmarks. Also, vectors longer than
// one frequently have many elements, not just two or three.
type NamedMatchVec = SmallVec<[NamedMatch; 1]>;
// This type is used a lot. Make sure it doesn't unintentionally get bigger.
#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))]
rustc_data_structures::static_assert_size!(NamedMatchVec, 48);
/// A unit within a matcher that a `MatcherPos` can refer to. Similar to (and derived from) /// A unit within a matcher that a `MatcherPos` can refer to. Similar to (and derived from)
/// `mbe::TokenTree`, but designed specifically for fast and easy traversal during matching. /// `mbe::TokenTree`, but designed specifically for fast and easy traversal during matching.
/// Notable differences to `mbe::TokenTree`: /// Notable differences to `mbe::TokenTree`:
@ -221,7 +211,11 @@ struct MatcherPos {
/// with one element per metavar decl in the matcher. Each element records token trees matched /// with one element per metavar decl in the matcher. Each element records token trees matched
/// against the relevant metavar by the black box parser. An element will be a `MatchedSeq` if /// against the relevant metavar by the black box parser. An element will be a `MatchedSeq` if
/// the corresponding metavar decl is within a sequence. /// the corresponding metavar decl is within a sequence.
matches: Lrc<NamedMatchVec>, ///
/// It is critical to performance that this is an `Lrc`, because it gets cloned frequently when
/// processing sequences. Mostly for sequence-ending possibilities that must be tried but end
/// up failing.
matches: Lrc<Vec<NamedMatch>>,
} }
// This type is used a lot. Make sure it doesn't unintentionally get bigger. // This type is used a lot. Make sure it doesn't unintentionally get bigger.
@ -246,18 +240,12 @@ fn push_match(&mut self, metavar_idx: usize, seq_depth: usize, m: NamedMatch) {
let mut curr = &mut matches[metavar_idx]; let mut curr = &mut matches[metavar_idx];
for _ in 0..seq_depth - 1 { for _ in 0..seq_depth - 1 {
match curr { match curr {
MatchedSeq(seq) => { MatchedSeq(seq) => curr = seq.last_mut().unwrap(),
let seq = Lrc::make_mut(seq);
curr = seq.last_mut().unwrap();
}
_ => unreachable!(), _ => unreachable!(),
} }
} }
match curr { match curr {
MatchedSeq(seq) => { MatchedSeq(seq) => seq.push(m),
let seq = Lrc::make_mut(seq);
seq.push(m);
}
_ => unreachable!(), _ => unreachable!(),
} }
} }
@ -350,7 +338,7 @@ pub(super) fn count_metavar_decls(matcher: &[TokenTree]) -> usize {
/// ``` /// ```
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
crate enum NamedMatch { crate enum NamedMatch {
MatchedSeq(Lrc<NamedMatchVec>), MatchedSeq(Vec<NamedMatch>),
// A metavar match of type `tt`. // A metavar match of type `tt`.
MatchedTokenTree(rustc_ast::tokenstream::TokenTree), MatchedTokenTree(rustc_ast::tokenstream::TokenTree),
@ -388,7 +376,7 @@ pub struct TtParser {
/// Pre-allocate an empty match array, so it can be cloned cheaply for macros with many rules /// Pre-allocate an empty match array, so it can be cloned cheaply for macros with many rules
/// that have no metavars. /// that have no metavars.
empty_matches: Lrc<NamedMatchVec>, empty_matches: Lrc<Vec<NamedMatch>>,
} }
impl TtParser { impl TtParser {
@ -398,7 +386,7 @@ pub(super) fn new(macro_name: Ident) -> TtParser {
cur_mps: vec![], cur_mps: vec![],
next_mps: vec![], next_mps: vec![],
bb_mps: vec![], bb_mps: vec![],
empty_matches: Lrc::new(smallvec![]), empty_matches: Lrc::new(vec![]),
} }
} }
@ -452,11 +440,7 @@ fn parse_tt_inner(
} => { } => {
// Install an empty vec for each metavar within the sequence. // Install an empty vec for each metavar within the sequence.
for metavar_idx in next_metavar..next_metavar + num_metavar_decls { for metavar_idx in next_metavar..next_metavar + num_metavar_decls {
mp.push_match( mp.push_match(metavar_idx, seq_depth, MatchedSeq(vec![]));
metavar_idx,
seq_depth,
MatchedSeq(self.empty_matches.clone()),
);
} }
if op == KleeneOp::ZeroOrMore || op == KleeneOp::ZeroOrOne { if op == KleeneOp::ZeroOrMore || op == KleeneOp::ZeroOrOne {

View File

@ -439,7 +439,8 @@ pub fn compile_declarative_macro(
let argument_gram = mbe::macro_parser::compute_locs(&sess.parse_sess, &argument_gram); let argument_gram = mbe::macro_parser::compute_locs(&sess.parse_sess, &argument_gram);
let parser = Parser::new(&sess.parse_sess, body, true, rustc_parse::MACRO_ARGUMENTS); let parser = Parser::new(&sess.parse_sess, body, true, rustc_parse::MACRO_ARGUMENTS);
let mut tt_parser = TtParser::new(def.ident); let mut tt_parser =
TtParser::new(Ident::with_dummy_span(if macro_rules { kw::MacroRules } else { kw::Macro }));
let argument_map = match tt_parser.parse_tt(&mut Cow::Borrowed(&parser), &argument_gram) { let argument_map = match tt_parser.parse_tt(&mut Cow::Borrowed(&parser), &argument_gram) {
Success(m) => m, Success(m) => m,
Failure(token, msg) => { Failure(token, msg) => {

View File

@ -865,8 +865,8 @@ fn llvm_filecheck(&self, target: TargetSelection) -> PathBuf {
} }
} }
} else { } else {
let base = self.llvm_out(self.config.build).join("build"); let base = self.llvm_out(target).join("build");
let base = if !self.ninja() && self.config.build.contains("msvc") { let base = if !self.ninja() && target.contains("msvc") {
if self.config.llvm_optimize { if self.config.llvm_optimize {
if self.config.llvm_release_debuginfo { if self.config.llvm_release_debuginfo {
base.join("RelWithDebInfo") base.join("RelWithDebInfo")

View File

@ -1069,13 +1069,7 @@ fn add_test(&mut self, test: String, config: LangString, line: usize) {
} }
} }
TestFailure::ExecutionFailure(out) => { TestFailure::ExecutionFailure(out) => {
let reason = if let Some(code) = out.status.code() { eprintln!("Test executable failed ({reason}).", reason = out.status);
format!("exit code {code}")
} else {
String::from("terminated by signal")
};
eprintln!("Test executable failed ({reason}).");
// FIXME(#12309): An unfortunate side-effect of capturing the test // FIXME(#12309): An unfortunate side-effect of capturing the test
// executable's output is that the relative ordering between the test's // executable's output is that the relative ordering between the test's

View File

@ -0,0 +1,28 @@
// only-windows
// There's a parallel generic version of this test for non-windows platforms.
// Issue #51162: A failed doctest was not printing its stdout/stderr
// FIXME: if/when the output of the test harness can be tested on its own, this test should be
// adapted to use that, and that normalize line can go away
// compile-flags:--test --test-args --test-threads=1
// rustc-env:RUST_BACKTRACE=0
// normalize-stdout-test: "src/test/rustdoc-ui" -> "$$DIR"
// normalize-stdout-test "finished in \d+\.\d+s" -> "finished in $$TIME"
// failure-status: 101
// doctest fails at runtime
/// ```
/// println!("stdout 1");
/// eprintln!("stderr 1");
/// println!("stdout 2");
/// eprintln!("stderr 2");
/// panic!("oh no");
/// ```
pub struct SomeStruct;
// doctest fails at compile time
/// ```
/// no
/// ```
pub struct OtherStruct;

View File

@ -0,0 +1,39 @@
running 2 tests
test $DIR/failed-doctest-output-windows.rs - OtherStruct (line 25) ... FAILED
test $DIR/failed-doctest-output-windows.rs - SomeStruct (line 15) ... FAILED
failures:
---- $DIR/failed-doctest-output-windows.rs - OtherStruct (line 25) stdout ----
error[E0425]: cannot find value `no` in this scope
--> $DIR/failed-doctest-output-windows.rs:26:1
|
LL | no
| ^^ not found in this scope
error: aborting due to previous error
For more information about this error, try `rustc --explain E0425`.
Couldn't compile the test.
---- $DIR/failed-doctest-output-windows.rs - SomeStruct (line 15) stdout ----
Test executable failed (exit code: 101).
stdout:
stdout 1
stdout 2
stderr:
stderr 1
stderr 2
thread 'main' panicked at 'oh no', $DIR/failed-doctest-output-windows.rs:7:1
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
$DIR/failed-doctest-output-windows.rs - OtherStruct (line 25)
$DIR/failed-doctest-output-windows.rs - SomeStruct (line 15)
test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME

View File

@ -1,3 +1,6 @@
// ignore-windows
// There's a parallel version of this test for Windows.
// Issue #51162: A failed doctest was not printing its stdout/stderr // Issue #51162: A failed doctest was not printing its stdout/stderr
// FIXME: if/when the output of the test harness can be tested on its own, this test should be // FIXME: if/when the output of the test harness can be tested on its own, this test should be
// adapted to use that, and that normalize line can go away // adapted to use that, and that normalize line can go away

View File

@ -1,13 +1,13 @@
running 2 tests running 2 tests
test $DIR/failed-doctest-output.rs - OtherStruct (line 22) ... FAILED test $DIR/failed-doctest-output.rs - OtherStruct (line 25) ... FAILED
test $DIR/failed-doctest-output.rs - SomeStruct (line 12) ... FAILED test $DIR/failed-doctest-output.rs - SomeStruct (line 15) ... FAILED
failures: failures:
---- $DIR/failed-doctest-output.rs - OtherStruct (line 22) stdout ---- ---- $DIR/failed-doctest-output.rs - OtherStruct (line 25) stdout ----
error[E0425]: cannot find value `no` in this scope error[E0425]: cannot find value `no` in this scope
--> $DIR/failed-doctest-output.rs:23:1 --> $DIR/failed-doctest-output.rs:26:1
| |
LL | no LL | no
| ^^ not found in this scope | ^^ not found in this scope
@ -16,8 +16,8 @@ error: aborting due to previous error
For more information about this error, try `rustc --explain E0425`. For more information about this error, try `rustc --explain E0425`.
Couldn't compile the test. Couldn't compile the test.
---- $DIR/failed-doctest-output.rs - SomeStruct (line 12) stdout ---- ---- $DIR/failed-doctest-output.rs - SomeStruct (line 15) stdout ----
Test executable failed (exit code 101). Test executable failed (exit status: 101).
stdout: stdout:
stdout 1 stdout 1
@ -32,8 +32,8 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures: failures:
$DIR/failed-doctest-output.rs - OtherStruct (line 22) $DIR/failed-doctest-output.rs - OtherStruct (line 25)
$DIR/failed-doctest-output.rs - SomeStruct (line 12) $DIR/failed-doctest-output.rs - SomeStruct (line 15)
test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME test result: FAILED. 0 passed; 2 failed; 0 ignored; 0 measured; 0 filtered out; finished in $TIME

View File

@ -2,6 +2,7 @@
// compile-flags: -Zlink-native-libraries=no -Cdefault-linker-libraries=yes // compile-flags: -Zlink-native-libraries=no -Cdefault-linker-libraries=yes
// ignore-windows - this will probably only work on unixish systems // ignore-windows - this will probably only work on unixish systems
// ignore-fuchsia - missing __libc_start_main for some reason (#84733) // ignore-fuchsia - missing __libc_start_main for some reason (#84733)
// ignore-cross-compile - default-linker-libraries=yes doesn't play well with cross compiling
#[link(name = "some-random-non-existent-library", kind = "static")] #[link(name = "some-random-non-existent-library", kind = "static")]
extern "C" {} extern "C" {}