U
    ,d                     @   s  d Z ddlZddlZddlmZ ddlZddlmZm	Z	m
Z
mZ ddlmZmZ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mZmZ ddlmZ ddl m!Z! dd	l"m#Z#m$Z$ dd
l%m&Z& ddl'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 dZ1edddd Z2dd Z3ee3dddd Z4G dd de*Z5dZ6dd Z7G dd de-e5Z8G dd de-e5Z9G dd  d e-e5Z:G d!d" d"e5Z;G d#d$ d$e-e5Z<G d%d& d&e*Z=G d'd( d(e*Z>e?d)kre+@  dS )*zn
This tests the inline kwarg to @jit and @overload etc, it has nothing to do with
LLVM or low level inlining.
    N)product)njittypeof	literallyprange)typesirir_utilscgutilserrors)overloadoverload_methodoverload_attributeregister_modeltypeof_implunboxNativeValuemodelsmake_attribute_wrapper	intrinsicregister_jitable)OpaqueModel)InlineOptions)DefaultPassBuilderCompilerBase)InlineOverloads	signature)TestCaseunittestskip_py38_or_laterMemoryLeakMixinIRPreservingTestPipelineskip_parfors_unsupportedignore_internal_warningsialwaysinlinec                 C   s   | d S N    xr*   r*   @/tmp/pip-unpacked-wheel-eu7e0c37/numba/tests/test_ir_inlining.py_global_func*   s    r.   c                 C   s   | d S r(   r*   r+   r*   r*   r-   _global_defn0   s    r/   c                 C   s   t S Nr/   r+   r*   r*   r-   _global_overload4   s    r2   c                   @   s2   e Zd ZdZdddZdd Zdd Zdd	 Zd
S )InliningBaseFTr%   neverc                 C   sN   |j  D ]>}|jD ]2}t|tjrt|jtjr|jjdkr  dS qq
dS )N   TF)blocksvaluesbody
isinstancer   AssignvalueZFreeVar)selffunc_irblkstmtr*   r*   r-   sentinel_17_cost_modelB   s    
z#InliningBase.sentinel_17_cost_modelc                 O   s  | dd }|st| dd}|r(t| D ]$\}}t|tsFtt|ts0tq0ttd|}| || ||  |j	|j
d  jd }	t|	j|	_| jrtddd	 |	  |d
kr| t|	j| tt|	j }
dd |
 D }|st| D ]r\}}d}|D ]P}t|dddkrL|	|j}||j|kO }nt|r||jj|kO }q| ||k q
|	S )Ninline_expectblock_countr)   Zpipeline_classr   preserved_irZFIRP   -SKIPc                 S   s   g | ]}|qS r*   r*   .0r,   r*   r*   r-   
<listcomp>i   s     z&InliningBase.check.<locals>.<listcomp>Fopcall) popAssertionErroritemsr:   strboolr   r"   assertEqual	overloads
signaturesmetadatar	   Zsimplify_CFGr7   _DEBUGprintcenterdumplennextiterr8   
find_exprsgetattrZget_definitionfuncnameZis_operator_or_getitemfn__name__assertFalse)r=   	test_implargskwargsrB   rC   kvj_funcfirblockexprsfoundexprZ	func_defnr*   r*   r-   checkO   s:    
zInliningBase.checkc                    sp   |   }td|tjfi }|d t|t G dd dt}t	| fdd}t
|dd }||fS )	z Use to generate a dummy type zDummyTypeFor{}Zmy_dummyc                   @   s   e Zd ZdS )z+InliningBase.make_dummy_type.<locals>.DummyN)rc   
__module____qualname__r*   r*   r*   r-   Dummy   s   rs   c                    s    S r0   r*   )valcZ
dummy_typer*   r-   typeof_dummy   s    z2InliningBase.make_dummy_type.<locals>.typeof_dummyc                 S   s   t |j S r0   )r   contextZget_dummy_value)typobjru   r*   r*   r-   unbox_dummy   s    z1InliningBase.make_dummy_type.<locals>.unbox_dummy)idtypeformatr   ZOpaquer   r   objectr   registerr   )r=   Ztest_id	DummyTypers   rw   r{   r*   rv   r-   make_dummy_typew   s    
zInliningBase.make_dummy_typeN)rc   rq   rr   rW   inline_opt_as_boolrA   rp   r   r*   r*   r*   r-   r3   9   s
   
(r3     c                     s   d d fdd	} | S )Ni                   ?c                    s<  | | }|  7 } t j|t jd}|| }d| }d}	d}
t |dkr || }t d|d }t || ||  }t |d dk rt| D ]}|	d7 }	t |	dk r qq|	|d 7 }	|| }g }tt|D ]J}|||  |dkrd}d}
|d	| kr|
|7 }
|
|d t	 7 }
q|| | |
 | |  |	 S )
Ndtyper   r   r)            {   z   )
npzerosZ	complex64absZarangesqrtranger[   append_GLOBAL)abru   defghintrh   lmopqrsZ_FREEVARr*   r-   foo   s8    
z_gen_involved.<locals>.foo)r   r   Nr*   r   r*   r   r-   _gen_involved   s     r   c                   @   s   e Zd Zdd Zdd Zdd Zeddd	 Zd
d Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zed d! Zd"d# Zd$S )%TestFunctionInliningc                    s4   t dddd   fdd}| j|ddid	 d S )
Nr5   r&   c                   S   s   d S r0   r*   r*   r*   r*   r-   r      s    z9TestFunctionInlining.test_basic_inline_never.<locals>.fooc                      s     S r0   r*   r*   r   r*   r-   impl   s    z:TestFunctionInlining.test_basic_inline_never.<locals>.implr   FrB   r   rp   r=   r   r*   r   r-   test_basic_inline_never   s    
z,TestFunctionInlining.test_basic_inline_neverc                    s4   t dddd   fdd}| j|ddid	 d S )
Nr%   r&   c                   S   s   d S r0   r*   r*   r*   r*   r-   r      s    z:TestFunctionInlining.test_basic_inline_always.<locals>.fooc                      s     S r0   r*   r*   r   r*   r-   r      s    z;TestFunctionInlining.test_basic_inline_always.<locals>.implr   Tr   r   r   r*   r   r-   test_basic_inline_always   s    
z-TestFunctionInlining.test_basic_inline_alwaysc                    s    fdd}d}t |||D ]l\}}}t|ddd t|ddd  t|dd	d
 | j| | j| | j| d}| j||d q d S )Nc                     s    }   } }| ||fS r0   r*   r,   yzbarbazr   r*   r-   r      s    z;TestFunctionInlining.test_basic_inline_combos.<locals>.implr4   r&   c                   S   s   d S r0   r*   r*   r*   r*   r-   r      s    z:TestFunctionInlining.test_basic_inline_combos.<locals>.fooc                   S   s   d S r0   r*   r*   r*   r*   r-   r      s    z:TestFunctionInlining.test_basic_inline_combos.<locals>.barc                   S   s   d S r0   r*   r*   r*   r*   r-   r      s    z:TestFunctionInlining.test_basic_inline_combos.<locals>.bazr   r   r   r   )r   r   r   rp   )r=   r   opts
inline_foo
inline_bar
inline_bazrB   r*   r   r-   test_basic_inline_combos   s    


z-TestFunctionInlining.test_basic_inline_combosz$Need to work out how to prevent thisc                    s>   t ddfddd  fdd}| j|dd	id
 d S )Nr%   r&   c                    s   | dkrdS  | d  d S )Nr   r   r)   r*   r+   r   r*   r-   r      s    z7TestFunctionInlining.test_recursive_inline.<locals>.foor   c                     s0   d}  dkr| d7 } d |  k r,| d8 } d S )Nr   r)   r   r*   r   r   r   r*   r-   r      s    z8TestFunctionInlining.test_recursive_inline.<locals>.implr   Tr   r   r   r*   r   r-   test_recursive_inline   s
    z*TestFunctionInlining.test_recursive_inlinec                    s   dd } fdd}d}t |||D ]Z\}}}||dd||dd	 ||d
d| j| | j| | j| d}| j||d q(d S )Nc                    s&    d t | d fdd}|S )Nr   r&   c                      s    d fS Nr   r*   r*   r   r*   r-   r`     s    zITestFunctionInlining.test_freevar_bindings.<locals>.factory.<locals>.func)r   )r'   r,   r   r`   r*   r   r-   factory  s    z;TestFunctionInlining.test_freevar_bindings.<locals>.factoryc                     s    }   } }| ||fS r0   r*   r   r   r*   r-   r   
  s    z8TestFunctionInlining.test_freevar_bindings.<locals>.implr4   
         (   2   <   r   r   r   r   rp   )r=   r   r   r   r   r   r   rB   r*   r   r-   test_freevar_bindings   s    z*TestFunctionInlining.test_freevar_bindingsc                 C   s   dd }| j |ddid d S )Nc                  S   s   d} t | S N   )r.   r+   r*   r*   r-   r     s    z6TestFunctionInlining.test_global_binding.<locals>.implr.   Tr   rp   r   r*   r*   r-   test_global_binding  s    z(TestFunctionInlining.test_global_bindingc                    s.   ddl m   fdd}| j|ddid d S )Nr)   r   c                     s   t d }   | fS Nr   _GLOBAL1r   r   r*   r-   r   )  s    zBTestFunctionInlining.test_inline_from_another_module.<locals>.implr   Tr   )inlining_usecasesr   rp   r   r*   r   r-   test_inline_from_another_module%  s    z4TestFunctionInlining.test_inline_from_another_modulec                    s4   dd l m  m   fdd}| j|ddid d S )Nr   c                     s   t d }   | fS r   )r   r   r   Ziucr*   r-   r   3  s    zLTestFunctionInlining.test_inline_from_another_module_w_getattr.<locals>.implr   Tr   numba.tests.inlining_usecasestestsr   rp   r   r*   r   r-   )test_inline_from_another_module_w_getattr/  s    z>TestFunctionInlining.test_inline_from_another_module_w_getattrc                    s6   dd l }dd lm   fdd}| j|ddid d S )Nr   c                     s   t d }  j | fS r   )r   r   r   r   ntr*   r-   r   >  s    zNTestFunctionInlining.test_inline_from_another_module_w_2_getattr.<locals>.implr   Tr   r   Znumba.testsr   rp   r=   numbar   r*   r   r-   +test_inline_from_another_module_w_2_getattr9  s    z@TestFunctionInlining.test_inline_from_another_module_w_2_getattrc                    s0   dd }|   fdd}| j |ddid d S )Nc                     s&   ddl m  tdd fdd} | S )Nr)   r   r%   r&   c                      s     S r0   r*   r*   r   r*   r-   tmpI  s    z]TestFunctionInlining.test_inline_from_another_module_as_freevar.<locals>.factory.<locals>.tmp)r   r   r   r   r*   r   r-   r   F  s    zPTestFunctionInlining.test_inline_from_another_module_as_freevar.<locals>.factoryc                     s   t d }   | fS r   r   r   r   r*   r-   r   P  s    zMTestFunctionInlining.test_inline_from_another_module_as_freevar.<locals>.implr   Tr   r   r=   r   r   r*   r   r-   *test_inline_from_another_module_as_freevarD  s    z?TestFunctionInlining.test_inline_from_another_module_as_freevarc                    s8   ddl m   fdd}|dd}| j|ddid	 d S )
Nr)   baz_factoryc                    s     fdd}|S )Nc                     s   t    }  |  fS r0   r   r   r   r   r   r*   r-   r   ]  s    zYTestFunctionInlining.test_inline_w_freevar_from_another_module.<locals>.gen.<locals>.implr*   r   r   r   r   r   r-   genZ  s    zKTestFunctionInlining.test_inline_w_freevar_from_another_module.<locals>.genr   r   r   Tr   )r   r   rp   r=   r   r   r*   r   r-   )test_inline_w_freevar_from_another_moduleV  s    
z>TestFunctionInlining.test_inline_w_freevar_from_another_modulec                    s   fdd}fdd}dD ]D\t |dfddfd	d
}j|dddkid qdD ]D\t |dfdd  fdd
}j|dddkid qfd S )Nc                    s&     | tj  | jd  |S NrM   assertIsInstancer   ExprrS   rL   rA   ro   Zcaller_infoZcallee_infor=   r*   r-   s17_caller_modelg  s    zCTestFunctionInlining.test_inlining_models.<locals>.s17_caller_modelc                    s&     | tj  | jd  |S r   r   r   r   r*   r-   s17_callee_modell  s    zCTestFunctionInlining.test_inlining_models.<locals>.s17_callee_model)   r6   r6   r   r&   c                      s    S r0   r*   r*   calleer*   r-   r   t  s    z6TestFunctionInlining.test_inlining_models.<locals>.fooc                    s   |   } }|d |fS r   r*   r   r,   r   callerr   r*   r-   r   x  s    z7TestFunctionInlining.test_inlining_models.<locals>.implr   r   r6   r   c                      s    S r0   r*   r*   r   r*   r-   r     s    z6TestFunctionInlining.test_inlining_models.<locals>.barc                    s   |  }  }|d |fS r   r*   r   r   r   r*   r-   r     s    r   r   )r=   r   r   r   r*   r   r   r   r   r=   r-   test_inlining_modelse  s    z)TestFunctionInlining.test_inlining_modelsc                    s6   t dddd   fdd}| j|ddid	d
 d S )Nr%   r&   c                   S   s   dS Nr   r*   r*   r*   r*   r-   r     s    z9TestFunctionInlining.test_inline_inside_loop.<locals>.fooc                     s    d} t dD ]}|   7 } q| S )N        r   r   )accr   r   r*   r-   r     s    z:TestFunctionInlining.test_inline_inside_loop.<locals>.implr   T   rB   rC   r   r   r*   r   r-   test_inline_inside_loop  s    
z,TestFunctionInlining.test_inline_inside_loopc                    s6   t dddd   fdd}| j|ddid	d
 d S )Nr%   r&   c                   S   s   dS r   r*   r*   r*   r*   r-   r     s    zHTestFunctionInlining.test_inline_inside_closure_inside_loop.<locals>.fooc                     s,   d} t dD ]} fdd}| | 7 } q| S )Nr   r   c                      s
     d S N   r*   r*   r   r*   r-   r     s    zVTestFunctionInlining.test_inline_inside_closure_inside_loop.<locals>.impl.<locals>.barr  )r  r   r   r   r*   r-   r     s
    zITestFunctionInlining.test_inline_inside_closure_inside_loop.<locals>.implr   Tr  r  r   r   r*   r   r-   &test_inline_inside_closure_inside_loop  s    
z;TestFunctionInlining.test_inline_inside_closure_inside_loopc                    s6   t dddd   fdd}| j|ddid	d
 d S )Nr%   r&   c                    s    fdd}| d S )Nc                      s   d  S r   r*   r*   r   r*   r-   r     s    zbTestFunctionInlining.test_inline_closure_inside_inlinable_inside_closure.<locals>.foo.<locals>.baz   r*   )r   r   r*   r	  r-   r     s    zUTestFunctionInlining.test_inline_closure_inside_inlinable_inside_closure.<locals>.fooc                     s   d  fdd} |  d S )N	   c                    s    d |  S r  r*   r+   r   r   r*   r-   r     s    zcTestFunctionInlining.test_inline_closure_inside_inlinable_inside_closure.<locals>.impl.<locals>.barr   r*   r   r   r   r-   r     s    zVTestFunctionInlining.test_inline_closure_inside_inlinable_inside_closure.<locals>.implr   Tr)   r  r   r   r*   r   r-   3test_inline_closure_inside_inlinable_inside_closure  s    
zHTestFunctionInlining.test_inline_closure_inside_inlinable_inside_closurec                    sf   t ddt t ddfdd t dd fddfdd}| j|d	d	d	d
dd d S )Nr%   r&   c              
      sF   d  fdd}t | D ](} |d  d dd|  7  q S )Nr   c                    s   |   S r0   r*   )r   r  r*   r-   biz  s    zCTestFunctionInlining.test_inline_involved.<locals>.boz.<locals>.bizr
         @r)   y              (@r  )jr  r,   )fortranr  r-   boz  s
    &z6TestFunctionInlining.test_inline_involved.<locals>.bozc                    sX   d}t dD ]>}ddddd fdd}|||d |  7 }q||d S )Nr   r   r)   c                    s   d  |   S r   r*   r+   r   r   r*   r-   r     s    zCTestFunctionInlining.test_inline_involved.<locals>.foo.<locals>.bazr
  r   r  )r   r  r   r   )r  r  r  r-   r     s    z6TestFunctionInlining.test_inline_involved.<locals>.fooc                     s   d  fdd} |  d S )Nr  c                    s    d |  S r  r*   r+   r  r*   r-   r     s    zDTestFunctionInlining.test_inline_involved.<locals>.impl.<locals>.barr   r*   r   r   r   r-   r     s    z7TestFunctionInlining.test_inline_involved.<locals>.implT)r   r  r  %   r  )r   r   rp   r   r*   )r  r   r  r-   test_inline_involved  s    	

z)TestFunctionInlining.test_inline_involvedc           
         s   t dddd  t td fdd}| |dd	d
 |j|jd  jd }g }|j D ]@}|jD ]4}t	|t
jrht	|jt
jrh|jjdkrh|| qhq^| t|d |D ]2}|jj}|  | j}| d}	| ||	 qd S )Nr%   r&   c                 S   s   d}d}|| |  S )Nr   r   r*   r   r*   r*   r-   r     s    z=TestFunctionInlining.test_inline_renaming_scheme.<locals>.barrD   c                    s    |  |fS r0   r*   r   r   r   r*   r-   r     s    z=TestFunctionInlining.test_inline_renaming_scheme.<locals>.foor   r   )   #   r   rE   r   r   z__locals__bar_v[0-9]+.x)r   r"   rS   rT   rU   rV   r7   r8   r9   r:   r   r;   r<   Constr   r[   targetra   r|   lstriprq   assertRegex)
r=   r   r>   storer?   r@   r   ra   basenameregexr*   r   r-   test_inline_renaming_scheme  s&    


z0TestFunctionInlining.test_inline_renaming_schemeN)rc   rq   rr   r   r   r   r   skipr   r   r   r   r   r   r   r   r   r  r  r  r    r  r!  r*   r*   r*   r-   r      s&   		


(
#r   c                   @   s   e Zd Zdd ZdS )TestRegisterJitableInliningc                    s4   t dddd   fdd}| j|ddid	 d S )
Nr%   r&   c                   S   s   dS r(   r*   r*   r*   r*   r-   r     s    zFTestRegisterJitableInlining.test_register_jitable_inlines.<locals>.fooc                      s
      d S r0   r*   r*   r   r*   r-   r     s    zGTestRegisterJitableInlining.test_register_jitable_inlines.<locals>.implr   Tr   )r   rp   r   r*   r   r-   test_register_jitable_inlines  s    
z9TestRegisterJitableInlining.test_register_jitable_inlinesN)rc   rq   rr   r$  r*   r*   r*   r-   r#    s   r#  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-S ).TestOverloadInliningc                    s>   dd  t  dddd } fdd}| j|d	d
id d S )Nc                   S   s   d S r0   r*   r*   r*   r*   r-   r     s    z9TestOverloadInlining.test_basic_inline_never.<locals>.foor5   r&   c                  S   s   dd } | S )Nc                   S   s   d S r0   r*   r*   r*   r*   r-   foo_impl  s    zTTestOverloadInlining.test_basic_inline_never.<locals>.foo_overload.<locals>.foo_implr*   )r&  r*   r*   r-   foo_overload  s    zBTestOverloadInlining.test_basic_inline_never.<locals>.foo_overloadc                      s     S r0   r*   r*   r   r*   r-   r     s    z:TestOverloadInlining.test_basic_inline_never.<locals>.implr   Fr   r   rp   r=   r'  r   r*   r   r-   r     s
    

z,TestOverloadInlining.test_basic_inline_neverc                    s>   dd  t  dddd } fdd}| j|d	d
id d S )Nc                   S   s   d S r0   r*   r*   r*   r*   r-   r   $  s    z:TestOverloadInlining.test_basic_inline_always.<locals>.foor%   r&   c                  S   s   dd } | S )Nc                   S   s   d S r0   r*   r*   r*   r*   r-   r   )  s    zQTestOverloadInlining.test_basic_inline_always.<locals>.foo_overload.<locals>.implr*   r   r*   r*   r-   r'  '  s    zCTestOverloadInlining.test_basic_inline_always.<locals>.foo_overloadc                      s     S r0   r*   r*   r   r*   r-   r   -  s    z;TestOverloadInlining.test_basic_inline_always.<locals>.implr   Tr   r(  r)  r*   r   r-   r   "  s
    

z-TestOverloadInlining.test_basic_inline_alwaysc                    s>   dd  t  dddd } fdd}| j|d	d
id d S )Nc                 S   s   | | S r0   r*   r  r*   r*   r-   r   4  s    zBTestOverloadInlining.test_inline_always_kw_no_default.<locals>.foor%   r&   c                 S   s   dd S )Nc                 S   s   | | S r0   r*   r  r*   r*   r-   <lambda>9      z]TestOverloadInlining.test_inline_always_kw_no_default.<locals>.overload_foo.<locals>.<lambda>r*   r  r*   r*   r-   overload_foo7  s    zKTestOverloadInlining.test_inline_always_kw_no_default.<locals>.overload_fooc                      s    dddS )Nr   r  r   r*   r*   r   r*   r-   r   ;  s    zCTestOverloadInlining.test_inline_always_kw_no_default.<locals>.implr   Tr   r(  r=   r-  r   r*   r   r-    test_inline_always_kw_no_default2  s
    

z5TestOverloadInlining.test_inline_always_kw_no_defaultc                    s   dd }dd }dd |   \} t|d t|d ttjd	d
 fdd}ttjdd
 fdd}| j|| ddid | j|| ddid d S )Nc                 S   s   |  S r0   r*   r+   r*   r*   r-   impl_inlineB  s    zETestOverloadInlining.test_inline_operators_unary.<locals>.impl_inlinec                 S   s   | 
 S r0   r*   r+   r*   r*   r-   impl_noinlineE  s    zGTestOverloadInlining.test_inline_operators_unary.<locals>.impl_noinlinec                 S   s   dS NTr*   r+   r*   r*   r-   r+  H  r,  zBTestOverloadInlining.test_inline_operators_unary.<locals>.<lambda>__neg____pos__r%   r&   c                    s   t |  rS d S r0   r:   r+   r   Zdummy_unary_implr*   r-   overload_dummy_negM  s    
zLTestOverloadInlining.test_inline_operators_unary.<locals>.overload_dummy_negr5   c                    s   t |  rS d S r0   r5  r+   r6  r*   r-   overload_dummy_posR  s    
zLTestOverloadInlining.test_inline_operators_unary.<locals>.overload_dummy_posnegTr   posF)r   setattrr   operatorr9  r:  rp   )r=   r0  r1  rs   r7  r8  r*   r6  r-   test_inline_operators_unary@  s    z0TestOverloadInlining.test_inline_operators_unaryc                    s   dd }dd }|   \} dd t|d t|d ttjd	d
 fdd}ttjdd
 fdd}| j|| ddid | j|| ddid d S )Nc                 S   s   | dkS r(   r*   r+   r*   r*   r-   r0  \  s    zETestOverloadInlining.test_inline_operators_binop.<locals>.impl_inlinec                 S   s   | dkS r(   r*   r+   r*   r*   r-   r1  _  s    zGTestOverloadInlining.test_inline_operators_binop.<locals>.impl_noinlinec                 S   s   dS r2  r*   r  r*   r*   r-   r+  d  r,  zBTestOverloadInlining.test_inline_operators_binop.<locals>.<lambda>__eq____ne__r%   r&   c                    s   t |  rS d S r0   r5  r  r   Zdummy_binop_implr*   r-   overload_dummy_eqh  s    
zKTestOverloadInlining.test_inline_operators_binop.<locals>.overload_dummy_eqr5   c                    s   t |  rS d S r0   r5  r  r@  r*   r-   overload_dummy_nem  s    
zKTestOverloadInlining.test_inline_operators_binop.<locals>.overload_dummy_neeqTr   neF)r   r;  r   r<  rC  rD  rp   )r=   r0  r1  rs   rA  rB  r*   r@  r-   test_inline_operators_binopZ  s    z0TestOverloadInlining.test_inline_operators_binopc                    s   dd }dd }|   \} dd t|d t|d ttjd	d
 fdd}ttjdd
 fdd}ttjd	d
 fdd}ttjdd
 fdd}| j|| ddid | j|| ddid d S )Nc                 S   s   | d7 } d S r(   r*   r+   r*   r*   r-   r0  w  s    zMTestOverloadInlining.test_inline_operators_inplace_binop.<locals>.impl_inlinec                 S   s   | d8 } d S r(   r*   r+   r*   r*   r-   r1  z  s    zOTestOverloadInlining.test_inline_operators_inplace_binop.<locals>.impl_noinlinec                 S   s   dS r2  r*   r  r*   r*   r-   r+    r,  zJTestOverloadInlining.test_inline_operators_inplace_binop.<locals>.<lambda>__iadd____isub__r%   r&   c                    s   t |  rS d S r0   r5  r  r   Zdummy_inplace_binop_implr*   r-   overload_dummy_iadd  s    
zUTestOverloadInlining.test_inline_operators_inplace_binop.<locals>.overload_dummy_iaddr5   c                    s   t |  rS d S r0   r5  r  rH  r*   r-   overload_dummy_isub  s    
zUTestOverloadInlining.test_inline_operators_inplace_binop.<locals>.overload_dummy_isubc                    s   t |  rS d S r0   r5  r  rH  r*   r-   overload_dummy_add  s    
zTTestOverloadInlining.test_inline_operators_inplace_binop.<locals>.overload_dummy_addc                    s   t |  rS d S r0   r5  r  rH  r*   r-   overload_dummy_sub  s    
zTTestOverloadInlining.test_inline_operators_inplace_binop.<locals>.overload_dummy_subiaddTr   isubF)	r   r;  r   r<  rM  rN  addsubrp   )r=   r0  r1  rs   rI  rJ  rK  rL  r*   rH  r-   #test_inline_operators_inplace_binopu  s     z8TestOverloadInlining.test_inline_operators_inplace_binopc                    s~   dd }dd }|   \} dd t|d ttjdd	 fd
d}| j|| dddid | j|| ddid d S )Nc                 S   s   | | S r0   r*   r,   idxr*   r*   r-   r     s    zGTestOverloadInlining.test_inline_always_operators_getitem.<locals>.implc                 S   s   | d S r(   r*   r+   r*   r*   r-   impl_static_getitem  s    zVTestOverloadInlining.test_inline_always_operators_getitem.<locals>.impl_static_getitemc                 S   s   d S r0   r*   rz   rS  r*   r*   r-   r+    r,  zKTestOverloadInlining.test_inline_always_operators_getitem.<locals>.<lambda>__getitem__r%   r&   c                    s   t |  rS d S r0   r5  rU  r   Zdummy_getitem_implr*   r-   overload_dummy_getitem  s    
zYTestOverloadInlining.test_inline_always_operators_getitem.<locals>.overload_dummy_getitemr)   getitemTr   r   r;  r   r<  rY  rp   r=   r   rT  rs   rX  r*   rW  r-   $test_inline_always_operators_getitem  s    
z9TestOverloadInlining.test_inline_always_operators_getitemc                    s~   dd }dd }|   \} dd t|d ttjdd	 fd
d}| j|| dddid | j|| ddid d S )Nc                 S   s   | | S r0   r*   rR  r*   r*   r-   r     s    zFTestOverloadInlining.test_inline_never_operators_getitem.<locals>.implc                 S   s   | d S r(   r*   r+   r*   r*   r-   rT    s    zUTestOverloadInlining.test_inline_never_operators_getitem.<locals>.impl_static_getitemc                 S   s   d S r0   r*   rU  r*   r*   r-   r+    r,  zJTestOverloadInlining.test_inline_never_operators_getitem.<locals>.<lambda>rV  r5   r&   c                    s   t |  rS d S r0   r5  rU  rW  r*   r-   rX    s    
zXTestOverloadInlining.test_inline_never_operators_getitem.<locals>.overload_dummy_getitemr)   rY  Fr   rZ  r[  r*   rW  r-   #test_inline_never_operators_getitem  s    
z8TestOverloadInlining.test_inline_never_operators_getitemc              	      sf   dd  t  dddd } fdd}| t}| j|d	d
id W 5 Q R X | dt|j d S )Nc                 W   s   | |d  S Nr   r*   r  r*   r*   r-   r     s    z;TestOverloadInlining.test_inline_stararg_error.<locals>.foor%   r&   c                 W   s   dd S )Nc                 W   s   | |d  S r^  r*   r  r*   r*   r-   r+    r,  zVTestOverloadInlining.test_inline_stararg_error.<locals>.overload_foo.<locals>.<lambda>r*   r  r*   r*   r-   r-    s    zDTestOverloadInlining.test_inline_stararg_error.<locals>.overload_fooc                      s    dddS )Nr   r   r*   r*   r   r*   r-   r     s    z<TestOverloadInlining.test_inline_stararg_error.<locals>.implr   Tr   z-Stararg not supported in inliner for arg 1 *b)r   assertRaisesNotImplementedErrorrp   assertInrQ   	exception)r=   r-  r   r   r*   r   r-   test_inline_stararg_error  s    

z.TestOverloadInlining.test_inline_stararg_errorc           
         s    fdd}d}t |||D ]\}}}dd dd  dd	 t|d
dd }t |d
dd }t|d
dd }| j| | j| | j| d}	| j||	d q d S )Nc                     s    }   } }| ||fS r0   r*   r   r   r*   r-   r     s    z;TestOverloadInlining.test_basic_inline_combos.<locals>.implr4   c                   S   s   d S r0   r*   r*   r*   r*   r-   r     s    z:TestOverloadInlining.test_basic_inline_combos.<locals>.fooc                   S   s   d S r0   r*   r*   r*   r*   r-   r     s    z:TestOverloadInlining.test_basic_inline_combos.<locals>.barc                   S   s   d S r0   r*   r*   r*   r*   r-   r     s    z:TestOverloadInlining.test_basic_inline_combos.<locals>.bazr&   c                  S   s   dd } | S )Nc                   S   s   d S r0   r*   r*   r*   r*   r-   r     s    zQTestOverloadInlining.test_basic_inline_combos.<locals>.foo_overload.<locals>.implr*   r*  r*   r*   r-   r'    s    zCTestOverloadInlining.test_basic_inline_combos.<locals>.foo_overloadc                  S   s   dd } | S )Nc                   S   s   d S r0   r*   r*   r*   r*   r-   r     s    zQTestOverloadInlining.test_basic_inline_combos.<locals>.bar_overload.<locals>.implr*   r*  r*   r*   r-   bar_overload  s    zCTestOverloadInlining.test_basic_inline_combos.<locals>.bar_overloadc                  S   s   dd } | S )Nc                   S   s   d S r0   r*   r*   r*   r*   r-   r      s    zQTestOverloadInlining.test_basic_inline_combos.<locals>.baz_overload.<locals>.implr*   r*  r*   r*   r-   baz_overload  s    zCTestOverloadInlining.test_basic_inline_combos.<locals>.baz_overloadr   r   )r   r   r   rp   )
r=   r   r   r   r   r   r'  rd  re  rB   r*   r   r-   r     s"    





z-TestOverloadInlining.test_basic_inline_combosc                    s    fdd}d}t |||D ]\}}}dd dd  dd	 dd
d}|dd|d | dd|d |dd|d | j| | j| | j| d}| j||d q d S )Nc                     s    }   } }| ||fS r0   r*   r   r   r*   r-   r     s    z8TestOverloadInlining.test_freevar_bindings.<locals>.implr4   c                  S   s   d} d}| d }| |d |fS )Nr   r   r   r   r*   r   r*   r*   r-   r     s    z7TestOverloadInlining.test_freevar_bindings.<locals>.fooc                  S   s   d} d}| d }| |d |fS )Nr   r   r   r   r*   r   r*   r*   r-   r     s    z7TestOverloadInlining.test_freevar_bindings.<locals>.barc                  S   s   d} d}| d }| |d |fS )Nr   rF   r   r   r*   r   r*   r*   r-   r   #  s    z7TestOverloadInlining.test_freevar_bindings.<locals>.bazc                    s(    d t | |d fdd}d S )Nr   r&   c                     s    fdd} | S )Nc                      s    d fS r   r*   r*   r   r*   r-   r   .  s    zWTestOverloadInlining.test_freevar_bindings.<locals>.factory.<locals>.func.<locals>.implr*   r*  r   r*   r-   r`   ,  s    zITestOverloadInlining.test_freevar_bindings.<locals>.factory.<locals>.func)r   )r  r,   r   r'   r`   r*   r   r-   r   )  s    
z;TestOverloadInlining.test_freevar_bindings.<locals>.factoryr   r   r&   r   r   r   rF   r   r   )Nr   )r=   r   r   r   r   r   r   rB   r*   r   r-   r   	  s    
	z*TestOverloadInlining.test_freevar_bindingsc                 C   s   dd }| j |ddid d S )Nc                  S   s   d} t | S r   r1   r   r*   r*   r-   r   >  s    z?TestOverloadInlining.test_global_overload_binding.<locals>.implr/   Tr   r   r   r*   r*   r-   test_global_overload_binding<  s    z1TestOverloadInlining.test_global_overload_bindingc                    s.   ddl m   fdd}| j|ddid d S )Nr)   r   c                     s   t d }   | fS r   r   r   r   r*   r-   r   H  s    zBTestOverloadInlining.test_inline_from_another_module.<locals>.implr   Tr   )r   r   rp   r   r*   r   r-   r   D  s    z4TestOverloadInlining.test_inline_from_another_modulec                    s4   dd l m  m   fdd}| j|ddid d S )Nr   c                     s   t d }   | fS r   )r   r   r   r   r*   r-   r   R  s    zLTestOverloadInlining.test_inline_from_another_module_w_getattr.<locals>.implr   Tr   r   r   r*   r   r-   r   N  s    z>TestOverloadInlining.test_inline_from_another_module_w_getattrc                    s6   dd l }dd lm   fdd}| j|ddid d S )Nr   c                     s   t d }  j | fS r   )r   r   r   r   r   r*   r-   r   ]  s    zNTestOverloadInlining.test_inline_from_another_module_w_2_getattr.<locals>.implr   Tr   r   r   r*   r   r-   r   X  s    z@TestOverloadInlining.test_inline_from_another_module_w_2_getattrc                    s0   dd }|   fdd}| j |ddid d S )Nc                     s&   ddl m  tdd fdd} | S )Nr)   r   r%   r&   c                      s     S r0   r*   r*   r   r*   r-   r   h  s    z]TestOverloadInlining.test_inline_from_another_module_as_freevar.<locals>.factory.<locals>.tmp)r   r   r   r   r*   r   r-   r   e  s    zPTestOverloadInlining.test_inline_from_another_module_as_freevar.<locals>.factoryc                     s   t d }   | fS r   r   r   Zbopr*   r-   r   o  s    zMTestOverloadInlining.test_inline_from_another_module_as_freevar.<locals>.implr   Tr   r   r   r*   rg  r-   r   c  s    z?TestOverloadInlining.test_inline_from_another_module_as_freevarc                    s8   ddl m   fdd}|dd}| j|ddid	 d S )
Nr)   bop_factoryc                    s     fdd}|S )Nc                     s   t    }  |  fS r0   r   r   r   r*   r-   r   |  s    zYTestOverloadInlining.test_inline_w_freevar_from_another_module.<locals>.gen.<locals>.implr*   r   rh  r   r-   r   y  s    zKTestOverloadInlining.test_inline_w_freevar_from_another_module.<locals>.genr   r   r   Tr   )r   ri  rp   r   r*   rh  r-   r   u  s    
z>TestOverloadInlining.test_inline_w_freevar_from_another_modulec                    s   fdd}fdd}dD ]R\fddt |dfd	d
}fdd}j|dddkid qdD ]R\fdd t  |dfdd} fdd}j|dddkid qtd S )Nc                    s(     | tj  | jd  |jS r   r   r   r   rS   rL   rA   r>   r   r   r*   r-   r     s    zCTestOverloadInlining.test_inlining_models.<locals>.s17_caller_modelc                    s(     | tj  | jd  |jS r   rj  r   r   r*   r-   r     s    zCTestOverloadInlining.test_inlining_models.<locals>.s17_callee_model))r   r   r   c                      s    S r0   r*   r*   r   r*   r-   r     s    z6TestOverloadInlining.test_inlining_models.<locals>.foor&   c                     s    fdd} | S )Nc                      s    S r0   r*   r*   r   r*   r-   r     s    zGTestOverloadInlining.test_inlining_models.<locals>.foo_ol.<locals>.implr*   r*  r   r*   r-   foo_ol  s    z9TestOverloadInlining.test_inlining_models.<locals>.foo_olc                    s   |   } }|d |fS r   r*   r   r   r*   r-   r     s    z7TestOverloadInlining.test_inlining_models.<locals>.implr   r   r6   r   )r   )r   r   c                      s    S r0   r*   r*   r   r*   r-   r     s    z6TestOverloadInlining.test_inlining_models.<locals>.barc                     s    fdd} | S )Nc                      s    S r0   r*   r*   r   r*   r-   r     s    zGTestOverloadInlining.test_inlining_models.<locals>.bar_ol.<locals>.implr*   r*  r   r*   r-   bar_ol  s    z9TestOverloadInlining.test_inlining_models.<locals>.bar_olc                    s   |  }  }|d |fS r   r*   r   r   r*   r-   r     s    r   r(  )r=   r   r   rk  r   rl  r*   r   r-   r     s    

z)TestOverloadInlining.test_inlining_modelsc                    s   dd  t  dddd }t  dddd	 }d
d }t  |ddd } fdd}| j|ddidd}tt|j d }dd |jddD }| t|dk dd |	t
jD }	|	D ]}
| |
jd qd S )Nc                 S   s$   t t| tjr| d S | d S d S )Nr   r)   )r:   r   r   Floatr+   r*   r*   r-   r     s    z_TestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.barr%   r&   c                 S   s   t | tjrdd }|S d S )Nc                 S   s   | d S r(   r*   r+   r*   r*   r-   r     s    ztTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.bar_int_ol.<locals>.implr:   r   ZIntegerr,   r   r*   r*   r-   
bar_int_ol  s    zfTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.bar_int_olr5   c                 S   s   t | tjrdd }|S d S )Nc                 S   s   | d S )Nr   r*   r+   r*   r*   r-   r     s    zvTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.bar_float_ol.<locals>.impl)r:   r   rm  ro  r*   r*   r-   bar_float_ol  s    zhTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.bar_float_olc                  W   s   dS r2  r*   rf   r*   r*   r-   always_inline_cost_model  s    ztTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.always_inline_cost_modelc                 S   s   t | tjrdd }|S d S )Nc                 S   s   | d S r(   r*   r+   r*   r*   r-   r     s    zxTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.bar_complex_ol.<locals>.impl)r:   r   Complexro  r*   r*   r-   bar_complex_ol  s    zjTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.bar_complex_olc                     s$    d}  d} d}| | | S )Nr)   gffffff@y              @r*   r   r   ru   r   r*   r-   r     s    z`TestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.implr   Fr)   r  c                 S   s   g | ]}|qS r*   r*   rI   r*   r*   r-   rK     s     zfTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristics.<locals>.<listcomp>rM   )rL   c                 S   s&   g | ]}t t|d dtjr|jqS )r<   N)r:   r_   r   r  r<   rI   r*   r*   r-   rK     s    r   )r   rp   r\   r]   r7   rP   r^   
assertTruer[   Z
find_instsr   r;   ZassertNotEqualr<   )r=   rp  rq  rs  ru  r   rk   rl   callsZconstsrt   r*   r   r-   =test_multiple_overloads_with_different_inline_characteristics  s     





zRTestOverloadInlining.test_multiple_overloads_with_different_inline_characteristicsc                    sx   dd }dd  t  dd|  fdd}d	}| j||d
did dd  t  dd| d}| j||d
did d S )Nc                 S   sH   t | tjsdd }|S | jdkr.dd }|S | jdkrDdd }|S d S )	Nc                 S   s   t | S r0   )r   r   r*   r*   r-   foo_noop  s    znTestOverloadInlining.test_overload_inline_always_with_literally_in_inlinee.<locals>.foo_ovld.<locals>.foo_nooprQ   c                 S   s   dS Nr   r*   r   r*   r*   r-   foo_as_str_impl  s    zuTestOverloadInlining.test_overload_inline_always_with_literally_in_inlinee.<locals>.foo_ovld.<locals>.foo_as_str_impl)int64Zfloat64c                 S   s   dS Nr   r*   r   r*   r*   r-   foo_as_num_impl  s    zuTestOverloadInlining.test_overload_inline_always_with_literally_in_inlinee.<locals>.foo_ovld.<locals>.foo_as_num_impl)r:   r   ZStringLiteralZliteral_value)r   rz  r|  r  r*   r*   r-   foo_ovld  s    

z\TestOverloadInlining.test_overload_inline_always_with_literally_in_inlinee.<locals>.foo_ovldc                 S   s   dS r{  r*   r   r*   r*   r-   r     s    zWTestOverloadInlining.test_overload_inline_always_with_literally_in_inlinee.<locals>.foor%   r&   c                    s    | S r0   r*   r   r   r*   r-   re     s    z]TestOverloadInlining.test_overload_inline_always_with_literally_in_inlinee.<locals>.test_implrQ   r   Tr   c                 S   s   dS r~  r*   r   r*   r*   r-   r     s    r}  r(  )r=   r  re   r   r*   r   r-   5test_overload_inline_always_with_literally_in_inlinee  s    zJTestOverloadInlining.test_overload_inline_always_with_literally_in_inlineec                    sH   d dd t dd fdd}fdd	}| j|d
ddid d S )NTc                 S   s   dS r2  r*   Ar*   r*   r-   r     s    z8TestOverloadInlining.test_inline_always_ssa.<locals>.foor%   r&   c                    s    fdd}|S )Nc                    s6    }t t| D ] } }| | r(| | }||9 }q|S r0   )r   r[   )r  r   r   dummy
dummy_truer*   r-   r   #  s    
zOTestOverloadInlining.test_inline_always_ssa.<locals>.foo_overload.<locals>.implr*   )r  r   r  r*   r-   r'     s    zATestOverloadInlining.test_inline_always_ssa.<locals>.foo_overloadc                      s    t dddgS )NTF)r   arrayr*   r   r*   r-   r   -  s    z9TestOverloadInlining.test_inline_always_ssa.<locals>.implrH   r   rC   rB   r(  r)  r*   )r  r   r-   test_inline_always_ssa  s    
z+TestOverloadInlining.test_inline_always_ssac              	      s   dd  t  dd fdd}t fdd}tjd	d
,}tdtj t  | | |	  W 5 Q R X | t
|d d S )Nc                  S   s   d} | dkr| d } qdS )Nr   r)   r   r   r*   r   r*   r*   r-   r   5  s    
zGTestOverloadInlining.test_inline_always_ssa_scope_validity.<locals>.barr%   r&   c                      s    S r0   r*   r*   r   r*   r-   bar_impl<  s    zLTestOverloadInlining.test_inline_always_ssa_scope_validity.<locals>.bar_implc                      s
      d S r0   r*   r*   r   r*   r-   r   @  s    zGTestOverloadInlining.test_inline_always_ssa_scope_validity.<locals>.fooT)recordr   )r   r   warningscatch_warningssimplefilterr   ZNumbaIRAssumptionWarningr$   rS   Zpy_funcr[   )r=   r  r   wr*   r   r-   %test_inline_always_ssa_scope_validity2  s    
z:TestOverloadInlining.test_inline_always_ssa_scope_validityN)rc   rq   rr   r   r   r/  r=  rE  rQ  r\  r]  rc  r   r   rf  r   r   r   r   r   r   ry  r  r  r  r*   r*   r*   r-   r%    s,   ',3

28*r%  c                       s   e Zd Z fddZdddZdddZdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Z  ZS ) TestOverloadMethsAttrsInliningc                    s   |    tt|   d S r0   )r   superr  setUpr   	__class__r*   r-   r  O  s    z$TestOverloadMethsAttrsInlining.setUpTc                 C   s   t td|}| || | |j|jd  jd }|j|_| t|j| |r||j D ]}t	|
d}	| |	 q\n0g }
|j D ]}|
t	|
d7 }
q| |
 d S )NrD   r   rE   rM   r   r"   rS   rT   rU   rV   r7   r[   r8   listr^   rd   rw  )r=   re   rf   expectedrC   expects_inlinedrj   rk   rl   rx  Zallcallsr*   r*   r-   check_methodS  s    z+TestOverloadMethsAttrsInlining.check_methodc                 C   s   t td|}| || | |j|jd  jd }|j|_| t|j| |r||j D ]}t	|
d}	| |	 q\n0g }
|j D ]}|
t	|
d7 }
q| |
 d S )NrD   r   rE   r_   r  )r=   re   rf   r  rC   r  rj   rk   rl   ZgetattrsZallgetattrsr*   r*   r-   check_getattri  s    z,TestOverloadMethsAttrsInlining.check_getattrc                 C   sF   |   \}}t|dddddd}dd }| j|| gdd	d
 d S )Ninline_methodr%   r&   c                 S   s   ddd}|S )Nc                 S   s
   d||fS )NTHIS IS INLINEDr*   )rz   rt   val2r*   r*   r-   get  s    zqTestOverloadMethsAttrsInlining.test_overload_method_default_args_always.<locals>._get_inlined_method.<locals>.get)NNr*   )rz   rt   r  r  r*   r*   r-   _get_inlined_method  s    
zdTestOverloadMethsAttrsInlining.test_overload_method_default_args_always.<locals>._get_inlined_methodc                 S   s   |  d| j ddfS )Nr   A  )r  r  rz   r*   r*   r-   r     s    zTTestOverloadMethsAttrsInlining.test_overload_method_default_args_always.<locals>.foo))r  r   N)r  Nr  r)   )re   rf   r  rC   )NNr   r   r  )r=   rs   r   r  r   r*   r*   r-   (test_overload_method_default_args_always  s    zGTestOverloadMethsAttrsInlining.test_overload_method_default_args_alwaysc                    sR    fdd}|   \}}t|d|ddd }dd }| j|| gd	d
 d d S )Nc                     s    S r0   r*   rr  should_inliner*   r-   	costmodel  s    zKTestOverloadMethsAttrsInlining.make_overload_method_test.<locals>.costmodelr  r&   c                 S   s   dd }|S )Nc                 S   s   d|fS )NTHIS IS INLINED!!!r*   )rz   rt   r*   r*   r-   r    s    zbTestOverloadMethsAttrsInlining.make_overload_method_test.<locals>._get_inlined_method.<locals>.getr*   )rz   rt   r  r*   r*   r-   r    s    zUTestOverloadMethsAttrsInlining.make_overload_method_test.<locals>._get_inlined_methodc                 S   s
   |  dS Nr   r  r  r*   r*   r-   r     s    zETestOverloadMethsAttrsInlining.make_overload_method_test.<locals>.foo)r  r   r)   re   rf   r  rC   r  r  )r=   r  r  rs   r   r  r   r*   r  r-   make_overload_method_test  s    
z8TestOverloadMethsAttrsInlining.make_overload_method_testc                 C   s   | j ddd d S Nr%   Tr  r  r  r   r*   r*   r-   'test_overload_method_cost_driven_always  s    zFTestOverloadMethsAttrsInlining.test_overload_method_cost_driven_alwaysc                 C   s   | j ddd d S Nr5   Fr  r  r   r*   r*   r-   &test_overload_method_cost_driven_never  s    zETestOverloadMethsAttrsInlining.test_overload_method_cost_driven_neverc                 C   s   | j dd dd d S )Nc                  W   s   dS r2  r*   rr  r*   r*   r-   r+    r,  z]TestOverloadMethsAttrsInlining.test_overload_method_cost_driven_must_inline.<locals>.<lambda>Tr  r  r   r*   r*   r-   ,test_overload_method_cost_driven_must_inline  s    zKTestOverloadMethsAttrsInlining.test_overload_method_cost_driven_must_inlinec                 C   s   | j dd dd d S )Nc                  W   s   dS NFr*   rr  r*   r*   r-   r+    r,  z[TestOverloadMethsAttrsInlining.test_overload_method_cost_driven_no_inline.<locals>.<lambda>Fr  r  r   r*   r*   r-   *test_overload_method_cost_driven_no_inline  s    zITestOverloadMethsAttrsInlining.test_overload_method_cost_driven_no_inlinec                 C   sF   |   \}}t|d|ddd }dd }| j|| gdd|d	 d S )
Ninlinemer&   c                 S   s   dd }|S )Nc                 S   s   dS )NMY INLINED ATTRSr*   r  r*   r*   r-   r    s    z_TestOverloadMethsAttrsInlining.make_overload_attribute_test.<locals>._get_inlineme.<locals>.getr*   )rz   r  r*   r*   r-   _get_inlineme  s    zRTestOverloadMethsAttrsInlining.make_overload_attribute_test.<locals>._get_inlinemec                 S   s   | j S r0   )r  r  r*   r*   r-   r     s    zHTestOverloadMethsAttrsInlining.make_overload_attribute_test.<locals>.foor  r)   r  )r   r   r  )r=   r  r  rs   r   r  r   r*   r*   r-   make_overload_attribute_test  s    
z;TestOverloadMethsAttrsInlining.make_overload_attribute_testc                 C   s   | j ddd d S r  r  r   r*   r*   r-   test_overload_attribute_always  s    z=TestOverloadMethsAttrsInlining.test_overload_attribute_alwaysc                 C   s   | j ddd d S r  r  r   r*   r*   r-   test_overload_attribute_never  s    z<TestOverloadMethsAttrsInlining.test_overload_attribute_neverc                 C   s   | j dd dd d S )Nc                  W   s   dS r2  r*   rr  r*   r*   r-   r+    r,  z^TestOverloadMethsAttrsInlining.test_overload_attribute_costmodel_must_inline.<locals>.<lambda>Tr  r  r   r*   r*   r-   -test_overload_attribute_costmodel_must_inline  s    zLTestOverloadMethsAttrsInlining.test_overload_attribute_costmodel_must_inlinec                 C   s   | j dd dd d S )Nc                  W   s   dS r  r*   rr  r*   r*   r-   r+    r,  z\TestOverloadMethsAttrsInlining.test_overload_attribute_costmodel_no_inline.<locals>.<lambda>Fr  r  r   r*   r*   r-   +test_overload_attribute_costmodel_no_inline  s    zJTestOverloadMethsAttrsInlining.test_overload_attribute_costmodel_no_inline)T)T)rc   rq   rr   r  r  r  r  r  r  r  r  r  r  r  r  r  r  __classcell__r*   r*   r  r-   r  N  s     
 
r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestGeneralInliningc                 C   s2   t tdddd }dd }| j|ddid	 d S )
Nr%   r&   c                 S   s   d S r0   r*   r  r*   r*   r-   overload_len  s    zSTestGeneralInlining.test_with_inlined_and_noninlined_variants.<locals>.overload_lenc                   S   s   t dddgS )Nr   r   r  )r[   r*   r*   r*   r-   r     s    zKTestGeneralInlining.test_with_inlined_and_noninlined_variants.<locals>.implr[   Fr   )r   r[   rp   )r=   r  r   r*   r*   r-   )test_with_inlined_and_noninlined_variants  s    

z=TestGeneralInlining.test_with_inlined_and_noninlined_variantsc                    sB   ddd t  ddddd} fd	d
}| j|ddid d S )Nr   r   c                 S   s   | | | S r0   r*   rv  r*   r*   r-   r     s    z1TestGeneralInlining.test_with_kwargs.<locals>.foor%   r&   c                 S   s   ddd}|S )Nr   r   c                 S   s   | | | S r0   r*   rv  r*   r*   r-   r     s    zHTestGeneralInlining.test_with_kwargs.<locals>.overload_foo.<locals>.impl)r   r   r*   )r   r   ru   r   r*   r*   r-   r-    s    
z:TestGeneralInlining.test_with_kwargs.<locals>.overload_fooc                      s    dddS )Nr   r   ru   r*   r*   r   r*   r-   r     s    z2TestGeneralInlining.test_with_kwargs.<locals>.implr   Tr   )r   r   )r   r   r(  r.  r*   r   r-   test_with_kwargs  s
    

z$TestGeneralInlining.test_with_kwargsc                    s<   t ddddd d fd	d
	}| j|ddddid d S )Nr%   r&   r   r  c                 S   s   | | S r0   r*   rv  r*   r*   r-   r     s    z2TestGeneralInlining.test_with_kwargs2.<locals>.barr  r   c                    s    | | ddS )Nr   r  r*   rv  r   r*   r-   r     s    z3TestGeneralInlining.test_with_kwargs2.<locals>.implr   r  r   Tr   )r   r  )r  r   r   r   r*   r   r-   test_with_kwargs2  s    z%TestGeneralInlining.test_with_kwargs2c                    s8   t ddddd  fdd}| j|ddd	id
 d S )Nr%   r&   c                 S   s   |d krd}| |fS r  r*   r  r*   r*   r-   r     s    z@TestGeneralInlining.test_inlining_optional_constant.<locals>.barc                      s      d ddfS )Nr   r  r   r*   r*   r   r*   r-   r   %  s    zATestGeneralInlining.test_inlining_optional_constant.<locals>.implrH   r   Tr  )NNr   r   r*   r   r-   test_inlining_optional_constant  s    z3TestGeneralInlining.test_inlining_optional_constantN)rc   rq   rr   r  r  r  r  r*   r*   r*   r-   r    s   r  c                   @   s   e Zd Zdd ZdS )TestInlineOptionsc                 C   s   t d}| |j | |j | |j | |jd t d}| |j | |j | |j | |jd dd }t |}| |j | |j | |j | |j| d S )Nr%   r5   c                 S   s   | S r0   r*   r+   r*   r*   r-   
cost_model:  s    z0TestInlineOptions.test_basic.<locals>.cost_model)	r   rw  Zis_always_inlinerd   Zis_never_inlineZhas_cost_modelrS   r<   ZassertIs)r=   r%   r5   r  modelr*   r*   r-   
test_basic-  s     zTestInlineOptions.test_basicN)rc   rq   rr   r  r*   r*   r*   r-   r  +  s   r  c                   @   s@   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zedd Z	dS )TestInlineMiscIssuesc                    sd   dd  t  dddd }tdd fd	d
}tdddd }|td |td d S )Nc                 S   s   d S r0   r*   )r  r   r*   r*   r-   output_factoryF  s    z;TestInlineMiscIssues.test_issue4691.<locals>.output_factoryr%   r&   c                 S   s   t | tjjrdd }|S d S )Nc                 S   s   | j dd  }tj||dS Nr   r   )shaper   r   )r  r   r  r*   r*   r-   r   L  s    zLTestInlineMiscIssues.test_issue4691.<locals>.ol_output_factory.<locals>.impl)r:   r   ZnpytypesArray)r  r   r   r*   r*   r-   ol_output_factoryI  s    z>TestInlineMiscIssues.test_issue4691.<locals>.ol_output_factoryT)Znogilc                    s    | | j }|S r0   r   )r  outr  r*   r-   rb   R  s    z/TestInlineMiscIssues.test_issue4691.<locals>.fnc                 S   s   t j| jdd  | jdS r  )r   r   r  r   r  r*   r*   r-   fn2W  s    z0TestInlineMiscIssues.test_issue4691.<locals>.fn2)r   r   r   r   r   )r   r   r   ones)r=   r  rb   r  r*   r  r-   test_issue4691E  s    


z#TestInlineMiscIssues.test_issue4691c                    s4   t dddd  t  fdd}|td d S )Nr%   r&   c                 S   s   | j dkrtd| S )Nr)   zInvalid number of dimensions)ndim
ValueErrorr  r*   r*   r-   inlining`  s    
z5TestInlineMiscIssues.test_issue4693.<locals>.inliningc                    s    | S r0   r*   r  r  r*   r-   rb   g  s    z/TestInlineMiscIssues.test_issue4693.<locals>.fnr   )r   r   r   )r=   rb   r*   r  r-   test_issue4693^  s
    
z#TestInlineMiscIssues.test_issue4693c              	      sT   t dddd  t  fdd}| t}|  W 5 Q R X | dt|j d S )Nr%   r&   c                  S   s   d} t | d S )NSomething happened)r  )msgr*   r*   r-   r  p  s    z5TestInlineMiscIssues.test_issue5476.<locals>.inliningc                      s     S r0   r*   r*   r  r*   r-   rb   u  s    z/TestInlineMiscIssues.test_issue5476.<locals>.fnr  )r   r_  r  ra  rQ   rb  )r=   rb   Zraisesr*   r  r-   test_issue5476m  s    
z#TestInlineMiscIssues.test_issue5476c                    s   G fddd G dd dt jtG dd dtj}tdd tfd	d
t ddfdd}tddddd }t	 fdd}dd}||}| 
||  d S )Nc                       s    e Zd Zdd Z fddZdS )z2TestInlineMiscIssues.test_issue5792.<locals>.Dummyc                 S   s
   || _ d S r0   datar=   r  r*   r*   r-   __init__  s    z;TestInlineMiscIssues.test_issue5792.<locals>.Dummy.__init__c                    s
    |j  S r0   r  r=   otherr  r*   r-   div  s    z6TestInlineMiscIssues.test_issue5792.<locals>.Dummy.divN)rc   rq   rr   r  r  r*   r  r*   r-   rs     s   rs   c                       s   e Zd Z fddZ  ZS )z6TestInlineMiscIssues.test_issue5792.<locals>.DummyTypec                    s"   || _ t jd| j  dd d S )NzDummy())ra   r  r  r  r  r  r*   r-   r    s    z?TestInlineMiscIssues.test_issue5792.<locals>.DummyType.__init__rc   rq   rr   r  r  r*   r*   r  r-   r     s   r   c                       s   e Zd Z fddZ  ZS )z;TestInlineMiscIssues.test_issue5792.<locals>.DummyTypeModelc                    s    d|j fg}t ||| d S )Nr  r  )r=   ZdmmZfe_typemembersr  r*   r-   r    s    zDTestInlineMiscIssues.test_issue5792.<locals>.DummyTypeModel.__init__r  r*   r*   r  r-   DummyTypeModel  s   r  r  _datac                    s"   dd } |}t ||}||fS )Nc                 S   sF   |j }|\}t|| |}||_| jr>| j||jd | | S r^  )	return_typer
   Zcreate_struct_proxyr  Z
enable_nrtZnrtZincrefrf   Z	_getvalue)rx   Zbuildersigrf   ry   r  r  r*   r*   r-   codegen  s    zHTestInlineMiscIssues.test_issue5792.<locals>.init_dummy.<locals>.codegenr   )Z	typingctxr  r  Zret_typr  )r   r*   r-   
init_dummy  s    
z7TestInlineMiscIssues.test_issue5792.<locals>.init_dummyr%   r&   c                    s    fdd}|S )Nc                    s    | S r0   r*   r  r  r*   r-   ctor  s    zITestInlineMiscIssues.test_issue5792.<locals>.dummy_overload.<locals>.ctorr*   )r  r  r  r*   r-   dummy_overload  s    z;TestInlineMiscIssues.test_issue5792.<locals>.dummy_overloadr  c                 S   s   dd }|S )Nc                 S   s   | j |j  S r0   )r  r  r*   r*   r-   r     s    zGTestInlineMiscIssues.test_issue5792.<locals>.div_overload.<locals>.implr*   )r=   r  r   r*   r*   r-   div_overload  s    z9TestInlineMiscIssues.test_issue5792.<locals>.div_overloadc                    s    | } |}| |S r0   )r  )r  
other_datar  r  )rs   r*   r-   re     s    z6TestInlineMiscIssues.test_issue5792.<locals>.test_implg      ?r  )r   Typer   r   ZStructModelr   r   r   r   r   rS   )r=   r  r  r  re   r  resr*   )rs   r   r  r  r-   test_issue5792~  s"    


z#TestInlineMiscIssues.test_issue5792c                    sV   G dd dt }dd  t dddd }t|d	 fd
d}| |dd dS )z] Similar to the above test_issue5792, checks mutation of the inlinee
        IR is local onlyc                   @   s   e Zd Zdd ZdS )z;TestInlineMiscIssues.test_issue5824.<locals>.CustomCompilerc                 S   s&   t | j}|tt |  |gS r0   )r   Zdefine_nopython_pipelinestateZadd_pass_afterr   finalize)r=   Zpmr*   r*   r-   define_pipelines  s    zLTestInlineMiscIssues.test_issue5824.<locals>.CustomCompiler.define_pipelinesN)rc   rq   rr   r  r*   r*   r*   r-   CustomCompiler  s   r  c                 S   s   d S r0   r*   r+   r*   r*   r-   r     s    z0TestInlineMiscIssues.test_issue5824.<locals>.barr%   r&   c                 S   s   t | tjrdd }|S d S )Nc                 S   s   | d S )Ng?r*   r+   r*   r*   r-   r     s    zATestInlineMiscIssues.test_issue5824.<locals>.ol_bar.<locals>.implrn  ro  r*   r*   r-   ol_bar  s    z3TestInlineMiscIssues.test_issue5824.<locals>.ol_barrD   c                    s    |  | fS r0   r*   r   r   r*   r-   r     s    z0TestInlineMiscIssues.test_issue5824.<locals>.foor   )皙&@r  N)r   r   r   rS   )r=   r  r  r   r*   r   r-   test_issue5824  s    	

z#TestInlineMiscIssues.test_issue5824c              	      s   t dddd  t dd fdd}td	}|| | |d
t|  t dddd }| tj}|| W 5 Q R X | dt	|j
 d S )Nr%   r&   c                 S   s$   t | jD ]}| |  d7  < q
d S r(   )r   size)r,   r   r*   r*   r-   r     s    z0TestInlineMiscIssues.test_issue7380.<locals>.barT)parallelc                    s$   t | jd D ]} | |  qd S r^  )r   r  )r   r   r   r*   r-   r     s    z0TestInlineMiscIssues.test_issue7380.<locals>.foo)r   r   r   c                 S   s@   t | jd D ],}| | }t|jD ]}||  d7  < q$qd S )Nr   r)   )r   r  r   r  )r   r   r,   r*   r*   r-   foo_bad  s    z4TestInlineMiscIssues.test_issue7380.<locals>.foo_badz Overwrite of parallel loop index)r   r   r  ZassertPreciseEqualZ	ones_liker_  r   ZUnsupportedRewriteErrorra  rQ   rb  )r=   r   r   r  r   r*   r   r-   test_issue7380  s    	


z#TestInlineMiscIssues.test_issue7380N)
rc   rq   rr   r  r  r  r  r  r#   r  r*   r*   r*   r-   r  C  s   Fr  __main__)A__doc__r<  r  	itertoolsr   Znumpyr   r   r   r   r   r   Z
numba.corer   r   r	   r
   r   Znumba.core.extendingr   r   r   r   r   r   r   r   r   r   r   Znumba.core.datamodel.modelsr   Znumba.core.cpur   Znumba.core.compilerr   r   Znumba.core.typed_passesr   Znumba.core.typingr   Znumba.tests.supportr   r   r    r!   r"   r#   r$   r   r.   r/   r2   r3   r   r   r   r#  r%  r  r  r  r  rc   mainr*   r*   r*   r-   <module>   sN   4$


W&  L    A "< E
