Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/missing_match_arms.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/missing_match_arms.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/crates/ide-diagnostics/src/handlers/missing_match_arms.rs b/crates/ide-diagnostics/src/handlers/missing_match_arms.rs
index 67daa172b2..045154614f 100644
--- a/crates/ide-diagnostics/src/handlers/missing_match_arms.rs
+++ b/crates/ide-diagnostics/src/handlers/missing_match_arms.rs
@@ -23,6 +23,7 @@ mod tests {
},
DiagnosticsConfig,
};
+ use test_utils::skip_slow_tests;
#[track_caller]
fn check_diagnostics_no_bails(ra_fixture: &str) {
@@ -1004,6 +1005,32 @@ fn f() {
);
}
+ #[test]
+ fn exponential_match() {
+ if skip_slow_tests() {
+ return;
+ }
+ // Constructs a match where match checking takes exponential time. Ensures we bail early.
+ use std::fmt::Write;
+ let struct_arity = 50;
+ let mut code = String::new();
+ write!(code, "struct BigStruct {{").unwrap();
+ for i in 0..struct_arity {
+ write!(code, " field{i}: bool,").unwrap();
+ }
+ write!(code, "}}").unwrap();
+ write!(code, "fn big_match(s: BigStruct) {{").unwrap();
+ write!(code, " match s {{").unwrap();
+ for i in 0..struct_arity {
+ write!(code, " BigStruct {{ field{i}: true, ..}} => {{}},").unwrap();
+ write!(code, " BigStruct {{ field{i}: false, ..}} => {{}},").unwrap();
+ }
+ write!(code, " _ => {{}},").unwrap();
+ write!(code, " }}").unwrap();
+ write!(code, "}}").unwrap();
+ check_diagnostics_no_bails(&code);
+ }
+
mod rust_unstable {
use super::*;