a
    .;b=                     @   s  d Z ddlZddlZddlmZmZmZmZm	Z	 ddl
mZ ddlm  m  mZ ddlmZ ddlmZ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" dd
l#m$Z$ ddl%m&Z' ddl(m)Z)m*Z*m+Z+m,Z, ddl-Z-g dZ.ej/0eeZ1G dd de-j2Z3G dd de-j2Z4G dd de-j2Z5G dd de-j2Z6G dd de-j2Z7G dd de+e-j2Z8G dd de+e-j2Z9e:dkre-;  dS )z"
Unspecified error handling tests
    N)jitnjittypedint64types)errors)	structref)overload	intrinsicoverload_methodoverload_attribute)CompilerBase)TranslateByteCode	FixupArgsIRProcessing)NopythonTypeInferenceDeadCodeEliminationNoPythonBackendNativeLowering)PassManager)_err_reasons)skip_parfors_unsupportedoverride_configSerialMixinskip_unless_scipy)            c                   @   s   e Zd Zdd ZdS )TestErrorHandlingBeforeLoweringc              	   C   sh   dd }t tfD ]R}| tj}||d W d    n1 sB0    Y  d}| |t|j qd S )Nc                    s   | d   fdd}|S )z return the closure r   c                    s   |   S N xzr!   =lib/python3.9/site-packages/numba/tests/test_errorhandling.pyinner&   s    zmTestErrorHandlingBeforeLowering.test_unsupported_make_function_return_inner_func.<locals>.func.<locals>.innerr!   )r#   r'   r!   r$   r&   func"   s    z^TestErrorHandlingBeforeLowering.test_unsupported_make_function_return_inner_func.<locals>.funcr   z%Cannot capture the non-constant value)r   r   assertRaisesr   TypingErrorassertInstr	exception)selfr(   Zpipelineraisesexpectedr!   r!   r&   0test_unsupported_make_function_return_inner_func!   s    *zPTestErrorHandlingBeforeLowering.test_unsupported_make_function_return_inner_funcN)__name__
__module____qualname__r1   r!   r!   r!   r&   r      s   r   c                   @   s   e Zd Zdd ZdS )TestUnsupportedReportingc                 C   sX   t dd }| tj}|  W d    n1 s40    Y  d}| |t|j d S )Nc                   S   s   t g d d S )N)r   r   r   )npZ
asanyarrayr!   r!   r!   r&   r(   6   s    zFTestUnsupportedReporting.test_unsupported_numpy_function.<locals>.funcz4Use of unsupported NumPy function 'numpy.asanyarray'r   r)   r   r*   r+   r,   r-   )r.   r(   r/   r0   r!   r!   r&   test_unsupported_numpy_function4   s    
$z8TestUnsupportedReporting.test_unsupported_numpy_functionN)r2   r3   r4   r8   r!   r!   r!   r&   r5   2   s   r5   c                   @   sX   e Z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d ZdS )TestMiscErrorHandlingc                 C   s*   t dd }tjdgtjd}|| d S )Nc                 S   s   d|  S N
   r!   r"   r!   r!   r&   fnH   s    zHTestMiscErrorHandling.test_use_of_exception_for_flow_control.<locals>.fng      ?)Zdtype)r   r6   ZarrayZfloat64)r.   r<   ar!   r!   r&   &test_use_of_exception_for_flow_controlC   s    
z<TestMiscErrorHandling.test_use_of_exception_for_flow_controlc              	   C   sd   dd }dd }||fD ]F}|  t}|  W d    n1 sB0    Y  | dt|j qd S )Nc                   S   s   t dd S )Ntest_string	Exceptionr!   r!   r!   r&   foo_commentedU   s    z_TestMiscErrorHandling.test_commented_func_definition_is_not_a_definition.<locals>.foo_commentedc                   S   s   t ddS )z> def docstring containing def might match function definition!r?   Nr@   r!   r!   r!   r&   foo_docstringY   s    z_TestMiscErrorHandling.test_commented_func_definition_is_not_a_definition.<locals>.foo_docstringr?   )r)   rA   r+   r,   r-   )r.   rB   rC   r(   r/   r!   r!   r&   2test_commented_func_definition_is_not_a_definitionO   s    $zHTestMiscErrorHandling.test_commented_func_definition_is_not_a_definitionc                 C   sx   G dd dt }t|ddd }| tj }|tddg W d    n1 sT0    Y  d}| |t|j d S )	Nc                   @   s   e Zd Zdd ZdS )zFTestMiscErrorHandling.test_use_of_ir_unknown_loc.<locals>.TestPipelinec                 S   sn   d}t |}|td |td |td |td |td |td |td |	  |gS )	NZbad_DCE_pipelinezanalyzing bytecodezfix up argszprocessing IRZDCEznopython frontendznative loweringznopython mode backend)
r   Zadd_passr   r   r   r   r   r   r   finalize)r.   nameZpmr!   r!   r&   define_pipelinesf   s    zWTestMiscErrorHandling.test_use_of_ir_unknown_loc.<locals>.TestPipeline.define_pipelinesN)r2   r3   r4   rG   r!   r!   r!   r&   TestPipelinee   s   rH   )Zpipeline_classc                 S   s   dS )Nr   r!   r=   r!   r!   r&   fv   s    z;TestMiscErrorHandling.test_use_of_ir_unknown_loc.<locals>.fr   r   z File "unknown location", line 0:)	r   r   r)   r   r*   iterr+   r,   r-   )r.   rH   rJ   r/   r0   r!   r!   r&   test_use_of_ir_unknown_locc   s    
.z0TestMiscErrorHandling.test_use_of_ir_unknown_locc                 C   sZ   |  tj}|  W d    n1 s(0    Y  ddg}|D ]}| |t|j q>d S )NzThe use of az'in globals, is not supported as globals)r)   r   r*   r+   r,   r-   )r.   r(   r/   r0   exr!   r!   r&   check_write_to_globals   s
    $z,TestMiscErrorHandling.check_write_to_globalsc                 C   s   t dd }| | d S )Nc                   S   s   dt d< d S Nr;   r   )_global_listr!   r!   r!   r&   foo   s    zMTestMiscErrorHandling.test_handling_of_write_to_reflected_global.<locals>.foor   rN   r.   rQ   r!   r!   r&   *test_handling_of_write_to_reflected_global   s    
z@TestMiscErrorHandling.test_handling_of_write_to_reflected_globalc                 C   s   t dd }| | d S )Nc                   S   s   dt d< d S rO   )_global_dictr!   r!   r!   r&   rQ      s    zNTestMiscErrorHandling.test_handling_of_write_to_typed_dict_global.<locals>.foorR   rS   r!   r!   r&   +test_handling_of_write_to_typed_dict_global   s    
zATestMiscErrorHandling.test_handling_of_write_to_typed_dict_globalc                 C   s^   t dddd }| tj}|  W d    n1 s:0    Y  d}| |t|j d S )NT)Zparallelc                  S   s   t dD ]} qd S r:   )Zprange)ir!   r!   r&   rQ      s    zPTestMiscErrorHandling.test_handling_forgotten_numba_internal_import.<locals>.foozC'prange' looks like a Numba internal function, has it been importedr7   )r.   rQ   r/   r0   r!   r!   r&   -test_handling_forgotten_numba_internal_import   s    
$zCTestMiscErrorHandling.test_handling_forgotten_numba_internal_importc              	   C   sl   dd }d}t ddtfD ]L}| tj}||  W d    n1 sJ0    Y  | |t|j qd S )Nc                   S   s   dd t dD  d S )Nc                 s   s   | ]
}|V  qd S r    r!   ).0r#   r!   r!   r&   	<genexpr>       zdTestMiscErrorHandling.test_handling_unsupported_generator_expression.<locals>.foo.<locals>.<genexpr>r;   )ranger!   r!   r!   r&   rQ      s    zQTestMiscErrorHandling.test_handling_unsupported_generator_expression.<locals>.fooz-The use of yield in a closure is unsupported.T)Zforceobj)r   r   r)   r   ZUnsupportedErrorr+   r,   r-   )r.   rQ   r0   Zdecr/   r!   r!   r&   .test_handling_unsupported_generator_expression   s    (zDTestMiscErrorHandling.test_handling_unsupported_generator_expressionc                 C   sX   t dd }d}| tj}|  W d    n1 s80    Y  | |t|j d S )Nc                   S   s   t S r    rI   r!   r!   r!   r&   rQ      s    zCTestMiscErrorHandling.test_handling_undefined_variable.<locals>.fooz"NameError: name 'a' is not definedr7   )r.   rQ   r0   r/   r!   r!   r&    test_handling_undefined_variable   s    
$z6TestMiscErrorHandling.test_handling_undefined_variableN)r2   r3   r4   r>   rD   rL   rN   rT   rV   r   rX   r]   r^   r!   r!   r!   r&   r9   A   s   
r9   c                   @   s   e Zd Zdd ZdS )"TestConstantInferenceErrorHandlingc                 C   sr   t dd }| tj}|dd W d    n1 s80    Y  d}d}| |t|j | |t|j d S )Nc                 S   s   | |krt d| || | S )NzEqual numbers: %i %ir@   )r=   br!   r!   r&   problem   s    zDTestConstantInferenceErrorHandling.test_basic_error.<locals>.problemr   r   z3Constant inference not possible for: arg(0, name=a)z-raise Exception("Equal numbers: %i %i", a, b))r   r)   r   ZConstantInferenceErrorr+   r,   r-   )r.   ra   r/   Zmsg1Zmsg2r!   r!   r&   test_basic_error   s    
(z3TestConstantInferenceErrorHandling.test_basic_errorN)r2   r3   r4   rb   r!   r!   r!   r&   r_      s   r_   c                   @   s   e Zd Zdd Zdd Ze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ejddd Zdd ZdS )TestErrorMessagesc                    s   ddd  t  fdd}t fdd}| tj}|  W d    n1 sX0    Y  t|j}| td 	 d	 | | | d S )
NZspecific_reasonc                   S   s   d S r    r!   r!   r!   r!   r&   rQ      s    z2TestErrorMessages.test_specific_error.<locals>.fooc                      s   t  d S r    )r   NumbaValueErrorr!   )given_reasonr!   r&   ol_foo   s    z5TestErrorMessages.test_specific_error.<locals>.ol_fooc                      s
      d S r    r!   r!   rQ   r!   r&   call_foo   s    z7TestErrorMessages.test_specific_error.<locals>.call_foospecific_errorr   )
r	   r   r)   r   r*   r,   r-   r+   error_reasons
splitlinesr.   rf   rh   r/   excstrr!   )rQ   re   r&   test_specific_error   s    $
z%TestErrorMessages.test_specific_errorc                    st   dd  t  dd }t fdd}| tj}|  W d    n1 sP0    Y  t|j}| d| d S )Nc                   S   s   d S r    r!   r!   r!   r!   r&   rQ      s    z2TestErrorMessages.test_no_match_error.<locals>.fooc                   S   s   d S r    r!   r!   r!   r!   r&   rf      s    z5TestErrorMessages.test_no_match_error.<locals>.ol_fooc                      s
      d S r    r!   r!   rg   r!   r&   rh      s    z7TestErrorMessages.test_no_match_error.<locals>.call_foozNo match)r	   r   r)   r   r*   r,   r-   r+   rl   r!   rg   r&   test_no_match_error   s    
$
z%TestErrorMessages.test_no_match_errorc                 C   s   t dd }| tj}|  W d   n1 s40    Y  t|j}| td  d | t	j
ddd}d	| d
}| ||| dS )z Checks that the reported source location for an overload is the
        overload implementation source, not the actual function source from the
        target library.c                   S   s   t jd d S )Nchars)r6   ZlinalgZsvdr!   r!   r!   r&   rQ      s    zDTestErrorMessages.test_error_function_source_is_correct.<locals>.fooNri   r   numbar6   z	linalg.pyz'Overload in function 'svd_impl': File: :)r   r)   r   r*   r,   r-   r+   rj   rk   ospathjoinformat)r.   rQ   r/   rm   expected_filer0   r!   r!   r&   %test_error_function_source_is_correct   s    
$
z7TestErrorMessages.test_error_function_source_is_correctc                 C   sd   t dd }| tj}|  W d    n1 s40    Y  t|j}| d| | d| d S )Nc                   S   s   dd S )Nr=   r   r!   r!   r!   r!   r&   rQ     s    z<TestErrorMessages.test_concrete_template_source.<locals>.foozOverload of function 'add'	No match.r   r)   r   r*   r,   r-   r+   r.   rQ   r/   rm   r!   r!   r&   test_concrete_template_source  s    
$
z/TestErrorMessages.test_concrete_template_sourcec                 C   sX   t dd }| tj}|  W d    n1 s40    Y  t|j}| d| d S )Nc                   S   s   t dS Nr   )lenr!   r!   r!   r&   rQ     s    z<TestErrorMessages.test_abstract_template_source.<locals>.foozOverload of function 'len'rz   r{   r!   r!   r&   test_abstract_template_source  s    
$
z/TestErrorMessages.test_abstract_template_sourcec                 C   sX   t dd }| tj}|  W d    n1 s40    Y  t|j}| d| d S )Nc                   S   s
   t dS r}   )r6   Zangler!   r!   r!   r&   rQ   *  s    z<TestErrorMessages.test_callable_template_source.<locals>.fooz6No implementation of function Function(<function anglerz   r{   r!   r!   r&   test_callable_template_source(  s    
$
z/TestErrorMessages.test_callable_template_sourcec                    s   dd  t  dd }t fdd}| tj}|  W d    n1 sP0    Y  t|j}| d| tj	
dd	d
}d| d}| ||| | d| d S )Nc                 S   s   d S r    r!   r"   r!   r!   r&   bar7  s    zDTestErrorMessages.test_overloadfunction_template_source.<locals>.barc                 S   s   d S r    r!   r"   r!   r!   r&   ol_bar:  s    zGTestErrorMessages.test_overloadfunction_template_source.<locals>.ol_barc                      s    dS r}   r!   r!   r   r!   r&   rQ   >  s    zDTestErrorMessages.test_overloadfunction_template_source.<locals>.fooz
<numerous>rq   Ztestsztest_errorhandling.pyz"Overload of function 'bar': File: rr   ry   )r	   r   r)   r   r*   r,   r-   ZassertNotInrs   rt   ru   r+   rv   )r.   r   rQ   r/   rm   rw   Zexpected_olr!   r   r&   %test_overloadfunction_template_source5  s    
$

z7TestErrorMessages.test_overloadfunction_template_sourcec                    s   d dt  fddtfdd}| tj}|  W d    n1 sR0    Y  t|j}| td 	 d | |  | | | | d	| d S )
Nzx must be literalzarray.ndim must be 1c                    sF   t |tjst |jdkr*tt||}dd }||fS )Nr   c                 S   s   d S r    r!   )contextZbuilderZ	signatureargsr!   r!   r&   codegen^  s    zSTestErrorMessages.test_intrinsic_template_source.<locals>.myintrin.<locals>.codegen)
isinstancer   ZIntegerLiteralr   ZRequireLiteralValuendimrd   Zintp)Z	typingctxr#   arrZsigr   )given_reason1given_reason2r!   r&   myintrinT  s    


zBTestErrorMessages.test_intrinsic_template_source.<locals>.myintrinc                     s   t d}  d|  d S )N)r   r   r   )r6   Zzeros)r   )r   r!   r&   call_intrinb  s    
zETestErrorMessages.test_intrinsic_template_source.<locals>.call_intrinri   r   zIntrinsic in function)
r
   r   r)   r   r*   r,   r-   r+   rj   rk   )r.   r   r/   rm   r!   )r   r   r   r&   test_intrinsic_template_sourceO  s    $
z0TestErrorMessages.test_intrinsic_template_sourcec                 C   sl   t tjddd }tdd }| tj}|  W d    n1 sH0    Y  t|j}| 	d| d S )N
isnonsensec                 S   s   d S r    r!   r.   r!   r!   r&   ol_unicode_isnonsenses  s    zTTestErrorMessages.test_overloadmethod_template_source.<locals>.ol_unicode_isnonsensec                   S   s   d   d S Nabcr   r!   r!   r!   r&   rQ   w  s    zBTestErrorMessages.test_overloadmethod_template_source.<locals>.foo,Overload of function 'ol_unicode_isnonsense')
r   r   UnicodeTyper   r)   r   r*   r,   r-   r+   r.   r   rQ   r/   rm   r!   r!   r&   #test_overloadmethod_template_sourcep  s    


$
z5TestErrorMessages.test_overloadmethod_template_sourcec                 C   sl   t tjddd }tdd }| tj}|  W d    n1 sH0    Y  t|j}| 	d| d S )Nr   c                 S   s   d S r    r!   r   r!   r!   r&   r     s    zWTestErrorMessages.test_overloadattribute_template_source.<locals>.ol_unicode_isnonsensec                   S   s
   dj  d S r   r   r!   r!   r!   r&   rQ     s    zETestErrorMessages.test_overloadattribute_template_source.<locals>.foor   )
r   r   r   r   r)   r   r*   r,   r-   r+   r   r!   r!   r&   &test_overloadattribute_template_source  s    


$
z8TestErrorMessages.test_overloadattribute_template_sourcec                    sh   ddl m  t fdd}| tj}|  W d    n1 sD0    Y  t|j}| d| d S )Nr   c_cosc                      s    d d S Nr=   r!   r!   r   r!   r&   rQ     s    zMTestErrorMessages.test_external_function_pointer_template_source.<locals>.foo.Type Restricted Function in function 'unknown')	Znumba.tests.ctypes_usecasesr   r   r)   r   r*   r,   r-   r+   r{   r!   r   r&   .test_external_function_pointer_template_source  s    $
z@TestErrorMessages.test_external_function_pointer_template_sourcezCFFI not supportedc                    sv   ddl m} |  |j t fdd}| tj}|  W d    n1 sR0    Y  t|j	}| 
d| d S )Nr   )cffi_usecasesc                      s    d d S r   r!   r!   r(   r!   r&   rQ     s    zITestErrorMessages.test_cffi_function_pointer_template_source.<locals>.foor   )Znumba.testsr   initZcffi_cosr   r)   r   r*   r,   r-   r+   )r.   modrQ   r/   rm   r!   r   r&   *test_cffi_function_pointer_template_source  s    $
z<TestErrorMessages.test_cffi_function_pointer_template_sourcec                 C   s   t jG dd dtj}G dd dt j}t ||ddg | tj}|ddd	 W d    n1 sj0    Y  t	|j
}| d
| d S )Nc                   @   s   e Zd ZdS )z;TestErrorMessages.test_missing_source.<locals>.ParticleTypeN)r2   r3   r4   r!   r!   r!   r&   ParticleType  s   r   c                   @   s   e Zd Zdd ZdS )z7TestErrorMessages.test_missing_source.<locals>.Particlec                 S   s   t j| |S r    )r   StructRefProxy__new__)clsposmassr!   r!   r&   r     s    z?TestErrorMessages.test_missing_source.<locals>.Particle.__new__N)r2   r3   r4   r   r!   r!   r!   r&   Particle  s   r   r   r   r   r   )r   r   z#missing a required argument: 'mass')r   registerr   Z	StructRefr   Zdefine_proxyr)   r   r*   r,   r-   r+   )r.   r   r   r/   rm   r!   r!   r&   test_missing_source  s    *
z%TestErrorMessages.test_missing_sourceN)r2   r3   r4   rn   ro   r   rx   r|   r   r   r   r   r   r   r   unittestZ
skipUnlesscffi_supportZ	SUPPORTEDr   r   r!   r!   r!   r&   rc      s   
!
rc   c                   @   s   e Zd Zdd ZdS )"TestDeveloperSpecificErrorMessagesc              	   C   s   dd }t ddH | tj}td| W d    n1 sB0    Y  W d    n1 s`0    Y  t|j}| d| d S )Nc                 S   s   |  d d S )N)maxr"   r!   r!   r&   rQ     s    zPTestDeveloperSpecificErrorMessages.test_bound_function_error_string.<locals>.fooZDEVELOPER_MODEr   zvoid(int64[:,:])zargs not supported)r   r)   r   r*   r   r,   r-   r+   r{   r!   r!   r&    test_bound_function_error_string  s    H
zCTestDeveloperSpecificErrorMessages.test_bound_function_error_stringN)r2   r3   r4   r   r!   r!   r!   r&   r     s   r   c                   @   s   e Zd ZdZdd ZdS )TestCapturedErrorHandlingzjChecks that the way errors are captured changes depending on the env
    var "NUMBA_CAPTURED_ERRORS".
    c              
      s   dd  t  dd }dtfdtjffD ]\}}td|d | |$}td fd	d
}W d    n1 sr0    Y  d}| |t|j	 W d    q*1 s0    Y  q*d S )Nc                 S   s   d S r    r!   r"   r!   r!   r&   r     s    z=TestCapturedErrorHandling.test_error_in_overload.<locals>.barc                 S   s   | j  dd }|S )Nc                 S   s   d S r    r!   r"   r!   r!   r&   impl  s    zNTestCapturedErrorHandling.test_error_in_overload.<locals>.ol_bar.<locals>.impl)Zsome_invalid_attr)r#   r   r!   r!   r&   r     s    z@TestCapturedErrorHandling.test_error_in_overload.<locals>.ol_barZ	new_styleZ	old_styleZCAPTURED_ERRORSzvoid(int64)c                    s    |  d S r    r!   r"   r   r!   r&   rQ     s    z=TestCapturedErrorHandling.test_error_in_overload.<locals>.fooz+object has no attribute 'some_invalid_attr')
r	   AttributeErrorr   r*   r   r)   r   r+   r,   r-   )r.   r   ZstyleZ	err_classr/   rQ   r0   r!   r   r&   test_error_in_overload  s    
,z0TestCapturedErrorHandling.test_error_in_overloadN)r2   r3   r4   __doc__r   r!   r!   r!   r&   r     s   r   __main__)<r   Znumpyr6   rs   rq   r   r   r   r   r   Z
numba.corer   Znumba.core.typing.cffi_utilsZcoretypingZ
cffi_utilsr   Znumba.experimentalr   Znumba.extendingr	   r
   r   r   Znumba.core.compilerr   Znumba.core.untyped_passesr   r   r   Znumba.core.typed_passesr   r   r   r   Znumba.core.compiler_machineryr   Znumba.core.types.functionsr   rj   Znumba.tests.supportr   r   r   r   r   rP   DictemptyrU   ZTestCaser   r5   r9   r_   rc   r   r   r2   mainr!   r!   r!   r&   <module>   s4   z v
