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)
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,
def ref(expr: ir0.Expr): return ir0.ReferenceTypeExpr(expr)