o
    2g                     @  s   d dl mZ d dlZd dlmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# dddZ$dddZ%ed e dZ&G dd dej'Z(dS )    )annotationsN)FnErrorcan_coerce_tocheck_func_ir)ClassIR)FuncDeclFuncIRFuncSignature)	Assign
BasicBlockGotoIntegerLoadAddressLoadLiteralOpRegisterReturn)format_func)
	RInstanceRTypeRUnionbytes_rprimitiveint32_rprimitiveint64_rprimitivenone_rprimitiveobject_rprimitivepointer_rprimitivestr_rprimitivefnr   errorr   returnNonec                 C  s   t | }||gksJ d S Nr   )r   r   errors r%   O/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/test/test_ircheck.pyassert_has_error"   s   r'   c                 C  s   t | rJ d S r"   r#   )r   r%   r%   r&   assert_no_errors'   s   r(   )rtypec                   @  s   e Zd Zd*ddZd+dd	Zd,d-ddZd*ddZd*ddZd*ddZd*ddZ	d*ddZ
d*ddZd*ddZd*d d!Zd*d"d#Zd*d$d%Zd*d&d'Zd*d(d)Zd
S ).TestIrcheckr    r!   c                 C  s
   d| _ d S )Nr   labelselfr%   r%   r&   setUp/   s   
zTestIrcheck.setUpopslist[Op]r   c                 C  s"   |  j d7  _ t| j }||_|S )N   )r,   r   r0   )r.   r0   blockr%   r%   r&   basic_block2   s   
zTestIrcheck.basic_blockNnamestrret_typeRType | Noner   c                 C  s$   |d u rt }t|d dtg |ddS )Nmodule)argsr7   )r5   
class_namemodule_namesig)r   r   r	   )r.   r5   r7   r%   r%   r&   	func_decl8   s   
zTestIrcheck.func_declc                 C  s0   t t| jddg | jttdgdgd d S )Nfunc_1r5   valuer0   declarg_regsblocks)r(   r   r>   r4   r   
NONE_VALUEr-   r%   r%   r&   test_valid_fnB   s   
zTestIrcheck.test_valid_fnc                 C  s8   |  g }t| jddg |gd}t|t|dd d S )Nr?   r@   rD   zBlock not terminatedsourcedesc)r4   r   r>   r'   r   )r.   r3   r   r%   r%   r&   %test_block_not_terminated_empty_blockK   s   
z1TestIrcheck.test_block_not_terminated_empty_blockc                 C  sJ   |  ttdg}|  t|dg}t| jddg ||gd}t| d S )NrA   r+   r?   r@   rD   )r4   r   rH   r   r   r>   r(   )r.   block_1block_2r   r%   r%   r&   test_valid_gotoP   s   zTestIrcheck.test_valid_gotoc                 C  sV   |  ttdg}t|d}|  |g}t| jddg |gd}t|t|dd d S )NrA   r+   r?   r@   rD   #Invalid control operation target: 1rJ   )r4   r   rH   r   r   r>   r'   r   )r.   rN   gotorO   r   r%   r%   r&   test_invalid_gotoV   s   

zTestIrcheck.test_invalid_gotoc                 C  sL   t ttddd}| |g}t| jddg |gd}t|t|dd d S )	Nr1typer5   rA   r?   r@   rD   z%Invalid op reference to register 'r1'rJ   )r   r   r   r4   r   r>   r'   r   r.   retr3   r   r%   r%   r&   test_invalid_register_sourceb   s   z(TestIrcheck.test_invalid_register_sourcec                 C  sL   t tdtdd}| |g}t| jddg |gd}t|t|dd d S )	NfoorB   r)   rA   r?   r@   rD   z.Invalid op reference to op of type LoadLiteralrJ   )r   r   r   r4   r   r>   r'   r   rW   r%   r%   r&   test_invalid_op_sourceh   s   z"TestIrcheck.test_invalid_op_sourcec                 C  sJ   t tdtdd}t| jdtdg | |ggd}t|t|dd d S )	N   r[   rA   r?   )r5   r7   rD   .Cannot coerce source type i32 to dest type i64rJ   )	r   r   r   r   r>   r   r4   r'   r   )r.   rX   r   r%   r%   r&   test_invalid_return_typep   s   z$TestIrcheck.test_invalid_return_typec                 C  sd   t tdd}t|tdtdd}ttd}t| jdd|g| 	||ggd	}t
|t|d
d d S )NrT   rU   r]   r[   destsrcrA   r?   r@   rD   r^   rJ   )r   r   r
   r   r   r   rH   r   r>   r4   r'   r   )r.   arg_regassignrX   r   r%   r%   r&   test_invalid_assign{   s   

zTestIrcheck.test_invalid_assignc              	   C  s   t ddd}ttfttfttfttftttgtfttttgft|tfg}ttft|tfttfg}|D ]\}}t||sAJ q6|D ]\}}t||rOJ qDd S )NClscls)r5   r<   )	r   r   r   r   r   r   r   r   r   )r.   rg   valid_casesinvalid_casesrb   ra   r%   r%   r&   test_can_coerce_to   s$   

zTestIrcheck.test_can_coerce_toc                 C  sd   t tdd}t|tdtdd}| ||ttdg}t| jddg |gd	}t	|t
|d
d d S )NrT   rU   r]   r[   r`   rA   r?   r@   rD   zFunc has a duplicate oprJ   )r   r   r
   r   r4   r   rH   r   r>   r'   r   )r.   rc   rd   r3   r   r%   r%   r&   test_duplicate_op   s
   zTestIrcheck.test_duplicate_opc                 C  sh   |  ttdg}t|d}|  |g}t| jddg |gd}|dfg}t||}|g dks2J d S )NrA   r+   r?   r@   rD   rQ   )zdef func_1():zL0:z    goto L1z*  ERR: Invalid control operation target: 1)r4   r   rH   r   r   r>   r   )r.   rN   rR   rO   r   r$   	formattedr%   r%   r&   test_pprint   s   



zTestIrcheck.test_pprintc              
   C  sX   t td}t td}tt|}tt| jddg | j|t||t	t
dgdgd d S )Nxyr?   r@   rA   rC   rD   )r   r   r   r   r(   r   r>   r4   r
   r   rH   )r.   rxry	load_addrr%   r%   r&   #test_load_address_declares_register   s   



z/TestIrcheck.test_load_address_declares_register)r    r!   )r0   r1   r    r   r"   )r5   r6   r7   r8   r    r   )__name__
__module____qualname__r/   r4   r>   rI   rM   rP   rS   rY   r\   r_   re   rj   rk   rm   rs   r%   r%   r%   r&   r*   .   s     




	








r*   )r   r   r   r   r    r!   )r   r   r    r!   ))
__future__r   unittestmypyc.analysis.ircheckr   r   r   mypyc.ir.class_irr   mypyc.ir.func_irr   r   r	   mypyc.ir.opsr
   r   r   r   r   r   r   r   r   mypyc.ir.pprintr   mypyc.ir.rtypesr   r   r   r   r   r   r   r   r   r   r'   r(   rH   TestCaser*   r%   r%   r%   r&   <module>   s    ,0

