commits, infers);
TyTy::BaseType *result = r.go ();
+ bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
+
commits.emplace_back (lhs.get_ty (), rhs.get_ty (), result);
- if (r.commit_flag)
- UnifyRules::commit (lhs.get_ty (), rhs.get_ty (), result);
+ if (r.commit_flag && !failed)
+ {
+ result = result->clone ();
+ UnifyRules::commit (lhs.get_ty (), rhs.get_ty (), result);
+ }
- bool failed = result->get_kind () == TyTy::TypeKind::ERROR;
if (failed && r.emit_error)
r.emit_type_mismatch ();
switch (ltype->get_infer_kind ())
{
case TyTy::InferType::InferTypeKind::GENERAL:
- return rtype->clone ();
+ return rtype;
case TyTy::InferType::InferTypeKind::INTEGRAL:
{
bool is_valid = (ltype->get_infer_kind ()
== TyTy::InferType::InferTypeKind::GENERAL);
if (is_valid)
- return rtype->clone ();
+ return rtype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
case TyTy::STR:
- return rtype->clone ();
+ return rtype;
case TyTy::ADT:
case TyTy::REF:
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
// DEF Id match? see https://github.com/Rust-GCC/gccrs/issues/2053
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
return new TyTy::ErrorType (0);
}
- return ltype->clone ();
+ return ltype;
}
break;
}
}
- return ltype->clone ();
+ return ltype;
}
break;
}
}
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
{
if (commit_flag)
r->apply_primitive_type_hint (*ltype);
- return ltype->clone ();
+ return ltype;
}
}
break;
case TyTy::BOOL:
- return rtype->clone ();
+ return rtype;
case TyTy::CHAR:
case TyTy::INT:
{
if (commit_flag)
r->apply_primitive_type_hint (*ltype);
- return ltype->clone ();
+ return ltype;
}
}
break;
case TyTy::CHAR:
- return rtype->clone ();
+ return rtype;
case TyTy::INT:
case TyTy::FLOAT:
{
if (commit_flag)
r->apply_primitive_type_hint (*ltype);
- return ltype->clone ();
+ return ltype;
}
}
break;
{
if (commit_flag)
r->apply_primitive_type_hint (*ltype);
- return ltype->clone ();
+ return ltype;
}
}
break;
{
if (commit_flag)
r->apply_primitive_type_hint (*ltype);
- return ltype->clone ();
+ return ltype;
}
}
break;
{
if (commit_flag)
r->apply_primitive_type_hint (*ltype);
- return ltype->clone ();
+ return ltype;
}
}
break;
case TyTy::ISIZE:
- return rtype->clone ();
+ return rtype;
case TyTy::ADT:
case TyTy::STR:
{
if (commit_flag)
r->apply_primitive_type_hint (*ltype);
- return ltype->clone ();
+ return ltype;
}
}
break;
case TyTy::USIZE:
- return rtype->clone ();
+ return rtype;
case TyTy::ADT:
case TyTy::STR:
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
default:
- return rtype->clone ();
+ return rtype;
}
return new TyTy::ErrorType (0);
}
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
case TyTy::PLACEHOLDER:
- return ltype->clone ();
+ return ltype;
case TyTy::PROJECTION:
case TyTy::DYNAMIC:
case TyTy::NEVER:
case TyTy::OPAQUE:
if (infer_flag)
- return rtype->clone ();
+ return rtype;
gcc_fallthrough ();
case TyTy::CONST:
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
return new TyTy::ErrorType (0);
}
- return ltype->clone ();
+ return ltype;
}
break;
bool is_valid
= r->get_infer_kind () == TyTy::InferType::InferTypeKind::GENERAL;
if (is_valid)
- return ltype->clone ();
+ return ltype;
}
break;
return new TyTy::ErrorType (0);
}
- return ltype->clone ();
+ return ltype;
}
break;