X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Ftools%2Fcompiletest%2Fsrc%2Fheader.rs;h=b8008152e2a0525b47d825d285e1b6b4ac7f0602;hb=947d7cf16db583bae255260696f022fb0e7ea4db;hp=ab5594f36050d6ea85acd1dd64240063611da986;hpb=93271d159e10b8216678ddf6b9ca5bf68c569de1;p=rust.git diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index ab5594f3605..b8008152e2a 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -6,7 +6,7 @@ use log::*; -use crate::common::{self, CompareMode, Config, Mode}; +use crate::common::{self, CompareMode, Config, Mode, PassMode}; use crate::util; use crate::extract_gdb_version; @@ -349,14 +349,12 @@ pub struct TestProps { // testing harness and used when generating compilation // arguments. (In particular, it propagates to the aux-builds.) pub incremental_dir: Option, - // Specifies that a test must actually compile without errors. - pub compile_pass: bool, + // How far should the test proceed while still passing. + pass_mode: Option, + // Ignore `--pass` overrides from the command line for this test. + ignore_pass: bool, // rustdoc will test the output of the `--test` option pub check_test_line_numbers_match: bool, - // The test must be compiled and run successfully. Only used in UI tests for now. - pub run_pass: bool, - // Skip any codegen step and running the executable. Only for run-pass. - pub skip_codegen: bool, // Do not pass `-Z ui-testing` to UI tests pub disable_ui_testing_normalization: bool, // customized normalization rules @@ -396,10 +394,9 @@ pub fn new() -> Self { pretty_compare_only: false, forbid_output: vec![], incremental_dir: None, - compile_pass: false, + pass_mode: None, + ignore_pass: false, check_test_line_numbers_match: false, - run_pass: false, - skip_codegen: false, disable_ui_testing_normalization: false, normalize_stdout: vec![], normalize_stderr: vec![], @@ -525,17 +522,10 @@ fn load_from(&mut self, testfile: &Path, cfg: Option<&str>, config: &Config) { self.check_test_line_numbers_match = config.parse_check_test_line_numbers_match(ln); } - if !self.run_pass { - self.run_pass = config.parse_run_pass(ln); - } - - if !self.compile_pass { - // run-pass implies compile_pass - self.compile_pass = config.parse_compile_pass(ln) || self.run_pass; - } + self.update_pass_mode(ln, cfg, config); - if !self.skip_codegen { - self.skip_codegen = config.parse_skip_codegen(ln); + if !self.ignore_pass { + self.ignore_pass = config.parse_ignore_pass(ln); } if !self.disable_ui_testing_normalization { @@ -583,6 +573,47 @@ fn load_from(&mut self, testfile: &Path, cfg: Option<&str>, config: &Config) { } } } + + fn update_pass_mode(&mut self, ln: &str, revision: Option<&str>, config: &Config) { + let check_no_run = |s| { + if config.mode != Mode::Ui && config.mode != Mode::Incremental { + panic!("`{}` header is only supported in UI and incremental tests", s); + } + if config.mode == Mode::Incremental && + !revision.map_or(false, |r| r.starts_with("cfail")) && + !self.revisions.iter().all(|r| r.starts_with("cfail")) { + panic!("`{}` header is only supported in `cfail` incremental tests", s); + } + }; + let pass_mode = if config.parse_name_directive(ln, "check-pass") { + check_no_run("check-pass"); + Some(PassMode::Check) + } else if config.parse_name_directive(ln, "build-pass") { + check_no_run("build-pass"); + Some(PassMode::Build) + } else if config.parse_name_directive(ln, "run-pass") { + if config.mode != Mode::Ui && config.mode != Mode::RunPass /* compatibility */ { + panic!("`run-pass` header is only supported in UI tests") + } + Some(PassMode::Run) + } else { + None + }; + match (self.pass_mode, pass_mode) { + (None, Some(_)) => self.pass_mode = pass_mode, + (Some(_), Some(_)) => panic!("multiple `*-pass` headers in a single test"), + (_, None) => {} + } + } + + pub fn pass_mode(&self, config: &Config) -> Option { + if !self.ignore_pass { + if let (mode @ Some(_), Some(_)) = (config.force_pass_mode, self.pass_mode) { + return mode; + } + } + self.pass_mode + } } fn iter_header(testfile: &Path, cfg: Option<&str>, it: &mut dyn FnMut(&str)) { @@ -710,10 +741,6 @@ fn parse_failure_status(&self, line: &str) -> Option { } } - fn parse_compile_pass(&self, line: &str) -> bool { - self.parse_name_directive(line, "compile-pass") - } - fn parse_disable_ui_testing_normalization(&self, line: &str) -> bool { self.parse_name_directive(line, "disable-ui-testing-normalization") } @@ -722,12 +749,8 @@ fn parse_check_test_line_numbers_match(&self, line: &str) -> bool { self.parse_name_directive(line, "check-test-line-numbers-match") } - fn parse_run_pass(&self, line: &str) -> bool { - self.parse_name_directive(line, "run-pass") - } - - fn parse_skip_codegen(&self, line: &str) -> bool { - self.parse_name_directive(line, "skip-codegen") + fn parse_ignore_pass(&self, line: &str) -> bool { + self.parse_name_directive(line, "ignore-pass") } fn parse_assembly_output(&self, line: &str) -> Option {