gccrs: Track polarity in type bound predicate

Addresses #2443

gcc/rust/ChangeLog:

	* typecheck/rust-hir-path-probe.cc: track regular polarity
	* typecheck/rust-hir-trait-resolve.cc (TraitResolver::resolve_trait): likewise
	* typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise
	* typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): likewise
	* typecheck/rust-tyty-bounds.cc (TypeCheckBase::get_predicate_from_bound): likewise
	(TypeBoundPredicate::TypeBoundPredicate): update ctor
	(TypeBoundPredicate::operator=): update copy assignment ctor
	(TypeBoundPredicate::error): update error node
	* typecheck/rust-tyty.h: add polarity field to predicate

Signed-off-by: Philip Herron <herron.philip@googlemail.com>
This commit is contained in:
Philip Herron 2023-07-18 16:07:32 +01:00 committed by Arthur Cohen
parent c533a11ae0
commit f84d52a517
6 changed files with 24 additions and 12 deletions

View file

@ -344,7 +344,8 @@ PathProbeType::process_associated_trait_for_candidates (
break;
}
const TyTy::TypeBoundPredicate p (*trait_ref, UNDEF_LOCATION);
const TyTy::TypeBoundPredicate p (*trait_ref, BoundPolarity::RegularBound,
UNDEF_LOCATION);
TyTy::TypeBoundPredicateItem item (&p, trait_item_ref);
TyTy::BaseType *trait_item_tyty = item.get_raw_item ()->get_tyty ();

View file

@ -214,6 +214,7 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference)
auto self_hrtb
= TyTy::TypeBoundPredicate (trait_reference->get_mappings ().get_defid (),
std::move (self_subst_copy),
BoundPolarity::RegularBound,
trait_reference->get_locus ());
specified_bounds.push_back (self_hrtb);

View file

@ -1558,7 +1558,8 @@ TypeCheckExpr::visit (HIR::ClosureExpr &expr)
TraitReference *trait = TraitResolver::Resolve (*trait_item);
rust_assert (!trait->is_error ());
TyTy::TypeBoundPredicate predicate (*trait, expr.get_locus ());
TyTy::TypeBoundPredicate predicate (*trait, BoundPolarity::RegularBound,
expr.get_locus ());
// resolve the trait bound where the <(Args)> are the parameter tuple type
HIR::GenericArgs args = HIR::GenericArgs::create_empty (expr.get_locus ());

View file

@ -528,7 +528,8 @@ TypeCheckItem::visit (HIR::Trait &trait)
RustIdent ident{CanonicalPath::create_empty (), trait.get_locus ()};
infered = new TyTy::DynamicObjectType (
trait.get_mappings ().get_hirid (), ident,
{TyTy::TypeBoundPredicate (*trait_ref, trait.get_locus ())});
{TyTy::TypeBoundPredicate (*trait_ref, BoundPolarity::RegularBound,
trait.get_locus ())});
}
void

View file

@ -184,7 +184,8 @@ TypeCheckBase::get_predicate_from_bound (HIR::TypePath &type_path,
if (trait->is_error ())
return TyTy::TypeBoundPredicate::error ();
TyTy::TypeBoundPredicate predicate (*trait, type_path.get_locus ());
TyTy::TypeBoundPredicate predicate (*trait, BoundPolarity::RegularBound,
type_path.get_locus ());
HIR::GenericArgs args
= HIR::GenericArgs::create_empty (type_path.get_locus ());
@ -290,10 +291,11 @@ TypeCheckBase::get_predicate_from_bound (HIR::TypePath &type_path,
namespace TyTy {
TypeBoundPredicate::TypeBoundPredicate (
const Resolver::TraitReference &trait_reference, location_t locus)
const Resolver::TraitReference &trait_reference, BoundPolarity polarity,
location_t locus)
: SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
reference (trait_reference.get_mappings ().get_defid ()), locus (locus),
error_flag (false)
error_flag (false), polarity (polarity)
{
substitutions.clear ();
for (const auto &p : trait_reference.get_trait_substs ())
@ -306,9 +308,10 @@ TypeBoundPredicate::TypeBoundPredicate (
TypeBoundPredicate::TypeBoundPredicate (
DefId reference, std::vector<SubstitutionParamMapping> subst,
location_t locus)
BoundPolarity polarity, location_t locus)
: SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
reference (reference), locus (locus), error_flag (false)
reference (reference), locus (locus), error_flag (false),
polarity (polarity)
{
substitutions.clear ();
for (const auto &p : subst)
@ -322,7 +325,7 @@ TypeBoundPredicate::TypeBoundPredicate (
TypeBoundPredicate::TypeBoundPredicate (const TypeBoundPredicate &other)
: SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
reference (other.reference), locus (other.locus),
error_flag (other.error_flag)
error_flag (other.error_flag), polarity (other.polarity)
{
substitutions.clear ();
for (const auto &p : other.get_substs ())
@ -358,6 +361,7 @@ TypeBoundPredicate::operator= (const TypeBoundPredicate &other)
reference = other.reference;
locus = other.locus;
error_flag = other.error_flag;
polarity = other.polarity;
used_arguments = SubstitutionArgumentMappings::empty ();
substitutions.clear ();
@ -396,7 +400,8 @@ TypeBoundPredicate::operator= (const TypeBoundPredicate &other)
TypeBoundPredicate
TypeBoundPredicate::error ()
{
auto p = TypeBoundPredicate (UNKNOWN_DEFID, {}, UNDEF_LOCATION);
auto p = TypeBoundPredicate (UNKNOWN_DEFID, {}, BoundPolarity::RegularBound,
UNDEF_LOCATION);
p.error_flag = true;
return p;
}

View file

@ -381,11 +381,11 @@ class TypeBoundPredicate : public SubstitutionRef
{
public:
TypeBoundPredicate (const Resolver::TraitReference &trait_reference,
location_t locus);
BoundPolarity polarity, location_t locus);
TypeBoundPredicate (DefId reference,
std::vector<SubstitutionParamMapping> substitutions,
location_t locus);
BoundPolarity polarity, location_t locus);
TypeBoundPredicate (const TypeBoundPredicate &other);
@ -432,6 +432,8 @@ public:
DefId get_id () const { return reference; }
BoundPolarity get_polarity () const { return polarity; }
std::vector<TypeBoundPredicateItem> get_associated_type_items ();
size_t get_num_associated_bindings () const override final;
@ -445,6 +447,7 @@ private:
DefId reference;
location_t locus;
bool error_flag;
BoundPolarity polarity;
};
// https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.VariantDef.html