Constraint conflicts N=50

No-emit type-check timing for constraint conflicts n=50.

tsz is 4.9x faster 219 lines 28 KB

Timing

tsz
100.39ms
tsgo
496.22ms

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; }
interface Constraint20 { key20: string; shared: number; }
interface Constraint21 { key21: string; shared: number; }
interface Constraint22 { key22: string; shared: number; }
interface Constraint23 { key23: string; shared: number; }
interface Constraint24 { key24: string; shared: number; }
interface Constraint25 { key25: string; shared: number; }
interface Constraint26 { key26: string; shared: number; }
interface Constraint27 { key27: string; shared: number; }
interface Constraint28 { key28: string; shared: number; }
interface Constraint29 { key29: string; shared: number; }
interface Constraint30 { key30: string; shared: number; }
interface Constraint31 { key31: string; shared: number; }
interface Constraint32 { key32: string; shared: number; }
interface Constraint33 { key33: string; shared: number; }
interface Constraint34 { key34: string; shared: number; }
interface Constraint35 { key35: string; shared: number; }
interface Constraint36 { key36: string; shared: number; }
interface Constraint37 { key37: string; shared: number; }
interface Constraint38 { key38: string; shared: number; }
interface Constraint39 { key39: string; shared: number; }
interface Constraint40 { key40: string; shared: number; }
interface Constraint41 { key41: string; shared: number; }
interface Constraint42 { key42: string; shared: number; }
interface Constraint43 { key43: string; shared: number; }
interface Constraint44 { key44: string; shared: number; }
interface Constraint45 { key45: string; shared: number; }
interface Constraint46 { key46: string; shared: number; }
interface Constraint47 { key47: string; shared: number; }
interface Constraint48 { key48: string; shared: number; }
interface Constraint49 { key49: string; shared: number; }

// Function with type parameter accumulating bounds from 50 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;
declare function constrain20<T extends Constraint20>(x: T): T;
declare function constrain21<T extends Constraint21>(x: T): T;
declare function constrain22<T extends Constraint22>(x: T): T;
declare function constrain23<T extends Constraint23>(x: T): T;
declare function constrain24<T extends Constraint24>(x: T): T;
declare function constrain25<T extends Constraint25>(x: T): T;
declare function constrain26<T extends Constraint26>(x: T): T;
declare function constrain27<T extends Constraint27>(x: T): T;
declare function constrain28<T extends Constraint28>(x: T): T;
declare function constrain29<T extends Constraint29>(x: T): T;
declare function constrain30<T extends Constraint30>(x: T): T;
declare function constrain31<T extends Constraint31>(x: T): T;
declare function constrain32<T extends Constraint32>(x: T): T;
declare function constrain33<T extends Constraint33>(x: T): T;
declare function constrain34<T extends Constraint34>(x: T): T;
declare function constrain35<T extends Constraint35>(x: T): T;
declare function constrain36<T extends Constraint36>(x: T): T;
declare function constrain37<T extends Constraint37>(x: T): T;
declare function constrain38<T extends Constraint38>(x: T): T;
declare function constrain39<T extends Constraint39>(x: T): T;
declare function constrain40<T extends Constraint40>(x: T): T;
declare function constrain41<T extends Constraint41>(x: T): T;
declare function constrain42<T extends Constraint42>(x: T): T;
declare function constrain43<T extends Constraint43>(x: T): T;
declare function constrain44<T extends Constraint44>(x: T): T;
declare function constrain45<T extends Constraint45>(x: T): T;
declare function constrain46<T extends Constraint46>(x: T): T;
declare function constrain47<T extends Constraint47>(x: T): T;
declare function constrain48<T extends Constraint48>(x: T): T;
declare function constrain49<T extends Constraint49>(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' };
const obj20 = { shared: 20, 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', key20: 'val' };
const obj21 = { shared: 21, 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', key20: 'val', key21: 'val' };
const obj22 = { shared: 22, 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', key20: 'val', key21: 'val', key22: 'val' };
const obj23 = { shared: 23, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val' };
const obj24 = { shared: 24, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val' };
const obj25 = { shared: 25, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val' };
const obj26 = { shared: 26, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val' };
const obj27 = { shared: 27, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val' };
const obj28 = { shared: 28, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val' };
const obj29 = { shared: 29, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val' };
const obj30 = { shared: 30, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val' };
const obj31 = { shared: 31, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val' };
const obj32 = { shared: 32, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val' };
const obj33 = { shared: 33, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val' };
const obj34 = { shared: 34, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val' };
const obj35 = { shared: 35, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val' };
const obj36 = { shared: 36, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val' };
const obj37 = { shared: 37, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val' };
const obj38 = { shared: 38, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val' };
const obj39 = { shared: 39, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val' };
const obj40 = { shared: 40, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val' };
const obj41 = { shared: 41, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val' };
const obj42 = { shared: 42, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val' };
const obj43 = { shared: 43, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val' };
const obj44 = { shared: 44, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val', key44: 'val' };
const obj45 = { shared: 45, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val', key44: 'val', key45: 'val' };
const obj46 = { shared: 46, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val', key44: 'val', key45: 'val', key46: 'val' };
const obj47 = { shared: 47, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val', key44: 'val', key45: 'val', key46: 'val', key47: 'val' };
const obj48 = { shared: 48, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val', key44: 'val', key45: 'val', key46: 'val', key47: 'val', key48: 'val' };
const obj49 = { shared: 49, 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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val', key44: 'val', key45: 'val', key46: 'val', key47: 'val', key48: 'val', key49: 'val' };

// Each call adds lower bounds (arg type) and upper bounds (extends Constraint50)
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);
const res20 = constrain20(obj20);
const res21 = constrain21(obj21);
const res22 = constrain22(obj22);
const res23 = constrain23(obj23);
const res24 = constrain24(obj24);
const res25 = constrain25(obj25);
const res26 = constrain26(obj26);
const res27 = constrain27(obj27);
const res28 = constrain28(obj28);
const res29 = constrain29(obj29);
const res30 = constrain30(obj30);
const res31 = constrain31(obj31);
const res32 = constrain32(obj32);
const res33 = constrain33(obj33);
const res34 = constrain34(obj34);
const res35 = constrain35(obj35);
const res36 = constrain36(obj36);
const res37 = constrain37(obj37);
const res38 = constrain38(obj38);
const res39 = constrain39(obj39);
const res40 = constrain40(obj40);
const res41 = constrain41(obj41);
const res42 = constrain42(obj42);
const res43 = constrain43(obj43);
const res44 = constrain44(obj44);
const res45 = constrain45(obj45);
const res46 = constrain46(obj46);
const res47 = constrain47(obj47);
const res48 = constrain48(obj48);
const res49 = constrain49(obj49);

// Single type param T accumulating 50 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 & Constraint20 & Constraint21 & Constraint22 & Constraint23 & Constraint24 & Constraint25 & Constraint26 & Constraint27 & Constraint28 & Constraint29 & Constraint30 & Constraint31 & Constraint32 & Constraint33 & Constraint34 & Constraint35 & Constraint36 & Constraint37 & Constraint38 & Constraint39 & Constraint40 & Constraint41 & Constraint42 & Constraint43 & Constraint44 & Constraint45 & Constraint46 & Constraint47 & Constraint48 & Constraint49>(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', key20: 'val', key21: 'val', key22: 'val', key23: 'val', key24: 'val', key25: 'val', key26: 'val', key27: 'val', key28: 'val', key29: 'val', key30: 'val', key31: 'val', key32: 'val', key33: 'val', key34: 'val', key35: 'val', key36: 'val', key37: 'val', key38: 'val', key39: 'val', key40: 'val', key41: 'val', key42: 'val', key43: 'val', key44: 'val', key45: 'val', key46: 'val', key47: 'val', key48: 'val', key49: 'val' };
const _result = multiConstrained(allConstraints);