diff --git a/compiler/rustc_pattern_analysis/src/lib.rs b/compiler/rustc_pattern_analysis/src/lib.rs index 4b0955699fc39..7663116f3a3c8 100644 --- a/compiler/rustc_pattern_analysis/src/lib.rs +++ b/compiler/rustc_pattern_analysis/src/lib.rs @@ -145,6 +145,8 @@ pub trait TypeCx: Sized + fmt::Debug { /// The maximum pattern complexity limit was reached. fn complexity_exceeded(&self) -> Result<(), Self::Error>; + + fn too_complex_match(&self); } /// The arm of a match expression. diff --git a/compiler/rustc_pattern_analysis/src/rustc.rs b/compiler/rustc_pattern_analysis/src/rustc.rs index 5f5bfa7154a74..3b9c6916dfd54 100644 --- a/compiler/rustc_pattern_analysis/src/rustc.rs +++ b/compiler/rustc_pattern_analysis/src/rustc.rs @@ -900,6 +900,10 @@ impl<'p, 'tcx: 'p> TypeCx for RustcMatchCheckCtxt<'p, 'tcx> { let span = self.whole_match_span.unwrap_or(self.scrut_span); Err(self.tcx.dcx().span_err(span, "reached pattern complexity limit")) } + + fn too_complex_match(&self) { + panic!("match too complex!"); + } } /// Recursively expand this pattern into its subpatterns. Only useful for or-patterns. diff --git a/compiler/rustc_pattern_analysis/src/usefulness.rs b/compiler/rustc_pattern_analysis/src/usefulness.rs index 0261768d91616..79e7952b0d3db 100644 --- a/compiler/rustc_pattern_analysis/src/usefulness.rs +++ b/compiler/rustc_pattern_analysis/src/usefulness.rs @@ -747,6 +747,10 @@ impl<'a, Cx: TypeCx> UsefulnessCtxt<'a, Cx> { { return self.tycx.complexity_exceeded(); } + // FIXME: Will be turned into a warning once we have a somewhat useable threeshold. + if self.complexity_level > 10_000_000 { + self.tycx.too_complex_match(); + } Ok(()) } } diff --git a/tests/ui/pattern/complexity_limit.rs b/tests/ui/pattern/complexity_limit.rs deleted file mode 100644 index c9a3f99bccd14..0000000000000 --- a/tests/ui/pattern/complexity_limit.rs +++ /dev/null @@ -1,106 +0,0 @@ -#![feature(rustc_attrs)] -#![pattern_complexity = "10000"] - -#[derive(Default)] -struct BaseCommand { - field01: bool, - field02: bool, - field03: bool, - field04: bool, - field05: bool, - field06: bool, - field07: bool, - field08: bool, - field09: bool, - field10: bool, - field11: bool, - field12: bool, - field13: bool, - field14: bool, - field15: bool, - field16: bool, - field17: bool, - field18: bool, - field19: bool, - field20: bool, - field21: bool, - field22: bool, - field23: bool, - field24: bool, - field25: bool, - field26: bool, - field27: bool, - field28: bool, - field29: bool, - field30: bool, -} - -fn request_key(command: BaseCommand) { - match command { //~ ERROR: reached pattern complexity limit - BaseCommand { field01: true, .. } => {} - BaseCommand { field02: true, .. } => {} - BaseCommand { field03: true, .. } => {} - BaseCommand { field04: true, .. } => {} - BaseCommand { field05: true, .. } => {} - BaseCommand { field06: true, .. } => {} - BaseCommand { field07: true, .. } => {} - BaseCommand { field08: true, .. } => {} - BaseCommand { field09: true, .. } => {} - BaseCommand { field10: true, .. } => {} - BaseCommand { field11: true, .. } => {} - BaseCommand { field12: true, .. } => {} - BaseCommand { field13: true, .. } => {} - BaseCommand { field14: true, .. } => {} - BaseCommand { field15: true, .. } => {} - BaseCommand { field16: true, .. } => {} - BaseCommand { field17: true, .. } => {} - BaseCommand { field18: true, .. } => {} - BaseCommand { field19: true, .. } => {} - BaseCommand { field20: true, .. } => {} - BaseCommand { field21: true, .. } => {} - BaseCommand { field22: true, .. } => {} - BaseCommand { field23: true, .. } => {} - BaseCommand { field24: true, .. } => {} - BaseCommand { field25: true, .. } => {} - BaseCommand { field26: true, .. } => {} - BaseCommand { field27: true, .. } => {} - BaseCommand { field28: true, .. } => {} - BaseCommand { field29: true, .. } => {} - BaseCommand { field30: true, .. } => {} - - BaseCommand { field01: false, .. } => {} - BaseCommand { field02: false, .. } => {} - BaseCommand { field03: false, .. } => {} - BaseCommand { field04: false, .. } => {} - BaseCommand { field05: false, .. } => {} - BaseCommand { field06: false, .. } => {} - BaseCommand { field07: false, .. } => {} - BaseCommand { field08: false, .. } => {} - BaseCommand { field09: false, .. } => {} - BaseCommand { field10: false, .. } => {} - BaseCommand { field11: false, .. } => {} - BaseCommand { field12: false, .. } => {} - BaseCommand { field13: false, .. } => {} - BaseCommand { field14: false, .. } => {} - BaseCommand { field15: false, .. } => {} - BaseCommand { field16: false, .. } => {} - BaseCommand { field17: false, .. } => {} - BaseCommand { field18: false, .. } => {} - BaseCommand { field19: false, .. } => {} - BaseCommand { field20: false, .. } => {} - BaseCommand { field21: false, .. } => {} - BaseCommand { field22: false, .. } => {} - BaseCommand { field23: false, .. } => {} - BaseCommand { field24: false, .. } => {} - BaseCommand { field25: false, .. } => {} - BaseCommand { field26: false, .. } => {} - BaseCommand { field27: false, .. } => {} - BaseCommand { field28: false, .. } => {} - BaseCommand { field29: false, .. } => {} - BaseCommand { field30: false, .. } => {} - } -} - -fn main() { - request_key(BaseCommand::default()); -} diff --git a/tests/ui/pattern/complexity_limit.stderr b/tests/ui/pattern/complexity_limit.stderr deleted file mode 100644 index 08d9d40fe4626..0000000000000 --- a/tests/ui/pattern/complexity_limit.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: reached pattern complexity limit - --> $DIR/complexity_limit.rs:39:5 - | -LL | / match command { -LL | | BaseCommand { field01: true, .. } => {} -LL | | BaseCommand { field02: true, .. } => {} -LL | | BaseCommand { field03: true, .. } => {} -... | -LL | | BaseCommand { field30: false, .. } => {} -LL | | } - | |_____^ - -error: aborting due to 1 previous error -