jank
jank copied to clipboard
Returning a complex value from a `let`
jank health check
◎ jank check-health □ jank/compiler+runtime △⎪●◦◌◦◃◈⎥via △ v4.0.3 16:22
─ system ───────────────────────────────────────────────────────────────────────────────────────────
─ ✅ operating system: macos
─ ✅ default triple: arm64-apple-darwin23.4.0
─ jank install ─────────────────────────────────────────────────────────────────────────────────────
─ ✅ jank version: jank-0.1-67c06d9d7ad8582d94de258d0a4dce46332bf737
─ ✅ jank assertions are enabled; performance will be impacted
─ ✅ jank resource dir: ../lib/jank/0.1 (not found)
─ ✅ 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-darwin23.4.0-c7b867340f14b40e3a001dc29ec887c0e4a02cebbb645862d8ebf5114714dd39 (not found)
─ ✅ jank pch path: /Users/shantanusardesai/.cache/jank/arm64-apple-darwin23.4.0-c7b867340f14b40e3a001dc29ec887c0e4a02cebbb645862d8ebf5114714dd39 (found)
─ clang install ────────────────────────────────────────────────────────────────────────────────────
─ ✅ configured clang path: /opt/homebrew/opt/llvm@22/bin/clang++ (found)
─ ✅ configured clang resource dir: /opt/homebrew/Cellar/llvm/22.0.0/lib/clang/22 (found)
─ jank runtime ─────────────────────────────────────────────────────────────────────────────────────
─ ✅ jank runtime initialized
─ ✅ jank can jit compile c++
─ ✅ jank can jit compile llvm ir
Description of the issue with reproduction steps
As the issue title states, returning a value from a let which is not convertible using any of jank conversion traits causes a crash instead of a analyze_invalid_cpp_conversion error.
user => (cpp/raw "std::vector l{1, 2, 3, 4, 5};")
user => (let [l (cpp/value "l")] \
user=>... l)
For completeness pasting the error message printed by jank:
Assertion failed! cpp_util::is_convertible(expr_type)
Stack trace (most recent call first):
#0 0x000000010017bf87 in jtl::do_assertion_panic(jtl::immutable_string_view const&) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#1 0x0000000100a21ca3 in jtl::ref<jank::analyze::expr::function> jank::evaluate::wrap_expression<jank::analyze::expr::let>(jtl::ref<jank::analyze::expr::let>, jtl::immutable_string const&, folly::fbvector<jank::runtime::oref<jank::runtime::obj::symbol>, gc_allocator<jank::runtime::oref<jank::runtime::obj::symbol>>>) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#2 0x0000000100a215cf in jank::evaluate::eval(jtl::ref<jank::analyze::expr::let>) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#3 0x0000000100a598ef in auto jank::evaluate::eval(jtl::ref<jank::analyze::expression>)::$_0::operator()<jtl::ref<jank::analyze::expr::let>>(jtl::ref<jank::analyze::expr::let>) const at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#4 0x0000000100a185fb in auto jank::analyze::visit_expr<jank::evaluate::eval(jtl::ref<jank::analyze::expression>)::$_0>(jank::evaluate::eval(jtl::ref<jank::analyze::expression>)::$_0 const&, jtl::ref<jank::analyze::expression>) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#5 0x0000000100a18217 in jank::evaluate::eval(jtl::ref<jank::analyze::expression>) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#6 0x00000001006a17ef in jank::runtime::context::eval_string(jtl::immutable_string_view const&) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#7 0x00000001006a14d3 in jank::runtime::context::eval_file(jtl::immutable_string const&) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#8 0x00000001000048db in jank::repl() at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/src/cpp/main.cpp:199:34
#9 0x0000000100003ad3 in main::$_0::operator()(int, char const**) const at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/src/cpp/main.cpp:336:9
#10 0x00000001000038c3 in main::$_0::__invoke(int, char const**) at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/src/cpp/main.cpp:293:60
#11 0x000000010019eb23 in _jank_init at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/build/jank-phase-1
#12 0x0000000100002f6b in main at /Users/shantanusardesai/Desktop/code/projects/jank/compiler+runtime/src/cpp/main.cpp:293:10
#13 0x0000000190a7e0df in start + 2359 at /usr/lib/dyld
Stack trace
The same as above, but with slight more details:
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
frame #0: 0x0000000190dcea60 libsystem_kernel.dylib`__pthread_kill + 8
libsystem_kernel.dylib`__pthread_kill:
-> 0x190dcea60 <+8>: b.lo 0x190dcea80 ; <+40>
0x190dcea64 <+12>: pacibsp
0x190dcea68 <+16>: stp x29, x30, [sp, #-0x10]!
0x190dcea6c <+20>: mov x29, sp
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
* frame #0: 0x0000000190dcea60 libsystem_kernel.dylib`__pthread_kill + 8
frame #1: 0x0000000190e06c20 libsystem_pthread.dylib`pthread_kill + 288
frame #2: 0x0000000190d13a20 libsystem_c.dylib`abort + 180
frame #3: 0x000000010017bfa0 jank`jtl::do_assertion_panic(msg=0x000000016fdfc850) at assert.cpp:12:5
frame #4: 0x0000000100a21ca4 jank`jtl::ref<jank::analyze::expr::function> jank::evaluate::wrap_expression<jank::analyze::expr::let>(orig_expr=jtl::ref<jank::analyze::expr::let> @ 0x000000016fdfc9b8, name=0x000000016fdfca98, params=jank::native_vector<jank::runtime::oref<jank::runtime::obj::symbol> > @ 0x000000016fdfca80) at evaluate.cpp:183:7
frame #5: 0x0000000100a215d0 jank`jank::evaluate::eval(expr=jank::analyze::expr::let_ref @ 0x000000016fdfcad0) at evaluate.cpp:655:30
frame #6: 0x0000000100a598f0 jank`_ZZN4jank8evaluate4evalEN3jtl3refINS_7analyze10expressionEEEENK3$_0clINS2_INS3_4expr3letEEEEEDaT_(this=0x000000016fdfcf08, typed_ex=jtl::ref<jank::analyze::expr::let> @ 0x000000016fdfcb18) at evaluate.cpp:273:52
frame #7: 0x0000000100a185fc jank`auto jank::analyze::visit_expr<jank::evaluate::eval(jtl::ref<jank::analyze::expression>)::$_0>(f=0x000000016fdfcf08, e=jank::analyze::expression_ref @ 0x000000016fdfcec8) at visit.hpp:75:16
frame #8: 0x0000000100a18218 jank`jank::evaluate::eval(ex=jank::analyze::expression_ref @ 0x000000016fdfcf50) at evaluate.cpp:273:5
frame #9: 0x00000001006a17f0 jank`jank::runtime::context::eval_string(this=0x0000000102c35c00, code=0x000000016fdfdec0) at context.cpp:176:13
frame #10: 0x00000001006a14d4 jank`jank::runtime::context::eval_file(this=0x0000000102c35c00, path=0x000000016fdfe168) at context.cpp:159:12
frame #11: 0x00000001000048dc jank`jank::repl() at main.cpp:199:34
frame #12: 0x0000000100003ad4 jank`main::$_0::operator()(this=0x000000016fdfe88f, argc=2, argv=0x000000016fdfebf8) const at main.cpp:336:9
frame #13: 0x00000001000038c4 jank`main::$_0::__invoke(argc=2, argv=0x000000016fdfebf8) at main.cpp:293:60
frame #14: 0x000000010019eb24 jank`jank_init(argc=2, argv=0x000000016fdfebf8, init_default_ctx='\0', fn=(jank`main::$_0::__invoke(int, char const**) at main.cpp:293)) at c_api.cpp:988:14
frame #15: 0x0000000100002f6c jank`main(argc=2, argv=0x000000016fdfebf8) at main.cpp:293:10
frame #16: 0x0000000190a7e0e0 dyld`start + 2360