From 7083718e695e954f1b35fe2bcf8a98a5daf0896a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amaury=20S=C3=A9chet?= Date: Tue, 3 Dec 2024 14:31:04 +0000 Subject: [PATCH] Fix a crash when returning void. --- src/d/llvm/backend.d | 3 +++ src/d/llvm/statement.d | 11 ++++++++++- test/unit/dg.d | 16 ++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/unit/dg.d diff --git a/src/d/llvm/backend.d b/src/d/llvm/backend.d index d021fdffc..2f335dc9d 100644 --- a/src/d/llvm/backend.d +++ b/src/d/llvm/backend.d @@ -248,6 +248,9 @@ public: } } + import d.llvm.global; + GlobalGen(pass).checkModule(); + runLLVMPasses(); // Now that we generated the IR, we run the unittests. diff --git a/src/d/llvm/statement.d b/src/d/llvm/statement.d index 17de2b64f..b727339bd 100644 --- a/src/d/llvm/statement.d +++ b/src/d/llvm/statement.d @@ -131,8 +131,17 @@ struct StatementGen { break; case Return: + LLVMValueRef ret; if (bb.value) { - auto ret = genExpression(bb.value); + auto v = genExpression(bb.value); + + // LLVM IR does not support void return. + if (LLVMGetTypeKind(LLVMTypeOf(v)) != LLVMTypeKind.Void) { + ret = v; + } + } + + if (ret) { LLVMBuildRet(builder, ret); } else { LLVMBuildRetVoid(builder); diff --git a/test/unit/dg.d b/test/unit/dg.d new file mode 100644 index 000000000..6b962ae58 --- /dev/null +++ b/test/unit/dg.d @@ -0,0 +1,16 @@ +unittest voiddg { + uint a = 0; + void increment() { + a++; + } + + increment(); + assert(a == 1); + + void forward(void delegate() dg) { + return dg(); + } + + forward(increment); + assert(a == 2); +}