From 8e8fba1b3bb96bb64f104d85618cab4fe7dc0740 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Wed, 12 Jun 2019 17:56:51 +0300 Subject: [PATCH] compiletest: Validate pass modes harder --- ...ssue-59523-on-implemented-is-not-unused.rs | 2 +- ...layout-scalar-valid-range-is-not-unused.rs | 2 +- .../termination-trait-for-box-dyn-error.rs | 2 +- ...mination-trait-for-result-box-error_err.rs | 2 +- .../ui/consts/const-eval/const_transmute.rs | 1 - src/test/ui/consts/const-eval/enum_discr.rs | 1 - src/test/ui/expanded-cfg.rs | 4 +- src/test/ui/issues/issue-22603.rs | 4 +- src/test/ui/issues/issue-37515.rs | 8 ++-- .../one-use-in-fn-return.rs | 14 +++---- src/tools/compiletest/src/header.rs | 41 +++++++++++++++---- 11 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/test/incremental/issue-59523-on-implemented-is-not-unused.rs b/src/test/incremental/issue-59523-on-implemented-is-not-unused.rs index 3d16a1543f4..afc08621340 100644 --- a/src/test/incremental/issue-59523-on-implemented-is-not-unused.rs +++ b/src/test/incremental/issue-59523-on-implemented-is-not-unused.rs @@ -2,7 +2,7 @@ // rustc_on_unimplemented, but with this bug we are seeing it fire (on // subsequent runs) if incremental compilation is enabled. -// revisions: rpass1 rpass2 +// revisions: cfail1 cfail2 // compile-pass #![feature(on_unimplemented)] diff --git a/src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs b/src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs index e4802cba9b6..37bd8d0641f 100644 --- a/src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs +++ b/src/test/incremental/issue-59524-layout-scalar-valid-range-is-not-unused.rs @@ -3,7 +3,7 @@ // seeing it fire (on subsequent runs) if incremental compilation is // enabled. -// revisions: rpass1 rpass2 +// revisions: cfail1 cfail2 // compile-pass #![feature(rustc_attrs)] diff --git a/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-box-dyn-error.rs b/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-box-dyn-error.rs index 5f76caabc79..796729ac4cc 100644 --- a/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-box-dyn-error.rs +++ b/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-box-dyn-error.rs @@ -1,4 +1,4 @@ -// compile-pass +// error-pattern:returned Box from main() // failure-status: 1 use std::error::Error; diff --git a/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-result-box-error_err.rs b/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-result-box-error_err.rs index bd47a9768f9..2f3a73a30ad 100644 --- a/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-result-box-error_err.rs +++ b/src/test/run-fail/rfc-1937-termination-trait/termination-trait-for-result-box-error_err.rs @@ -1,4 +1,4 @@ -// compile-pass +// error-pattern:returned Box from main() // failure-status: 1 use std::io::{Error, ErrorKind}; diff --git a/src/test/ui/consts/const-eval/const_transmute.rs b/src/test/ui/consts/const-eval/const_transmute.rs index 4726f9dde3a..0e0e003dcf4 100644 --- a/src/test/ui/consts/const-eval/const_transmute.rs +++ b/src/test/ui/consts/const-eval/const_transmute.rs @@ -1,4 +1,3 @@ -// compile-pass // run-pass #![feature(const_fn_union)] diff --git a/src/test/ui/consts/const-eval/enum_discr.rs b/src/test/ui/consts/const-eval/enum_discr.rs index 4851e752094..e09258f1120 100644 --- a/src/test/ui/consts/const-eval/enum_discr.rs +++ b/src/test/ui/consts/const-eval/enum_discr.rs @@ -1,4 +1,3 @@ -// compile-pass // run-pass enum Foo { diff --git a/src/test/ui/expanded-cfg.rs b/src/test/ui/expanded-cfg.rs index c98fd7ffea8..baa161af76a 100644 --- a/src/test/ui/expanded-cfg.rs +++ b/src/test/ui/expanded-cfg.rs @@ -1,5 +1,4 @@ -// skip-codegen -// compile-pass +// check-pass macro_rules! mac { {} => { @@ -19,5 +18,4 @@ macro_rules! mac { mac! {} - fn main() {} diff --git a/src/test/ui/issues/issue-22603.rs b/src/test/ui/issues/issue-22603.rs index e298316f3b9..717f15b76ac 100644 --- a/src/test/ui/issues/issue-22603.rs +++ b/src/test/ui/issues/issue-22603.rs @@ -1,5 +1,5 @@ -// skip-codegen -// compile-pass +// check-pass + #![feature(unboxed_closures, fn_traits)] struct Foo; diff --git a/src/test/ui/issues/issue-37515.rs b/src/test/ui/issues/issue-37515.rs index cc07bd1d915..caff507c918 100644 --- a/src/test/ui/issues/issue-37515.rs +++ b/src/test/ui/issues/issue-37515.rs @@ -1,10 +1,8 @@ -// skip-codegen -// compile-pass +// check-pass + #![warn(unused)] type Z = dyn for<'x> Send; //~^ WARN type alias is never used - -fn main() { -} +fn main() {} diff --git a/src/test/ui/single-use-lifetime/one-use-in-fn-return.rs b/src/test/ui/single-use-lifetime/one-use-in-fn-return.rs index 876a0a564da..92b25cbf584 100644 --- a/src/test/ui/single-use-lifetime/one-use-in-fn-return.rs +++ b/src/test/ui/single-use-lifetime/one-use-in-fn-return.rs @@ -1,20 +1,16 @@ -// compile-pass - -#![deny(single_use_lifetimes)] -#![allow(dead_code)] -#![allow(unused_variables)] - // Test that we DO NOT warn when lifetime name is used only // once in a fn return type -- using `'_` is not legal there, // as it must refer back to an argument. // // (Normally, using `'static` would be preferred, but there are // times when that is not what you want.) -// -// run-pass + +// compile-pass + +#![deny(single_use_lifetimes)] fn b<'a>() -> &'a u32 { // OK: used only in return type &22 } -fn main() { } +fn main() {} diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index 8be15bb1576..1f52421ecbc 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -526,14 +526,41 @@ impl TestProps { self.check_test_line_numbers_match = config.parse_check_test_line_numbers_match(ln); } - if config.parse_name_directive(ln, "check-pass") || - config.parse_name_directive(ln, "skip-codegen") { - self.pass_mode = Some(PassMode::Check); - } else if config.parse_name_directive(ln, "build-pass") || - config.parse_name_directive(ln, "compile-pass") { - self.pass_mode = Some(PassMode::Build); + 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 && + !cfg.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, "skip-codegen") { + check_no_run("skip-codegen"); + 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, "compile-pass") { + check_no_run("compile-pass"); + Some(PassMode::Build) } else if config.parse_name_directive(ln, "run-pass") { - self.pass_mode = Some(PassMode::Run); + 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(pm)) if pm == PassMode::Check => self.pass_mode = pass_mode, + (Some(_), Some(_)) => panic!("multiple `*-pass` headers in a single test"), + (_, None) => {} } if !self.disable_ui_testing_normalization {