diff --git a/tslang/lib/TypeScript/MLIRGenCast.cpp b/tslang/lib/TypeScript/MLIRGenCast.cpp index b979d6b57..aaa89b924 100644 --- a/tslang/lib/TypeScript/MLIRGenCast.cpp +++ b/tslang/lib/TypeScript/MLIRGenCast.cpp @@ -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(type) || mlir::isa(type)) + { + ss << "\nreturn true;\n"; + } + else + { + ss << "\nthrow \"Can't cast from any type\";\n"; + } + ss << S("}\n"); auto src = ss.str(); diff --git a/tslang/test/tester/CMakeLists.txt b/tslang/test/tester/CMakeLists.txt index 5acd826e3..29e793cdc 100644 --- a/tslang/test/tester/CMakeLists.txt +++ b/tslang/test/tester/CMakeLists.txt @@ -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") @@ -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") @@ -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 diff --git a/tslang/test/tester/tests/00any_truthiness_objects.ts b/tslang/test/tester/tests/00any_truthiness_objects.ts new file mode 100644 index 000000000..0e1a61fef --- /dev/null +++ b/tslang/test/tester/tests/00any_truthiness_objects.ts @@ -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."); +}