From fbbb033ea925c47e5ee776f9d3359669accc8c15 Mon Sep 17 00:00:00 2001 From: Jeff Bezanson Date: Sun, 6 Jan 2013 16:57:57 -0500 Subject: [PATCH] set does-not-return attribute on julia functions that don't return --- src/codegen.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index 380272055d721..121617d44a3af 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -1929,12 +1929,12 @@ static Function *emit_function(jl_lambda_info_t *lam) // try to avoid conflicts in the global symbol table funcName = "julia_" + funcName; + jl_value_t *jlrettype = jl_ast_rettype(lam, (jl_value_t*)ast); if (specsig) { std::vector fsig(0); for(size_t i=0; i < jl_tuple_len(lam->specTypes); i++) { fsig.push_back(julia_type_to_llvm(jl_tupleref(lam->specTypes,i))); } - jl_value_t *jlrettype = jl_ast_rettype(lam, (jl_value_t*)ast); Type *rt = (jlrettype == (jl_value_t*)jl_nothing->type ? T_void : julia_type_to_llvm(jlrettype)); f = Function::Create(FunctionType::get(rt, fsig, false), Function::ExternalLinkage, funcName, jl_Module); @@ -1950,6 +1950,8 @@ static Function *emit_function(jl_lambda_info_t *lam) lam->functionObject = (void*)f; } } + if (jlrettype == (jl_value_t*)jl_bottom_type) + f->setDoesNotReturn(); ctx.f = f;