Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion tslang/lib/TypeScript/MLIRGenCast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2161,7 +2161,18 @@ namespace mlirgen
}
}

ss << "\nthrow \"Can't cast from any type\";\n";
// Every falsy value - 0, NaN, "", false, null, undefined, 0n - is a primitive answered above.
// What is left - a class instance, an object, an array, a function - is truthy, as in
// JavaScript: `if (a)` of an `any` holding one threw instead.
if (mlir::isa<mlir_ts::BooleanType>(type) || mlir::isa<mlir_ts::TypePredicateType>(type))
{
ss << "\nreturn true;\n";
}
else
{
ss << "\nthrow \"Can't cast from any type\";\n";
}

ss << S("}\n");

auto src = ss.str();
Expand Down
3 changes: 3 additions & 0 deletions tslang/test/tester/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -631,6 +631,7 @@ tslang_add_test(NAME test-compile-00-interface-instanceof COMMAND test-runner "$
tslang_add_test(NAME test-compile-01-any COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/01any.ts")
tslang_add_test(NAME test-compile-00-any-types COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_types.ts")
tslang_add_test(NAME test-compile-00-any-compare COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_compare.ts")
tslang_add_test(NAME test-compile-00-any-truthiness-objects COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_truthiness_objects.ts")
tslang_add_test(NAME test-compile-00-any-generic-equals COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_generic_equals.ts")
tslang_add_test(NAME test-compile-00-generator COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00generator.ts")
tslang_add_test(NAME test-compile-00-generator-2 COMMAND test-runner "${PROJECT_SOURCE_DIR}/test/tester/tests/00generator2.ts")
Expand Down Expand Up @@ -1183,6 +1184,7 @@ tslang_add_test(NAME test-jit-00-interface-instanceof COMMAND test-runner -jit "
tslang_add_test(NAME test-jit-01-any COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/01any.ts")
tslang_add_test(NAME test-jit-00-any-types COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_types.ts")
tslang_add_test(NAME test-jit-00-any-compare COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_compare.ts")
tslang_add_test(NAME test-jit-00-any-truthiness-objects COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_truthiness_objects.ts")
tslang_add_test(NAME test-jit-00-any-generic-equals COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00any_generic_equals.ts")
tslang_add_test(NAME test-jit-00-generator COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00generator.ts")
tslang_add_test(NAME test-jit-00-generator-2 COMMAND test-runner -jit "${PROJECT_SOURCE_DIR}/test/tester/tests/00generator2.ts")
Expand Down Expand Up @@ -1785,6 +1787,7 @@ tslang_add_test(NAME test-jit-none-strings COMMAND test-runner -jit -mm=none "${

# every single-file test the default model runs, in either tier
set(TSLANG_CORPUS
00any_truthiness_objects.ts
00add_promotes_both_operands.ts
00conditional_owned_result.ts
00const_array_nested_elements.ts
Expand Down
30 changes: 30 additions & 0 deletions tslang/test/tester/tests/00any_truthiness_objects.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// The truthiness of an `any` holding an object - a class instance, an object literal, an array -
// is true, as in JavaScript. It threw "Can't cast from any type".
class P {
x = 1;
}

function main() {
const c: any = new P();
assert(c ? true : false, "class instance");
assert(!!c, "!! of a class instance");

const o: any = { x: 1 };
let seen = false;
if (o) {
seen = true;
}
assert(seen, "object literal");

const a: any = [1, 2];
assert(a ? true : false, "array");

const z: any = 0;
assert(!z, "0 is still falsy");
const e: any = "";
assert(!e, "empty string is still falsy");
const n: any = null;
assert(!n, "null is still falsy");

print("done.");
}
Loading