namespace Rust {
namespace Resolver {
+static TyTy::BaseType *
+unify_error_type_node ()
+{
+ static TyTy::BaseType *error = nullptr;
+ if (error == nullptr)
+ error = new TyTy::ErrorType (0);
+ return error;
+}
+
UnifyRules::UnifyRules (TyTy::TyWithLocation lhs, TyTy::TyWithLocation rhs,
location_t locus, bool commit_flag, bool emit_error,
bool check_bounds, bool infer,
{
// already emitted an error
emit_error = false;
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
else if (rtype->num_specified_bounds () > 0)
{
// already emitted an error
emit_error = false;
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
}
return expect_const (static_cast<TyTy::ConstType *> (ltype), rtype);
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
break;
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::ADTType &type = *static_cast<TyTy::ADTType *> (rtype);
if (ltype->get_adt_kind () != type.get_adt_kind ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
if (ltype->get_identifier ().compare (type.get_identifier ()) != 0)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
if (ltype->number_of_variants () != type.number_of_variants ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
for (size_t i = 0; i < type.number_of_variants (); ++i)
if (a->num_fields () != b->num_fields ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
for (size_t j = 0; j < a->num_fields (); j++)
TyTy::TyWithLocation (other_field_ty));
if (unified_ty->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
}
TyTy::TyWithLocation (pb));
if (res->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
}
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::TyWithLocation (other_base_type));
if (base_resolved->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
// rust is permissive about mutablity here you can always go from
bool mutability_ok = ltype->is_mutable () ? type.is_mutable () : true;
if (!mutability_ok)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
return new TyTy::ReferenceType (ltype->get_ref (), ltype->get_ty_ref (),
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::TyWithLocation (other_base_type));
if (base_resolved->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
// rust is permissive about mutablity here you can always go from
bool mutability_ok = ltype->is_mutable () ? type.is_mutable () : true;
if (!mutability_ok)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
return new TyTy::PointerType (ltype->get_ref (), ltype->get_ty_ref (),
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::TyWithLocation (type.get_element_type ()));
if (element_unify->get_kind () == TyTy::TypeKind::ERROR)
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
bool save_emit_error = emit_error;
emit_error = false;
emit_error = save_emit_error;
if (capacity_unify->get_kind () != TyTy::TypeKind::CONST)
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
TyTy::ConstType *capacity_type_unify
= static_cast<TyTy::ConstType *> (capacity_unify);
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::FnType &type = *static_cast<TyTy::FnType *> (rtype);
if (ltype->num_params () != type.num_params ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
for (size_t i = 0; i < ltype->num_params (); i++)
TyTy::TyWithLocation (b));
if (unified_param->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
TyTy::TyWithLocation (type.get_return_type ()));
if (unified_return->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
// ABI match? see
{
emit_abi_mismatch (*ltype, type);
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
// DEF Id match? see https://github.com/Rust-GCC/gccrs/issues/2053
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::FnPtr &type = *static_cast<TyTy::FnPtr *> (rtype);
if (ltype->num_params () != type.num_params ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
for (size_t i = 0; i < ltype->num_params (); i++)
TyTy::TyWithLocation (b));
if (unified_param->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
TyTy::TyWithLocation (type.get_return_type ()));
if (unified_return->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
return ltype;
TyTy::TyWithLocation (other_ret_type));
if (unified_result->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
if (ltype->num_params () != type.num_params ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
for (size_t i = 0; i < ltype->num_params (); i++)
TyTy::TyWithLocation (other_param));
if (unified_param->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
TyTy::TyWithLocation (other_ret_type));
if (unified_result->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
if (ltype->num_params () != type.get_num_params ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
for (size_t i = 0; i < ltype->num_params (); i++)
TyTy::TyWithLocation (other_param));
if (unified_param->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
}
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::TupleType &type = *static_cast<TyTy::TupleType *> (rtype);
if (ltype->num_fields () != type.num_fields ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
std::vector<TyTy::TyVar> fields;
= resolve_subtype (TyTy::TyWithLocation (bo),
TyTy::TyWithLocation (fo));
if (unified_ty->get_kind () == TyTy::TypeKind::ERROR)
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
fields.emplace_back (unified_ty->get_ref ());
}
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
default:
return rtype;
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
= *static_cast<TyTy::DynamicObjectType *> (rtype);
if (ltype->num_specified_bounds () != type.num_specified_bounds ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
if (!ltype->bounds_compatible (type, locus, true))
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
return ltype;
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
TyTy::ClosureType &type = *static_cast<TyTy::ClosureType *> (rtype);
if (ltype->get_def_id () != type.get_def_id ())
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *args_res
TyTy::TyWithLocation (&type.get_parameters ()));
if (args_res->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *res
TyTy::TyWithLocation (&type.get_result_type ()));
if (res == nullptr || res->get_kind () == TyTy::TypeKind::ERROR)
{
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
return ltype;
case TyTy::OPAQUE:
case TyTy::CONST:
case TyTy::ERROR:
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
TyTy::BaseType *
{
TyTy::OpaqueType *ro = rtype->as<TyTy::OpaqueType> ();
if (!ltype->is_equal (*ro))
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
if (ltype->can_resolve () && ro->can_resolve ())
{
auto res = resolve_subtype (TyTy::TyWithLocation (lr),
TyTy::TyWithLocation (rr));
if (res->get_kind () == TyTy::TypeKind::ERROR)
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
else if (ltype->can_resolve ())
{
auto res = resolve_subtype (TyTy::TyWithLocation (underly),
TyTy::TyWithLocation (rtype));
if (res->get_kind () == TyTy::TypeKind::ERROR)
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
else
{
UnifyRules::expect_const (TyTy::ConstType *ltype, TyTy::BaseType *rtype)
{
if (rtype->get_kind () != TyTy::TypeKind::CONST)
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
TyTy::ConstType &lhs = *ltype;
TyTy::ConstType &rhs = *static_cast<TyTy::ConstType *> (rtype);
auto res = resolve_subtype (TyTy::TyWithLocation (lhs.get_ty ()),
TyTy::TyWithLocation (rhs.get_ty ()));
if (res->get_kind () == TyTy::TypeKind::ERROR)
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
tree lv = lhs.get_value ();
tree rv = rhs.get_value ();
lhs.get_combined_refs ());
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
bool equal = operand_equal_p (lv, rv, 0);
rhs.get_combined_refs ());
}
- return new TyTy::ErrorType (0);
+ return unify_error_type_node ();
}
} // namespace Resolver