jank
jank copied to clipboard
Crash due to non-value C++ constructs in value positions
jank health check
─ system ───────────────────────────────────────────────────────────────────────────────────────────
─ ✅ operating system: macos
─ ✅ default triple: arm64-apple-darwin24.6.0
─ jank install ─────────────────────────────────────────────────────────────────────────────────────
─ ✅ jank version: jank-0.1-a14789789a3888abff3b857f3a0722f40e702776
─ ⚠️ jank assertions are enabled; performance will be impacted
─ ✅ jank resource dir: ../lib/jank/0.1
─ ✅ jank resolved resource dir: /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/../lib/jank/0.1 (ignored for dev build)
─ ✅ jank user cache dir: /Users/shantanusardesai/.cache/jank/arm64-apple-darwin24.6.0-15fcd9ad08ee18ffd099c802f5e0a2fbcf49ee29c56f7e3f1a4bd483fd30561d (not found)
─ clang install ────────────────────────────────────────────────────────────────────────────────────
─ ✅ configured clang path: /opt/homebrew/opt/llvm/bin/clang++ (found)
─ ✅ configured clang resource dir: /opt/homebrew/Cellar/llvm/HEAD-17efa57/lib/clang/22 (found)
─ jank runtime ─────────────────────────────────────────────────────────────────────────────────────
─ ✅ jank runtime initialized
─ ✅ jank pch path: /Users/shantanusardesai/.cache/jank/arm64-apple-darwin24.6.0-15fcd9ad08ee18ffd099c802f5e0a2fbcf49ee29c56f7e3f1a4bd483fd30561d (found)
─ ✅ jank can jit compile c++
─ ✅ jank can jit compile llvm ir
ld: warning: ignoring duplicate libraries: '-lc++'
ld: warning: search path '/Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/../lib/jank/0.1/lib' not found
ld: warning: search path '/lib' not found
ld: warning: reexported library with install name '/opt/homebrew/opt/llvm/lib/unwind/libunwind.1.dylib' found at '/opt/homebrew/Cellar/llvm/HEAD-17efa57/lib/unwind/libunwind.1.0.dylib' couldn't be matched with any parent library and will be linked directly
─ ✅ jank can aot compile working binaries
Description of the issue with reproduction steps
The following usage of C++ function, operator or field accessor causes jank to crash.
user=> cpp/.foo ;; BOOM!
user=> cpp/.-foo ;; BOOM!
user=> cpp/+ ;; BOOM!
user => (+ cpp/+) ;; BOOM!
Stack trace
* thread #1, queue = 'com.apple.main-thread', stop reason = hit program assert
frame #4: 0x00000001002f2c30 jank`clang::QualType::getCommonPtr(this=0x000000016fdfc1f0) const at TypeBase.h:953:5
950 }
951
952 const ExtQualsTypeCommonBase *getCommonPtr() const {
-> 953 assert(!isNull() && "Cannot retrieve a NULL type pointer");
954 auto CommonPtrVal = reinterpret_cast<uintptr_t>(Value.getOpaqueValue());
955 CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1);
956 return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal);
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = hit program assert
frame #0: 0x000000019ba3a388 libsystem_kernel.dylib`__pthread_kill + 8
frame #1: 0x000000019ba7388c libsystem_pthread.dylib`pthread_kill + 296
frame #2: 0x000000019b97ca3c libsystem_c.dylib`abort + 124
frame #3: 0x000000019b97bc70 libsystem_c.dylib`__assert_rtn + 284
* frame #4: 0x00000001002f2c30 jank`clang::QualType::getCommonPtr(this=0x000000016fdfc1f0) const at TypeBase.h:953:5
frame #5: 0x00000001002e4d4c jank`clang::QualType::getTypePtr(this=0x000000016fdfc1f0) const at TypeBase.h:8295:10
frame #6: 0x00000001002cd4ac jank`clang::QualType::operator->(this=0x000000016fdfc1f0) const at TypeBase.h:997:12
frame #7: 0x00000001002dbc3c jank`Cpp::IsReferenceType(type=0x0000000000000000) at CppInterOp.cpp:2053:12
frame #8: 0x00000001002dbc9c jank`Cpp::GetNonReferenceType(type=0x0000000000000000) at CppInterOp.cpp:2057:10
frame #9: 0x0000000100e0f140 jank`jank::analyze::cpp_util::is_untyped_object(type=(data = 0x0000000000000000)) at cpp_util.cpp:333:29
frame #10: 0x0000000100e0f38c jank`jank::analyze::cpp_util::is_any_object(type=(data = 0x0000000000000000)) at cpp_util.cpp:357:12
frame #11: 0x0000000100e12f5c jank`jank::analyze::cpp_util::ensure_convertible(expr=jank::analyze::expression_ref @ 0x000000016fdfc358) at cpp_util.cpp:717:9
frame #12: 0x0000000100e34e44 jank`jank::evaluate::eval(expr=jank::analyze::expr::cpp_value_ref @ 0x000000016fdfc420) at evaluate.cpp:730:5
frame #13: 0x0000000100e69918 jank`_ZZN4jank8evaluate4evalEN3jtl3refINS_7analyze10expressionEEEENK3$_0clINS2_INS3_4expr9cpp_valueEEEEEDaT_(this=0x000000016fdfc858, typed_ex=jtl::ref<jank::analyze::expr::cpp_value> @ 0x000000016fdfc468) at evaluate.cpp:272:52
frame #14: 0x0000000100e28808 jank`auto jank::analyze::visit_expr<jank::evaluate::eval(jtl::ref<jank::analyze::expression>)::$_0>(f=0x000000016fdfc858, e=jank::analyze::expression_ref @ 0x000000016fdfc818) at visit.hpp:93:16
frame #15: 0x0000000100e2822c jank`jank::evaluate::eval(ex=jank::analyze::expression_ref @ 0x000000016fdfc8a0) at evaluate.cpp:272:5
frame #16: 0x0000000100a87798 jank`jank::runtime::context::eval_string(this=0x0000000103429c00, code=0x000000016fdfd830) at context.cpp:177:13
frame #17: 0x0000000100a87480 jank`jank::runtime::context::eval_file(this=0x0000000103429c00, path=0x000000016fdfdaf8) at context.cpp:160:12
frame #18: 0x00000001000045e4 jank`jank::repl() at main.cpp:197:34
frame #19: 0x00000001000037fc jank`main::$_0::operator()(this=0x000000016fdfe21f, argc=2, argv=0x000000016fdfea30) const at main.cpp:326:9
frame #20: 0x00000001000035f4 jank`main::$_0::__invoke(argc=2, argv=0x000000016fdfea30) at main.cpp:284:60
frame #21: 0x00000001004f8fac jank`jank_init_with_pch(argc=2, argv=0x000000016fdfea30, init_default_ctx='\0', pch_data=0x0000000000000000, pch_size=0, fn=(jank`main::$_0::__invoke(int, char const**) at main.cpp:284)) at c_api.cpp:1038:14
frame #22: 0x00000001004f8df0 jank`jank_init(argc=2, argv=0x000000016fdfea30, init_default_ctx='\0', fn=(jank`main::$_0::__invoke(int, char const**) at main.cpp:284)) at c_api.cpp:1000:12
frame #23: 0x0000000100002fac jank`main(argc=2, argv=0x000000016fdfea30) at main.cpp:284:10
frame #24: 0x000000019b6d2b98 dyld`start + 6076