jank icon indicating copy to clipboard operation
jank copied to clipboard

Returning a complex value from a `let`

Open shantanu-sardesai opened this issue 4 months ago • 2 comments

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

shantanu-sardesai avatar Aug 23 '25 10:08 shantanu-sardesai