@@ -766,18 +766,19 @@ def test_type_vars(self) -> None:
766766 self .assert_join (self .fx .t , self .fx .s , self .fx .o )
767767
768768 def test_none (self ) -> None :
769- # Any type t joined with None results in t.
770- for t in [
771- NoneType (),
772- self .fx .a ,
773- self .fx .o ,
774- UnboundType ("x" ),
775- self .fx .t ,
776- self .tuple (),
777- self .callable (self .fx .a , self .fx .b ),
778- self .fx .anyt ,
779- ]:
780- self .assert_join (t , NoneType (), t )
769+ with state .strict_optional_set (False ):
770+ # Any type t joined with None results in t.
771+ for t in [
772+ NoneType (),
773+ self .fx .a ,
774+ self .fx .o ,
775+ UnboundType ("x" ),
776+ self .fx .t ,
777+ self .tuple (),
778+ self .callable (self .fx .a , self .fx .b ),
779+ self .fx .anyt ,
780+ ]:
781+ self .assert_join (t , NoneType (), t )
781782
782783 def test_unbound_type (self ) -> None :
783784 self .assert_join (UnboundType ("x" ), UnboundType ("x" ), self .fx .anyt )
@@ -798,11 +799,15 @@ def test_unbound_type(self) -> None:
798799
799800 def test_any_type (self ) -> None :
800801 # Join against 'Any' type always results in 'Any'.
802+ with state .strict_optional_set (False ):
803+ self .assert_join (NoneType (), self .fx .anyt , self .fx .anyt )
804+
801805 for t in [
802806 self .fx .anyt ,
803807 self .fx .a ,
804808 self .fx .o ,
805- NoneType (),
809+ # TODO: fix this is not currently symmetric
810+ # NoneType(),
806811 UnboundType ("x" ),
807812 self .fx .t ,
808813 self .tuple (),
@@ -834,7 +839,11 @@ def test_other_mixed_types(self) -> None:
834839 self .assert_join (t1 , t2 , self .fx .o )
835840
836841 def test_simple_generics (self ) -> None :
837- self .assert_join (self .fx .ga , self .fx .nonet , self .fx .ga )
842+ with state .strict_optional_set (False ):
843+ self .assert_join (self .fx .ga , self .fx .nonet , self .fx .ga )
844+ with state .strict_optional_set (True ):
845+ self .assert_join (self .fx .ga , self .fx .nonet , UnionType ([self .fx .ga , NoneType ()]))
846+
838847 self .assert_join (self .fx .ga , self .fx .anyt , self .fx .anyt )
839848
840849 for t in [
@@ -1105,22 +1114,22 @@ def test_class_subtyping(self) -> None:
11051114 self .assert_meet (self .fx .a , self .fx .o , self .fx .a )
11061115 self .assert_meet (self .fx .a , self .fx .b , self .fx .b )
11071116 self .assert_meet (self .fx .b , self .fx .o , self .fx .b )
1108- self .assert_meet (self .fx .a , self .fx .d , NoneType ())
1109- self .assert_meet (self .fx .b , self .fx .c , NoneType ())
1117+ self .assert_meet (self .fx .a , self .fx .d , UninhabitedType ())
1118+ self .assert_meet (self .fx .b , self .fx .c , UninhabitedType ())
11101119
11111120 def test_tuples (self ) -> None :
11121121 self .assert_meet (self .tuple (), self .tuple (), self .tuple ())
11131122 self .assert_meet (self .tuple (self .fx .a ), self .tuple (self .fx .a ), self .tuple (self .fx .a ))
11141123 self .assert_meet (
11151124 self .tuple (self .fx .b , self .fx .c ),
11161125 self .tuple (self .fx .a , self .fx .d ),
1117- self .tuple (self .fx .b , NoneType ()),
1126+ self .tuple (self .fx .b , UninhabitedType ()),
11181127 )
11191128
11201129 self .assert_meet (
11211130 self .tuple (self .fx .a , self .fx .a ), self .fx .std_tuple , self .tuple (self .fx .a , self .fx .a )
11221131 )
1123- self .assert_meet (self .tuple (self .fx .a ), self .tuple (self .fx .a , self .fx .a ), NoneType ())
1132+ self .assert_meet (self .tuple (self .fx .a ), self .tuple (self .fx .a , self .fx .a ), UninhabitedType ())
11241133
11251134 def test_function_types (self ) -> None :
11261135 self .assert_meet (
@@ -1143,23 +1152,36 @@ def test_function_types(self) -> None:
11431152 def test_type_vars (self ) -> None :
11441153 self .assert_meet (self .fx .t , self .fx .t , self .fx .t )
11451154 self .assert_meet (self .fx .s , self .fx .s , self .fx .s )
1146- self .assert_meet (self .fx .t , self .fx .s , NoneType ())
1155+ self .assert_meet (self .fx .t , self .fx .s , UninhabitedType ())
11471156
11481157 def test_none (self ) -> None :
11491158 self .assert_meet (NoneType (), NoneType (), NoneType ())
11501159
11511160 self .assert_meet (NoneType (), self .fx .anyt , NoneType ())
11521161
11531162 # Any type t joined with None results in None, unless t is Any.
1154- for t in [
1155- self .fx .a ,
1156- self .fx .o ,
1157- UnboundType ("x" ),
1158- self .fx .t ,
1159- self .tuple (),
1160- self .callable (self .fx .a , self .fx .b ),
1161- ]:
1162- self .assert_meet (t , NoneType (), NoneType ())
1163+ with state .strict_optional_set (False ):
1164+ for t in [
1165+ self .fx .a ,
1166+ self .fx .o ,
1167+ UnboundType ("x" ),
1168+ self .fx .t ,
1169+ self .tuple (),
1170+ self .callable (self .fx .a , self .fx .b ),
1171+ ]:
1172+ self .assert_meet (t , NoneType (), NoneType ())
1173+
1174+ with state .strict_optional_set (True ):
1175+ self .assert_meet (self .fx .o , NoneType (), NoneType ())
1176+ for t in [
1177+ self .fx .a ,
1178+ # TODO: fix this is not currently symmetric
1179+ # UnboundType("x"),
1180+ self .fx .t ,
1181+ self .tuple (),
1182+ self .callable (self .fx .a , self .fx .b ),
1183+ ]:
1184+ self .assert_meet (t , NoneType (), UninhabitedType ())
11631185
11641186 def test_unbound_type (self ) -> None :
11651187 self .assert_meet (UnboundType ("x" ), UnboundType ("x" ), self .fx .anyt )
@@ -1197,28 +1219,28 @@ def test_simple_generics(self) -> None:
11971219 self .assert_meet (self .fx .ga , self .fx .ga , self .fx .ga )
11981220 self .assert_meet (self .fx .ga , self .fx .o , self .fx .ga )
11991221 self .assert_meet (self .fx .ga , self .fx .gb , self .fx .gb )
1200- self .assert_meet (self .fx .ga , self .fx .gd , self . fx . nonet )
1201- self .assert_meet (self .fx .ga , self .fx .g2a , self . fx . nonet )
1222+ self .assert_meet (self .fx .ga , self .fx .gd , UninhabitedType () )
1223+ self .assert_meet (self .fx .ga , self .fx .g2a , UninhabitedType () )
12021224
1203- self .assert_meet (self .fx .ga , self .fx .nonet , self . fx . nonet )
1225+ self .assert_meet (self .fx .ga , self .fx .nonet , UninhabitedType () )
12041226 self .assert_meet (self .fx .ga , self .fx .anyt , self .fx .ga )
12051227
12061228 for t in [self .fx .a , self .fx .t , self .tuple (), self .callable (self .fx .a , self .fx .b )]:
1207- self .assert_meet (t , self .fx .ga , self . fx . nonet )
1229+ self .assert_meet (t , self .fx .ga , UninhabitedType () )
12081230
12091231 def test_generics_with_multiple_args (self ) -> None :
12101232 self .assert_meet (self .fx .hab , self .fx .hab , self .fx .hab )
12111233 self .assert_meet (self .fx .hab , self .fx .haa , self .fx .hab )
1212- self .assert_meet (self .fx .hab , self .fx .had , self . fx . nonet )
1234+ self .assert_meet (self .fx .hab , self .fx .had , UninhabitedType () )
12131235 self .assert_meet (self .fx .hab , self .fx .hbb , self .fx .hbb )
12141236
12151237 def test_generics_with_inheritance (self ) -> None :
12161238 self .assert_meet (self .fx .gsab , self .fx .gb , self .fx .gsab )
1217- self .assert_meet (self .fx .gsba , self .fx .gb , self . fx . nonet )
1239+ self .assert_meet (self .fx .gsba , self .fx .gb , UninhabitedType () )
12181240
12191241 def test_generics_with_inheritance_and_shared_supertype (self ) -> None :
1220- self .assert_meet (self .fx .gsba , self .fx .gs2a , self . fx . nonet )
1221- self .assert_meet (self .fx .gsab , self .fx .gs2a , self . fx . nonet )
1242+ self .assert_meet (self .fx .gsba , self .fx .gs2a , UninhabitedType () )
1243+ self .assert_meet (self .fx .gsab , self .fx .gs2a , UninhabitedType () )
12221244
12231245 def test_generic_types_and_dynamic (self ) -> None :
12241246 self .assert_meet (self .fx .gdyn , self .fx .ga , self .fx .ga )
@@ -1232,33 +1254,33 @@ def test_callables_with_dynamic(self) -> None:
12321254
12331255 def test_meet_interface_types (self ) -> None :
12341256 self .assert_meet (self .fx .f , self .fx .f , self .fx .f )
1235- self .assert_meet (self .fx .f , self .fx .f2 , self . fx . nonet )
1257+ self .assert_meet (self .fx .f , self .fx .f2 , UninhabitedType () )
12361258 self .assert_meet (self .fx .f , self .fx .f3 , self .fx .f3 )
12371259
12381260 def test_meet_interface_and_class_types (self ) -> None :
12391261 self .assert_meet (self .fx .o , self .fx .f , self .fx .f )
1240- self .assert_meet (self .fx .a , self .fx .f , self . fx . nonet )
1262+ self .assert_meet (self .fx .a , self .fx .f , UninhabitedType () )
12411263
12421264 self .assert_meet (self .fx .e , self .fx .f , self .fx .e )
12431265
12441266 def test_meet_class_types_with_shared_interfaces (self ) -> None :
12451267 # These have nothing special with respect to meets, unlike joins. These
12461268 # are for completeness only.
1247- self .assert_meet (self .fx .e , self .fx .e2 , self . fx . nonet )
1248- self .assert_meet (self .fx .e2 , self .fx .e3 , self . fx . nonet )
1269+ self .assert_meet (self .fx .e , self .fx .e2 , UninhabitedType () )
1270+ self .assert_meet (self .fx .e2 , self .fx .e3 , UninhabitedType () )
12491271
12501272 def test_meet_with_generic_interfaces (self ) -> None :
12511273 fx = InterfaceTypeFixture ()
12521274 self .assert_meet (fx .gfa , fx .m1 , fx .m1 )
12531275 self .assert_meet (fx .gfa , fx .gfa , fx .gfa )
1254- self .assert_meet (fx .gfb , fx .m1 , fx . nonet )
1276+ self .assert_meet (fx .gfb , fx .m1 , UninhabitedType () )
12551277
12561278 def test_type_type (self ) -> None :
12571279 self .assert_meet (self .fx .type_a , self .fx .type_b , self .fx .type_b )
12581280 self .assert_meet (self .fx .type_b , self .fx .type_any , self .fx .type_b )
12591281 self .assert_meet (self .fx .type_b , self .fx .type_type , self .fx .type_b )
1260- self .assert_meet (self .fx .type_b , self .fx .type_c , self .fx .nonet )
1261- self .assert_meet (self .fx .type_c , self .fx .type_d , self .fx .nonet )
1282+ self .assert_meet (self .fx .type_b , self .fx .type_c , self .fx .type_never )
1283+ self .assert_meet (self .fx .type_c , self .fx .type_d , self .fx .type_never )
12621284 self .assert_meet (self .fx .type_type , self .fx .type_any , self .fx .type_any )
12631285 self .assert_meet (self .fx .type_b , self .fx .anyt , self .fx .type_b )
12641286
0 commit comments