예제 #1
0
def _simplify_toplevel_references(expr: Union[ir0.RvalueReferenceTypeExpr, ir0.ReferenceTypeExpr]):
    has_reference = False
    while isinstance(expr, (ir0.RvalueReferenceTypeExpr, ir0.ReferenceTypeExpr)):
        has_reference |= isinstance(expr, ir0.ReferenceTypeExpr)
        expr = expr.type_expr
    if has_reference:
        return ir0.ReferenceTypeExpr(expr)
    else:
        return ir0.RvalueReferenceTypeExpr(expr)
예제 #2
0
def type_literal(cpp_type: str):
    return ir0.AtomicTypeLiteral.for_nonlocal_type(cpp_type,
                                                   may_be_alias=False)


def local_type_literal(cpp_type: str):
    return ir0.AtomicTypeLiteral.for_local(cpp_type,
                                           expr_type=ir0.TypeType(),
                                           is_variadic=False)


@pytest.mark.parametrize('expr_generator', [
    lambda: ir0.Literal(1),
    lambda: ir0.AtomicTypeLiteral.for_nonlocal_type('int', may_be_alias=False),
    lambda: ir0.PointerTypeExpr(type_literal('int')),
    lambda: ir0.ReferenceTypeExpr(type_literal('int')),
    lambda: ir0.RvalueReferenceTypeExpr(type_literal('int')),
    lambda: ir0.ConstTypeExpr(type_literal('int')),
    lambda: ir0.ArrayTypeExpr(type_literal('int')),
    lambda: ir0.FunctionTypeExpr(type_literal('int'), []),
    lambda: ir0.FunctionTypeExpr(type_literal('int'), [type_literal('float')]),
    lambda: ir0.ComparisonExpr(literal(1), literal(2), op='=='),
    lambda: ir0.Int64BinaryOpExpr(literal(1), literal(2), op='+'),
    lambda: ir0.BoolBinaryOpExpr(literal(True), literal(False), op='||'),
    lambda: ir0.NotExpr(literal(True)),
    lambda: ir0.UnaryMinusExpr(literal(1)),
    lambda: ir0.TemplateInstantiation(
        template_expr=ir0.AtomicTypeLiteral.for_nonlocal_template(
            cpp_type='std::vector',
            args=[],
            is_metafunction_that_may_return_error=False,
예제 #3
0
def ref(expr: ir0.Expr):
    return ir0.ReferenceTypeExpr(expr)