示例#1
0
def test_unify_ir0_certain_nontrivial_with_variadic_type_variable_matches_empty_list_suffix(
):
    result = _unify([
        ir0.FunctionTypeExpr(type_literal('int'),
                             arg_exprs=[type_literal('float')])
    ], [
        ir0.FunctionTypeExpr(type_literal('int'),
                             arg_exprs=[
                                 type_literal('float'),
                                 ir0.VariadicTypeExpansion(
                                     ir0.AtomicTypeLiteral.for_local(
                                         cpp_type='Ts',
                                         expr_type=ir0.TypeType(),
                                         is_variadic=True))
                             ])
    ],
                    expr_variables=set(),
                    pattern_variables={'Ts'})
    assert result.kind == UnificationResultKind.CERTAIN
    assert result.value_by_pattern_variable == []
    assert result.value_by_expanded_pattern_variable == [
        (ir0.VariadicTypeExpansion(
            ir0.AtomicTypeLiteral.for_local(cpp_type='Ts',
                                            expr_type=ir0.TypeType(),
                                            is_variadic=True)), []),
    ]
示例#2
0
def test_unify_ir0_certain_nontrivial_with_variadic_type_variable() -> None:
    result = _unify(
        (ir0.FunctionTypeExpr(
            type_literal('int'),
            arg_exprs=(type_literal('float'), type_literal('double'),
                       local_type_literal('T'), type_literal('char'),
                       type_literal('void'))), ),
        (ir0.FunctionTypeExpr(
            type_literal('int'),
            arg_exprs=(type_literal('float'), type_literal('double'),
                       ir0.VariadicTypeExpansion(
                           ir0.AtomicTypeLiteral.for_local(
                               cpp_type='Ts',
                               expr_type=ir0.TypeType(),
                               is_variadic=True)), type_literal('void'))), ),
        expr_variables={'T'},
        pattern_variables={'Ts'})
    assert result.kind == UnificationResultKind.CERTAIN
    assert result.value_by_pattern_variable == ()
    assert result.value_by_expanded_pattern_variable == (
        (ir0.VariadicTypeExpansion(
            ir0.AtomicTypeLiteral.for_local(cpp_type='Ts',
                                            expr_type=ir0.TypeType(),
                                            is_variadic=True)),
         (local_type_literal('T'), type_literal('char'))), )
示例#3
0
def test_unify_ir0_certain_nontrivial_with_variadic_type_variable_does_not_match(
) -> None:
    result = _unify(
        (ir0.FunctionTypeExpr(type_literal('int'), arg_exprs=()), ),
        (ir0.FunctionTypeExpr(type_literal('int'),
                              arg_exprs=(
                                  type_literal('float'),
                                  ir0.VariadicTypeExpansion(
                                      ir0.AtomicTypeLiteral.for_local(
                                          cpp_type='Ts',
                                          expr_type=ir0.TypeType(),
                                          is_variadic=True)),
                              )), ),
        expr_variables=set(),
        pattern_variables={'Ts'})
    assert result.kind == UnificationResultKind.IMPOSSIBLE
示例#4
0
def test_unify_ir0_variadic_type_variable_matches_multiple_variadics():
    result = _unify([
        ir0.FunctionTypeExpr(
            type_literal('int'),
            arg_exprs=[
                type_literal('float'),
                type_literal('double'),
                ir0.VariadicTypeExpansion(
                    ir0.AtomicTypeLiteral.for_local(cpp_type='Ts',
                                                    expr_type=ir0.TypeType(),
                                                    is_variadic=True)),
                type_literal('char'),
                ir0.VariadicTypeExpansion(
                    ir0.AtomicTypeLiteral.for_local(cpp_type='Us',
                                                    expr_type=ir0.TypeType(),
                                                    is_variadic=True)),
                type_literal('void')
            ])
    ], [
        ir0.FunctionTypeExpr(type_literal('int'),
                             arg_exprs=[
                                 type_literal('float'),
                                 type_literal('double'),
                                 ir0.VariadicTypeExpansion(
                                     ir0.AtomicTypeLiteral.for_local(
                                         cpp_type='Vs',
                                         expr_type=ir0.TypeType(),
                                         is_variadic=True)),
                                 type_literal('void')
                             ])
    ],
                    expr_variables={'Ts', 'Us'},
                    pattern_variables={'Vs'})
    assert result.kind == UnificationResultKind.CERTAIN
    assert result.value_by_pattern_variable == []
    assert result.value_by_expanded_pattern_variable == [
        (ir0.VariadicTypeExpansion(
            ir0.AtomicTypeLiteral.for_local(cpp_type='Vs',
                                            expr_type=ir0.TypeType(),
                                            is_variadic=True)),
         [
             ir0.VariadicTypeExpansion(
                 ir0.AtomicTypeLiteral.for_local(cpp_type='Ts',
                                                 expr_type=ir0.TypeType(),
                                                 is_variadic=True)),
             type_literal('char'),
             ir0.VariadicTypeExpansion(
                 ir0.AtomicTypeLiteral.for_local(cpp_type='Us',
                                                 expr_type=ir0.TypeType(),
                                                 is_variadic=True))
         ]),
    ]
示例#5
0
                             'TemplateInstantiation (no args)',
                             'TemplateInstantiation (1 arg)',
                             'ClassMemberAccess',
                         ])
def test_unify_ir0_trivial_term_equality(expr_generator):
    result = _unify([expr_generator()], [expr_generator()],
                    expr_variables=set(),
                    pattern_variables=set())
    assert result.kind == UnificationResultKind.CERTAIN
    assert result.value_by_pattern_variable == []
    assert result.value_by_expanded_pattern_variable == []


@pytest.mark.parametrize('expr1,expr2', [
    (ir0.VariadicTypeExpansion(
        ir0.AtomicTypeLiteral.for_local(
            'Ts', expr_type=ir0.TypeType(), is_variadic=True)),
     ir0.VariadicTypeExpansion(
         ir0.AtomicTypeLiteral.for_local(
             'Us', expr_type=ir0.TypeType(), is_variadic=True))),
])
def test_unify_ir0_term_equality_variadic_type_expansion(expr1, expr2):
    result = _unify([expr1], [expr2],
                    expr_variables={'Ts'},
                    pattern_variables={'Us'})
    assert result.kind == UnificationResultKind.CERTAIN
    assert result.value_by_pattern_variable == [
        (ir0.AtomicTypeLiteral.for_local('Us',
                                         expr_type=ir0.TypeType(),
                                         is_variadic=True),
         ir0.AtomicTypeLiteral.for_local('Ts',
示例#6
0
# struct TypeListConcat;
#
# template <typename... Ts, typename... Us>
# struct TypeListConcat<List<Ts...>, List<Us...>> {
#   using type = List<Ts..., Us...>;
# };
_define_template_with_single_specialization(
    name='TypeListConcat',
    main_definition_args=[_type_arg_decl('L1'),
                          _type_arg_decl('L2')],
    specialization_args=[
        _variadic_type_arg_decl('Ts'),
        _variadic_type_arg_decl('Us')
    ],
    patterns=[
        _type_list_of(ir0.VariadicTypeExpansion(_local_variadic_type('Ts'))),
        _type_list_of(ir0.VariadicTypeExpansion(_local_variadic_type('Us')))
    ],
    type_expr=_type_list_of(
        ir0.VariadicTypeExpansion(_local_variadic_type('Ts')),
        ir0.VariadicTypeExpansion(_local_variadic_type('Us'))))

# template <typename L1, typename L2>
# struct Int64ListConcat;
#
# template <int64_t... ns, int64_t... ms>
# struct Int64ListConcat<Int64List<ns...>, Int64List<ms...>> {
#   using type = Int64List<ns..., ms...>;
# };
_define_template_with_single_specialization(
    name='Int64ListConcat',
示例#7
0
                         result_element_name='type',
                         has_error=(error_expr is not None))

# template <typename L1, typename L2>
# struct TypeListConcat;
#
# template <typename... Ts, typename... Us>
# struct TypeListConcat<List<Ts...>, List<Us...>> {
#   using type = List<Ts..., Us...>;
# };
_define_template_with_single_specialization(name='TypeListConcat',
                                            main_definition_args=(_type_arg_decl('L1'),
                                                                  _type_arg_decl('L2')),
                                            specialization_args=(_variadic_type_arg_decl('Ts'),
                                                                 _variadic_type_arg_decl('Us')),
                                            patterns=(_type_list_of(ir0.VariadicTypeExpansion(_local_variadic_type('Ts'))),
                                                      _type_list_of(ir0.VariadicTypeExpansion(_local_variadic_type('Us')))),
                                            type_expr=_type_list_of(ir0.VariadicTypeExpansion(_local_variadic_type('Ts')),
                                                                    ir0.VariadicTypeExpansion(_local_variadic_type('Us'))))

# template <typename L1, typename L2>
# struct Int64ListConcat;
#
# template <int64_t... ns, int64_t... ms>
# struct Int64ListConcat<Int64List<ns...>, Int64List<ms...>> {
#   using type = Int64List<ns..., ms...>;
# };
_define_template_with_single_specialization(name='Int64ListConcat',
                                            main_definition_args=(_type_arg_decl('L1'),
                                                                  _type_arg_decl('L2')),
                                            specialization_args=(_variadic_int64_arg_decl('ns'),