Files
scriptc/tests/corpus/nullish-long-chain.ts
Chris Tate 3f66c8e20b Make LLVM the sole production backend
- Remove C emission, debugging options, and automatic backend fallback.
- Complete LLVM lowering and native bootstrap coverage across supported targets.
- Link executables and libraries with precompiled C runtime packs, including iOS and Android.
2026-09-29 20:54:09 -05:00

106 lines
5.0 KiB
TypeScript

// Compiler dispatchers often use long left-associated chains. Keep every
// operand observable so compilation must preserve order and short-circuiting.
function dispatch(winner: number): number {
const calls: number[] = [];
function candidate(index: number): number | null | undefined {
calls.push(index);
return index === winner ? 0 : index % 2 === 0 ? null : undefined;
}
const result =
candidate(0) ?? candidate(1) ?? candidate(2) ?? candidate(3) ??
candidate(4) ?? candidate(5) ?? candidate(6) ?? candidate(7) ??
candidate(8) ?? candidate(9) ?? candidate(10) ?? candidate(11) ??
candidate(12) ?? candidate(13) ?? candidate(14) ?? candidate(15) ??
candidate(16) ?? candidate(17) ?? candidate(18) ?? candidate(19) ??
candidate(20) ?? candidate(21) ?? candidate(22) ?? candidate(23) ??
candidate(24) ?? candidate(25) ?? candidate(26) ?? candidate(27) ??
candidate(28) ?? candidate(29) ?? candidate(30) ?? candidate(31) ??
candidate(32) ?? candidate(33) ?? candidate(34) ?? candidate(35) ??
candidate(36) ?? candidate(37) ?? candidate(38) ?? candidate(39) ??
candidate(40) ?? candidate(41) ?? candidate(42) ?? candidate(43) ??
candidate(44) ?? candidate(45) ?? candidate(46) ?? candidate(47) ??
candidate(48) ?? candidate(49) ?? candidate(50) ?? candidate(51) ??
candidate(52) ?? candidate(53) ?? candidate(54) ?? candidate(55) ??
candidate(56) ?? candidate(57) ?? candidate(58) ?? candidate(59) ??
candidate(60) ?? candidate(61) ?? candidate(62) ?? candidate(63) ??
candidate(64) ?? candidate(65) ?? candidate(66) ?? candidate(67) ??
candidate(68) ?? candidate(69) ?? candidate(70) ?? candidate(71) ??
candidate(72) ?? candidate(73) ?? candidate(74) ?? candidate(75) ??
candidate(76) ?? candidate(77) ?? candidate(78) ?? candidate(79) ??
candidate(80) ?? candidate(81) ?? candidate(82) ?? candidate(83) ??
candidate(84) ?? candidate(85) ?? candidate(86) ?? candidate(87) ??
candidate(88) ?? candidate(89) ?? candidate(90) ?? candidate(91) ??
candidate(92) ?? candidate(93) ?? candidate(94) ?? candidate(95) ?? -1;
console.log(winner, result, calls.join(","));
return result;
}
dispatch(0);
dispatch(47);
dispatch(95);
dispatch(96);
let sequence = "";
function text(label: string, value: string | null | undefined): string | null | undefined {
sequence += label;
return value;
}
console.log(text("a", null) ?? (text("b", undefined) ?? text("c", "")) ?? text("d", "unused"));
console.log(sequence);
sequence = "";
console.log((text("a", undefined) ?? text("b", null)) ?? text("c", "end") ?? text("d", "unused"));
console.log(sequence);
// Logical chains also occur in compiler predicates and retain operand values.
function logicalDispatch(winner: number): void {
const calls: number[] = [];
function probe(index: number): number {
calls.push(index);
return index === winner ? index + 1 : 0;
}
const found =
probe(0) || probe(1) || probe(2) || probe(3) ||
probe(4) || probe(5) || probe(6) || probe(7) ||
probe(8) || probe(9) || probe(10) || probe(11) ||
probe(12) || probe(13) || probe(14) || probe(15) ||
probe(16) || probe(17) || probe(18) || probe(19) ||
probe(20) || probe(21) || probe(22) || probe(23) ||
probe(24) || probe(25) || probe(26) || probe(27) ||
probe(28) || probe(29) || probe(30) || probe(31) ||
probe(32) || probe(33) || probe(34) || probe(35) ||
probe(36) || probe(37) || probe(38) || probe(39) ||
probe(40) || probe(41) || probe(42) || probe(43) ||
probe(44) || probe(45) || probe(46) || probe(47) ||
probe(48) || probe(49) || probe(50) || probe(51) ||
probe(52) || probe(53) || probe(54) || probe(55) ||
probe(56) || probe(57) || probe(58) || probe(59) ||
probe(60) || probe(61) || probe(62) || probe(63);
console.log("or", winner, found, calls.join(","));
calls.length = 0;
function accept(index: number): number {
calls.push(index);
return index === winner ? 0 : index + 1;
}
const accepted =
accept(0) && accept(1) && accept(2) && accept(3) &&
accept(4) && accept(5) && accept(6) && accept(7) &&
accept(8) && accept(9) && accept(10) && accept(11) &&
accept(12) && accept(13) && accept(14) && accept(15) &&
accept(16) && accept(17) && accept(18) && accept(19) &&
accept(20) && accept(21) && accept(22) && accept(23) &&
accept(24) && accept(25) && accept(26) && accept(27) &&
accept(28) && accept(29) && accept(30) && accept(31) &&
accept(32) && accept(33) && accept(34) && accept(35) &&
accept(36) && accept(37) && accept(38) && accept(39) &&
accept(40) && accept(41) && accept(42) && accept(43) &&
accept(44) && accept(45) && accept(46) && accept(47) &&
accept(48) && accept(49) && accept(50) && accept(51) &&
accept(52) && accept(53) && accept(54) && accept(55) &&
accept(56) && accept(57) && accept(58) && accept(59) &&
accept(60) && accept(61) && accept(62) && accept(63);
console.log("and", winner, accepted, calls.join(","));
}
logicalDispatch(0);
logicalDispatch(31);
logicalDispatch(63);
logicalDispatch(64);