Skip to content

Commit d2244a9

Browse files
committed
insert a test that we detect huge terms
1 parent 2765db9 commit d2244a9

File tree

9 files changed

+56
-6
lines changed

9 files changed

+56
-6
lines changed

crates/formality-prove/src/program.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ pub struct Program {
1414
}
1515

1616
impl Program {
17+
/// Max size used in unit tests that are not stress testing maximum size.
18+
pub const DEFAULT_MAX_SIZE: usize = 222;
19+
1720
pub fn impl_decls<'s>(&'s self, trait_id: &'s TraitId) -> impl Iterator<Item = &'s ImplDecl> {
1821
self.impl_decls
1922
.iter()

crates/formality-prove/src/prove.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ use formality_types::{
1313
cast::Upcast,
1414
collections::Set,
1515
grammar::{Binder, Wcs},
16+
set,
1617
visit::Visit,
1718
};
19+
use tracing::Level;
1820

1921
use crate::program::Program;
2022

@@ -30,7 +32,19 @@ pub fn prove(
3032
let assumptions: Wcs = assumptions.upcast();
3133
let goal: Wcs = goal.upcast();
3234

33-
let fv_in = (&assumptions, &goal).free_variables();
35+
let span = tracing::span!(Level::DEBUG, "prove", ?goal, ?assumptions);
36+
let _guard = span.enter();
37+
38+
let term_in = (&assumptions, &goal);
39+
let fv_in = term_in.free_variables();
40+
if term_in.size() > program.max_size {
41+
tracing::debug!(
42+
"term has size {} which exceeds max size of {}",
43+
term_in.size(),
44+
program.max_size
45+
);
46+
return set![Binder::dummy(Constraints::default().ambiguous())];
47+
}
3448

3549
let cs = prove_wc_list(program, assumptions, goal);
3650

@@ -39,5 +53,7 @@ pub fn prove(
3953
.iter()
4054
.for_each(|fv| assert!(fv_in.contains(&fv)));
4155

56+
tracing::debug!(?cs);
57+
4258
cs
4359
}

crates/formality-prove/src/test.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::{
1111

1212
mod eq_partial_eq;
1313
mod exists_constraints;
14+
mod expanding;
1415
mod occurs_check;
1516
mod simple_impl;
1617
mod universes;

crates/formality-prove/src/test/eq_partial_eq.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{program::Program, prove::prove};
1010
/// Simple example program consisting only of two trait declarations.
1111
fn program() -> Program {
1212
Program {
13-
max_size: 22,
13+
max_size: Program::DEFAULT_MAX_SIZE,
1414
trait_decls: vec![
1515
term("trait Eq<ty Self> where {is_implemented(PartialEq(Self))}"),
1616
term("trait PartialEq<ty Self> where {}"),

crates/formality-prove/src/test/exists_constraints.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use super::test_prove;
99
/// Simple example program consisting only of two trait declarations.
1010
fn program() -> Program {
1111
Program {
12-
max_size: 22,
12+
max_size: Program::DEFAULT_MAX_SIZE,
1313
trait_decls: vec![term("trait Foo<ty Self> where {}")],
1414
impl_decls: vec![term("impl<ty T> Foo(Vec<T>) where {}")],
1515
alias_eq_decls: vec![],
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use expect_test::expect;
2+
use formality_macros::test;
3+
use formality_types::parse::term;
4+
5+
use crate::program::Program;
6+
7+
/// Simple example program consisting only of two trait declarations.
8+
fn program() -> Program {
9+
Program {
10+
max_size: 10,
11+
trait_decls: vec![term("trait Debug<ty Self> where {}")],
12+
impl_decls: vec![term(
13+
"impl<ty T> Debug(Vec<T>) where {is_implemented(Debug(T))}",
14+
)],
15+
alias_eq_decls: vec![],
16+
alias_bound_decls: vec![],
17+
}
18+
}
19+
20+
/// There is no U that is equal to all T.
21+
#[test]
22+
fn expanding() {
23+
let constraints = super::test_prove(program(), term("<ty T> ({}, {is_implemented(Debug(T))})"));
24+
expect![[r#"
25+
{
26+
<> Constraints { known_true: false, substitution: Substitution { map: {} } },
27+
}
28+
"#]]
29+
.assert_debug_eq(&constraints);
30+
}

crates/formality-prove/src/test/occurs_check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use super::test_prove;
99
/// Simple example program consisting only of two trait declarations.
1010
fn program() -> Program {
1111
Program {
12-
max_size: 22,
12+
max_size: Program::DEFAULT_MAX_SIZE,
1313
trait_decls: vec![term("trait Foo<ty Self> where {}")],
1414
impl_decls: vec![term("impl<ty T> Foo(Vec<T>) where {}")],
1515
alias_eq_decls: vec![],

crates/formality-prove/src/test/simple_impl.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{program::Program, prove::prove};
1010
/// Simple example program consisting only of two trait declarations.
1111
fn program() -> Program {
1212
Program {
13-
max_size: 22,
13+
max_size: Program::DEFAULT_MAX_SIZE,
1414
trait_decls: vec![term("trait Debug<ty Self> where {}")],
1515
impl_decls: vec![
1616
term("impl<ty T> Debug(Vec<T>) where {is_implemented(Debug(T))}"),

crates/formality-prove/src/test/universes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::program::Program;
77
/// Simple example program consisting only of two trait declarations.
88
fn program() -> Program {
99
Program {
10-
max_size: 22,
10+
max_size: Program::DEFAULT_MAX_SIZE,
1111
trait_decls: vec![],
1212
impl_decls: vec![],
1313
alias_eq_decls: vec![],

0 commit comments

Comments
 (0)