Constraint conflicts N=20
No-emit type-check timing for constraint conflicts n=20.
tsz is 6.7x faster 99 lines 7 KB
Timing
Files
// Constraint Conflict Detection O(N²) stress test
// Targets: infer.rs detect_conflicts() — N² upper bound pairs + M×N lower×upper
//
// When a generic type parameter is used in many positions, the solver collects
// lower bounds (argument types) and upper bounds (extends constraints, parameter
// positions). Conflict detection checks all pairs for compatibility.
interface Constraint0 { key0: string; shared: number; }
interface Constraint1 { key1: string; shared: number; }
interface Constraint2 { key2: string; shared: number; }
interface Constraint3 { key3: string; shared: number; }
interface Constraint4 { key4: string; shared: number; }
interface Constraint5 { key5: string; shared: number; }
interface Constraint6 { key6: string; shared: number; }
interface Constraint7 { key7: string; shared: number; }
interface Constraint8 { key8: string; shared: number; }
interface Constraint9 { key9: string; shared: number; }
interface Constraint10 { key10: string; shared: number; }
interface Constraint11 { key11: string; shared: number; }
interface Constraint12 { key12: string; shared: number; }
interface Constraint13 { key13: string; shared: number; }
interface Constraint14 { key14: string; shared: number; }
interface Constraint15 { key15: string; shared: number; }
interface Constraint16 { key16: string; shared: number; }
interface Constraint17 { key17: string; shared: number; }
interface Constraint18 { key18: string; shared: number; }
interface Constraint19 { key19: string; shared: number; }
// Function with type parameter accumulating bounds from 20 call sites
declare function constrain0<T extends Constraint0>(x: T): T;
declare function constrain1<T extends Constraint1>(x: T): T;
declare function constrain2<T extends Constraint2>(x: T): T;
declare function constrain3<T extends Constraint3>(x: T): T;
declare function constrain4<T extends Constraint4>(x: T): T;
declare function constrain5<T extends Constraint5>(x: T): T;
declare function constrain6<T extends Constraint6>(x: T): T;
declare function constrain7<T extends Constraint7>(x: T): T;
declare function constrain8<T extends Constraint8>(x: T): T;
declare function constrain9<T extends Constraint9>(x: T): T;
declare function constrain10<T extends Constraint10>(x: T): T;
declare function constrain11<T extends Constraint11>(x: T): T;
declare function constrain12<T extends Constraint12>(x: T): T;
declare function constrain13<T extends Constraint13>(x: T): T;
declare function constrain14<T extends Constraint14>(x: T): T;
declare function constrain15<T extends Constraint15>(x: T): T;
declare function constrain16<T extends Constraint16>(x: T): T;
declare function constrain17<T extends Constraint17>(x: T): T;
declare function constrain18<T extends Constraint18>(x: T): T;
declare function constrain19<T extends Constraint19>(x: T): T;
// Objects that satisfy multiple constraints
const obj0 = { shared: 0, key0: 'val' };
const obj1 = { shared: 1, key0: 'val', key1: 'val' };
const obj2 = { shared: 2, key0: 'val', key1: 'val', key2: 'val' };
const obj3 = { shared: 3, key0: 'val', key1: 'val', key2: 'val', key3: 'val' };
const obj4 = { shared: 4, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val' };
const obj5 = { shared: 5, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val' };
const obj6 = { shared: 6, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val' };
const obj7 = { shared: 7, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val' };
const obj8 = { shared: 8, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val' };
const obj9 = { shared: 9, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val' };
const obj10 = { shared: 10, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val' };
const obj11 = { shared: 11, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val' };
const obj12 = { shared: 12, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val' };
const obj13 = { shared: 13, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val' };
const obj14 = { shared: 14, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val', key14: 'val' };
const obj15 = { shared: 15, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val', key14: 'val', key15: 'val' };
const obj16 = { shared: 16, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val', key14: 'val', key15: 'val', key16: 'val' };
const obj17 = { shared: 17, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val', key14: 'val', key15: 'val', key16: 'val', key17: 'val' };
const obj18 = { shared: 18, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val', key14: 'val', key15: 'val', key16: 'val', key17: 'val', key18: 'val' };
const obj19 = { shared: 19, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val', key14: 'val', key15: 'val', key16: 'val', key17: 'val', key18: 'val', key19: 'val' };
// Each call adds lower bounds (arg type) and upper bounds (extends Constraint20)
const res0 = constrain0(obj0);
const res1 = constrain1(obj1);
const res2 = constrain2(obj2);
const res3 = constrain3(obj3);
const res4 = constrain4(obj4);
const res5 = constrain5(obj5);
const res6 = constrain6(obj6);
const res7 = constrain7(obj7);
const res8 = constrain8(obj8);
const res9 = constrain9(obj9);
const res10 = constrain10(obj10);
const res11 = constrain11(obj11);
const res12 = constrain12(obj12);
const res13 = constrain13(obj13);
const res14 = constrain14(obj14);
const res15 = constrain15(obj15);
const res16 = constrain16(obj16);
const res17 = constrain17(obj17);
const res18 = constrain18(obj18);
const res19 = constrain19(obj19);
// Single type param T accumulating 20 bounds
function multiConstrained<T extends Constraint0 & Constraint1 & Constraint2 & Constraint3 & Constraint4 & Constraint5 & Constraint6 & Constraint7 & Constraint8 & Constraint9 & Constraint10 & Constraint11 & Constraint12 & Constraint13 & Constraint14 & Constraint15 & Constraint16 & Constraint17 & Constraint18 & Constraint19>(x: T): T { return x; }
const allConstraints = { shared: 0, key0: 'val', key1: 'val', key2: 'val', key3: 'val', key4: 'val', key5: 'val', key6: 'val', key7: 'val', key8: 'val', key9: 'val', key10: 'val', key11: 'val', key12: 'val', key13: 'val', key14: 'val', key15: 'val', key16: 'val', key17: 'val', key18: 'val', key19: 'val' };
const _result = multiConstrained(allConstraints);