typecheck-v2
Ibrahim Numanagić 2025-03-05 12:08:40 -08:00
parent 3291f5c4d1
commit ca99d98e10
3 changed files with 20 additions and 8 deletions

View File

@ -339,12 +339,10 @@ class __internal__:
def opt_ref_new(T: type) -> Optional[T]:
ret ptr null
@pure
@llvm
def opt_ref_new_rtti(T: type) -> Optional[T]:
obj = Ptr[byte]()
rsz = sizeof(tuple(T))
rtti = alloc_atomic(rsz) if RTTI.__contents_atomic__ else alloc(rsz)
__internal__.to_class_ptr(rtti, RTTI).id = T.__id__
return __internal__.opt_ref_new_arg(__internal__.to_class_ptr_rtti((obj, rtti), T))
ret { ptr, ptr } { ptr null, ptr null }
@pure
@derives
@ -381,7 +379,7 @@ class __internal__:
@pure
def opt_ref_bool_rtti(what: Optional[T], T: type) -> bool:
return __internal__.class_raw_rtti_ptr() != cobj()
return __internal__.class_raw_rtti_ptr(what) != cobj()
@pure
@derives

View File

@ -30,7 +30,7 @@ class Optional:
if isinstance(T, ByVal):
return __internal__.opt_tuple_bool(self, T)
elif __has_rtti__(T):
return __internal__.opt_ref_bool_rtti(T)
return __internal__.opt_ref_bool_rtti(self, T)
else:
return __internal__.opt_ref_bool(self, T)
@ -38,7 +38,7 @@ class Optional:
if isinstance(T, ByVal):
return __internal__.opt_tuple_invert(self, T)
elif __has_rtti__(T):
return __internal__.opt_ref_invert_rtti(T)
return __internal__.opt_ref_invert_rtti(self, T)
else:
return __internal__.opt_ref_invert(self, T)

View File

@ -497,3 +497,17 @@ class C(B):
def __init__(self):
super().__init__()
test = C()
#%% inherit_optional
# Fix 554
class A:
pass
class B(A):
pass
def foo(val: Optional[A]):
if val:
print("A")
else:
print("None[A]")
foo(A()) #: A
foo(None) #: None[A]