diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-22 15:12:43 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-22 15:21:11 +0000 |
| commit | 98ef8bc4dfcebe44eece933ff0affc776b7199dd (patch) | |
| tree | d02ffca5fd65852344a3e032bfbd3a4638c79dac /lib/CodeGen/CodeGen.cc | |
| parent | 8b6ba7222d9990bc19e355eabcf046a7ea773545 (diff) | |
fix(codegen): raise a runtime error when a FUNCTION ends without RETURN
Report the function and its header line, then throw, instead of silently
returning zero. FUNCTION MAIN keeps its implicit result.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Diffstat (limited to 'lib/CodeGen/CodeGen.cc')
| -rw-r--r-- | lib/CodeGen/CodeGen.cc | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/CodeGen/CodeGen.cc b/lib/CodeGen/CodeGen.cc index e45a3db..772dc82 100644 --- a/lib/CodeGen/CodeGen.cc +++ b/lib/CodeGen/CodeGen.cc @@ -77,6 +77,14 @@ CodeGen::CodeGen() { activateStackObject(registerStackObject(Addr, TypeName, Line)); }); + FuncGen->setMissingReturnHandler([this](int Line, const std::string &Name) { + Value *Msg = Builder->CreateGlobalString("[Fatal] line %d: FUNCTION %s ended without RETURN\n", + "err_missing_return", 0, TheModule.get()); + Value *NameStr = Builder->CreateGlobalString(Name, "function_name", 0, TheModule.get()); + RuntimeChecker->emitStderr(Msg, {RuntimeChecker->lineValue(Line), NameStr}); + Exceptions->emitThrow(); + }); + SetupExternalFunctions(); } |
