diff --git a/spec/compiler/codegen/void_spec.cr b/spec/compiler/codegen/void_spec.cr index 75c643b5378f0fb8dc6538edfb2d449c01ce316c..36e46fcf9386e17544e5fa48b1771fa01d11b232 100644 --- a/spec/compiler/codegen/void_spec.cr +++ b/spec/compiler/codegen/void_spec.cr @@ -64,4 +64,15 @@ describe "Code gen: void" do end )) end + + it "codegens no return assignment" do + build(" + lib C + fun exit : NoReturn + end + + a = C.exit + a + ") + end end diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr index 955807d01fe583c13dd50794ce5127c60e2210a2..032644927b9dcbcfb08e23fe24a7da2503c5d18e 100644 --- a/spec/spec_helper.cr +++ b/spec/spec_helper.cr @@ -1,10 +1,11 @@ +ENV["CRYSTAL_PATH"] = "#{__DIR__}/../src" +ENV["VERIFY"] = "1" + require "spec" require "../src/compiler/crystal/**" include Crystal -ENV["CRYSTAL_PATH"] = "#{__DIR__}/../src" - class Crystal::Program def union_of(type1, type2) union_of([type1, type2] of Type).not_nil! diff --git a/src/compiler/crystal/codegen.cr b/src/compiler/crystal/codegen.cr index 475896149a69b2f65aebf69aad7adc62ae8ce2e2..ae25960d293141b383aaf2d1cbb75ad8ffe27e9d 100644 --- a/src/compiler/crystal/codegen.cr +++ b/src/compiler/crystal/codegen.cr @@ -8,8 +8,6 @@ require "codegen/*" LLVM.init_x86 module Crystal - VERIFY_LLVM = ENV["VERIFY"] == "1" - MAIN_NAME = "__crystal_main" RAISE_NAME = "__crystal_raise" MALLOC_NAME = "__crystal_malloc" @@ -192,6 +190,7 @@ module Crystal end env_dump = ENV["DUMP"] + env_verify = ENV["VERIFY"] == "1" case env_dump when Nil # Nothing @@ -203,7 +202,7 @@ module Crystal @modules.each do |name, mod| mod.dump if dump_all_llvm || name =~ dump_llvm_regex - mod.verify if Crystal::VERIFY_LLVM + mod.verify if env_verify if @debug add_compile_unit_metadata(mod, name == "" ? "main" : name) @@ -1611,6 +1610,8 @@ module Crystal if var_type.void? context.vars[name] = LLVMVar.new(llvm_nil, @mod.void) + elsif var_type.no_return? + # No alloca for NoReturn elsif var.closure_in?(obj) # We deal with closured vars later elsif !obj || var.belongs_to?(obj)