mirror of https://github.com/exaloop/codon.git
Fix #554
parent
3291f5c4d1
commit
ca99d98e10
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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]
|
Loading…
Reference in New Issue