diff --git a/spec/compiler/type_inference/primitives_spec.cr b/spec/compiler/type_inference/primitives_spec.cr index 385291a49016..0b3f6431ac5c 100755 --- a/spec/compiler/type_inference/primitives_spec.cr +++ b/spec/compiler/type_inference/primitives_spec.cr @@ -57,4 +57,14 @@ describe "Type inference: primitives" do it "types instance_sizeof" do assert_type("instance_sizeof(Reference)") { int32 } end + + it "errors when comparing void (#225)" do + assert_error %( + lib Foo + fun foo + end + + Foo.foo == 1 + ), "undefined method '==' for Void" + end end diff --git a/src/compiler/crystal/program.cr b/src/compiler/crystal/program.cr index e63e6d99006b..0d951f441d58 100644 --- a/src/compiler/crystal/program.cr +++ b/src/compiler/crystal/program.cr @@ -32,7 +32,7 @@ module Crystal @number.abstract = true @types["NoReturn"] = @no_return = NoReturnType.new self - @types["Void"] = @void = VoidType.new self, self, "Void", @value, 1 + @types["Void"] = @void = VoidType.new self @types["Nil"] = @nil = NilType.new self, self, "Nil", @value, 1 @types["Bool"] = @bool = BoolType.new self, self, "Bool", @value, 1 @types["Char"] = @char = CharType.new self, self, "Char", @value, 4 diff --git a/src/compiler/crystal/types.cr b/src/compiler/crystal/types.cr index 90d0ec0b16ff..9b66f7943cb6 100644 --- a/src/compiler/crystal/types.cr +++ b/src/compiler/crystal/types.cr @@ -395,33 +395,6 @@ module Crystal end end - class NoReturnType < Type - getter :program - - def initialize(@program) - end - - def lookup_matches(signature, owner = self, type_lookup = self, matches_array = nil) - Matches.new(nil, nil, self, false) - end - - def no_return? - true - end - - def primitive_like? - true - end - - def parents - nil - end - - def to_s(io) - io << "NoReturn" - end - end - abstract class ContainedType < Type getter :program getter :container @@ -1459,10 +1432,59 @@ module Crystal end end - class VoidType < PrimitiveType + abstract class EmptyType < Type + getter :program + + def initialize(@program) + end + + def lookup_defs(name) + [] of Def + end + + def lookup_matches(signature, owner = self, type_lookup = self, matches_array = nil) + Matches.new(nil, nil, self, false) + end + + def parents + nil + end + + def allocated + true + end + + def abstract + false + end + end + + class NoReturnType < EmptyType + def no_return? + true + end + + def primitive_like? + true + end + + def to_s(io) + io << "NoReturn" + end + end + + class VoidType < EmptyType def void? true end + + def primitive_like? + true + end + + def to_s(io) + io << "Void" + end end class ValueType < NonGenericClassType