Add support for cpass incremental revisions

This commit is contained in:
Zalathar
2026-04-21 16:56:28 +10:00
parent 0ea8958c02
commit edbb86264d
6 changed files with 30 additions and 22 deletions
@@ -156,11 +156,12 @@ series of steps.
Compiletest starts with an empty directory with the `-C incremental` flag, and Compiletest starts with an empty directory with the `-C incremental` flag, and
then runs the compiler for each revision, reusing the incremental results from previous steps. then runs the compiler for each revision, reusing the incremental results from previous steps.
The revisions should start with: Each revision name must start with one of:
* `bfail` the test should fail to compile * `cpass` - the test must compile successfully (check build, no codegen)
* `bpass` — the test should compile successully * `bfail` — the test must fail to compile (full build, with codegen)
* `rpass` — the test should compile and run successfully * `bpass` — the test must compile successully (full build, with codegen)
* `rpass` — the test must compile and run successfully
To make the revisions unique, you should add a suffix like `rpass1` and `rpass2`. To make the revisions unique, you should add a suffix like `rpass1` and `rpass2`.
+5 -2
View File
@@ -327,12 +327,15 @@ fn should_compile_successfully(&self, pm: Option<PassMode>) -> bool {
TestMode::Incremental => { TestMode::Incremental => {
let revision = let revision =
self.revision.expect("incremental tests require a list of revisions"); self.revision.expect("incremental tests require a list of revisions");
if revision.starts_with("bpass") || revision.starts_with("rpass") { if revision.starts_with("cpass")
|| revision.starts_with("bpass")
|| revision.starts_with("rpass")
{
true true
} else if revision.starts_with("bfail") { } else if revision.starts_with("bfail") {
pm.is_some() pm.is_some()
} else { } else {
panic!("revision name must begin with `bfail`, `bpass`, or `rpass`"); panic!("revision name must begin with `cpass`, `bfail`, `bpass`, or `rpass`");
} }
} }
mode => panic!("unimplemented for mode {:?}", mode), mode => panic!("unimplemented for mode {:?}", mode),
@@ -1,4 +1,4 @@
use super::{FailMode, ProcRes, TestCx, WillExecute}; use super::{Emit, FailMode, PassMode, ProcRes, TestCx, WillExecute};
impl TestCx<'_> { impl TestCx<'_> {
pub(super) fn run_incremental_test(&self) { pub(super) fn run_incremental_test(&self) {
@@ -31,7 +31,9 @@ pub(super) fn run_incremental_test(&self) {
write!(self.stdout, "revision={:?} props={:#?}", revision, self.props); write!(self.stdout, "revision={:?} props={:#?}", revision, self.props);
} }
if revision.starts_with("bpass") { if revision.starts_with("cpass") {
self.run_cpass_test();
} else if revision.starts_with("bpass") {
self.run_bpass_test(); self.run_bpass_test();
} else if revision.starts_with("rpass") { } else if revision.starts_with("rpass") {
self.run_rpass_test(); self.run_rpass_test();
@@ -42,6 +44,12 @@ pub(super) fn run_incremental_test(&self) {
} }
} }
fn run_cpass_test(&self) {
let proc_res = self.compile_test(WillExecute::No, Emit::Metadata);
self.check_if_test_should_compile(None, Some(PassMode::Check), &proc_res);
self.check_compiler_output_for_incr(&proc_res);
}
fn run_bpass_test(&self) { fn run_bpass_test(&self) {
let emit_metadata = self.should_emit_metadata(self.pass_mode()); let emit_metadata = self.should_emit_metadata(self.pass_mode());
let proc_res = self.compile_test(WillExecute::No, emit_metadata); let proc_res = self.compile_test(WillExecute::No, emit_metadata);
+6 -7
View File
@@ -2,8 +2,7 @@
// Emitting these lints is delayed until after ast lowering. // Emitting these lints is delayed until after ast lowering.
// This test tests that the delayed hints are correctly hashed for incremental. // This test tests that the delayed hints are correctly hashed for incremental.
//@ check-pass //@ revisions: cpass1 cpass2 cpass3
//@ revisions: bfail1 bfail2 bfail3
//@ compile-flags: -Z query-dep-graph -O -Zincremental-ignore-spans //@ compile-flags: -Z query-dep-graph -O -Zincremental-ignore-spans
//@ ignore-backends: gcc //@ ignore-backends: gcc
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
@@ -15,13 +14,13 @@
// Between revision 1 and 2, the only thing we change is that we add "test = 2" // Between revision 1 and 2, the only thing we change is that we add "test = 2"
// This will emit an extra delayed lint, but it will not change the HIR hash. // This will emit an extra delayed lint, but it will not change the HIR hash.
// We check that even tho the HIR hash didn't change, the extra lint is emitted // We check that even tho the HIR hash didn't change, the extra lint is emitted
#[cfg_attr(bfail1, doc(hidden))] #[cfg_attr(cpass1, doc(hidden))]
#[cfg_attr(not(bfail1), doc(hidden, test = 2))] #[cfg_attr(not(cpass1), doc(hidden, test = 2))]
//[bfail2,bfail3]~^ WARN `#[doc(test(...)]` takes a list of attributes [invalid_doc_attributes] //[cpass2,cpass3]~^ WARN `#[doc(test(...)]` takes a list of attributes [invalid_doc_attributes]
// The HIR hash should not change between revisions, for this test to be representative // The HIR hash should not change between revisions, for this test to be representative
#[rustc_clean(cfg="bfail2")] #[rustc_clean(cfg="cpass2")]
#[rustc_clean(cfg="bfail3")] #[rustc_clean(cfg="cpass3")]
trait Test {} trait Test {}
fn main() {} fn main() {}
+1 -2
View File
@@ -1,5 +1,4 @@
//@ revisions: bfail1 bfail2 //@ revisions: cpass1 cpass2
//@ check-pass
//@ compile-flags: --crate-type cdylib //@ compile-flags: --crate-type cdylib
//@ needs-crate-type: cdylib //@ needs-crate-type: cdylib
@@ -1,7 +1,5 @@
//@ revisions: bfail1 bfail2 //@ revisions: cpass1 cpass2
//@ compile-flags: -Znext-solver //@ compile-flags: -Znext-solver
//@ check-pass
#![allow(dead_code)] #![allow(dead_code)]
@@ -18,10 +16,10 @@ fn poll() -> Self::Error {
} }
} }
#[cfg(bfail1)] #[cfg(cpass1)]
pub struct Error(()); pub struct Error(());
#[cfg(bfail2)] #[cfg(cpass2)]
pub struct Error(); pub struct Error();
fn main() {} fn main() {}