typing: check missing return in AAttrPropdef with block
[nit.git] / src / semantize / typing.nit
index e283b43..343edbd 100644 (file)
@@ -267,7 +267,7 @@ private class TypeVisitor
                #debug("recv: {recvtype} (aka {unsafe_type})")
                if recvtype isa MNullType then
                        # `null` only accepts some methods of object.
-                       if name == "==" or name == "!=" then
+                       if name == "==" or name == "!=" or name == "is_same_instance" then
                                unsafe_type = mmodule.object_type.as_nullable
                        else
                                self.error(node, "Error: Method '{name}' call on 'null'.")
@@ -609,6 +609,10 @@ redef class AAttrPropdef
                var nblock = self.n_block
                if nblock != null then
                        v.visit_stmt(nblock)
+                       if not nblock.after_flow_context.is_unreachable then
+                               # We reach the end of the init without having a return, it is bad
+                               v.error(self, "Control error: Reached end of block (a 'return' with a value was expected).")
+                       end
                end
        end
 end
@@ -975,7 +979,7 @@ redef class AForExpr
                        is_col = true
                end
 
-               if mapit_cla != null and v.is_subtype(ittype, mapit_cla.get_mtype([objcla.mclass_type, objcla.mclass_type.as_nullable])) then
+               if mapit_cla != null and v.is_subtype(ittype, mapit_cla.get_mtype([objcla.mclass_type.as_nullable, objcla.mclass_type.as_nullable])) then
                        # Map Iterator
                        var coltype = ittype.supertype_to(v.mmodule, v.anchor, mapit_cla)
                        var variables = self.variables
@@ -1243,7 +1247,7 @@ redef class AArrayExpr
                if mtype == null then
                        mtype = v.merge_types(self, mtypes)
                end
-               if mtype == null then
+               if mtype == null or mtype isa MNullType then
                        v.error(self, "Type Error: ambiguous array type {mtypes.join(" ")}")
                        return
                end