aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2023-03-29 15:00:39 +0100
committerPhilip Herron <philip.herron@embecosm.com>2023-03-30 16:52:24 +0000
commitefc3154162fff62d71859ef7d30a5a1ff1a4ba53 (patch)
tree789f2cb35e124cd25e0922c7af66a71a7bd7c1da /gcc
parent441c1d06b9b4c311eb599c9cf45cc2ce3b65b4b2 (diff)
downloadgcc-efc3154162fff62d71859ef7d30a5a1ff1a4ba53.zip
gcc-efc3154162fff62d71859ef7d30a5a1ff1a4ba53.tar.gz
gcc-efc3154162fff62d71859ef7d30a5a1ff1a4ba53.tar.bz2
gccrs: make distinction between error and empty for substution args
When handling generics of only lifetimes we have an empty SubstitutionArgumentMappings which was being detected as an error but this is not the case as we don't currently handle const generics or generic lifetimes so this makes the distinction between an error occurred or its simply empty because it was all only lifetime arguments and we don't care about it. Addresses #2043 #2039 gcc/rust/ChangeLog: * typecheck/rust-tyty-bounds.cc (TypeBoundPredicate::TypeBoundPredicate): this is an empty (TypeBoundPredicate::operator=): likewise * typecheck/rust-tyty-subst.cc (SubstitutionArgumentMappings::empty): new interface (SubstitutionArgumentMappings::is_error): this marks it as an error * typecheck/rust-tyty-subst.h: update prototypes Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/typecheck/rust-tyty-bounds.cc8
-rw-r--r--gcc/rust/typecheck/rust-tyty-subst.cc20
-rw-r--r--gcc/rust/typecheck/rust-tyty-subst.h5
3 files changed, 23 insertions, 10 deletions
diff --git a/gcc/rust/typecheck/rust-tyty-bounds.cc b/gcc/rust/typecheck/rust-tyty-bounds.cc
index af9c5e2..0fb6e7d 100644
--- a/gcc/rust/typecheck/rust-tyty-bounds.cc
+++ b/gcc/rust/typecheck/rust-tyty-bounds.cc
@@ -271,7 +271,7 @@ namespace TyTy {
TypeBoundPredicate::TypeBoundPredicate (
const Resolver::TraitReference &trait_reference, Location locus)
- : SubstitutionRef ({}, SubstitutionArgumentMappings::error ()),
+ : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
reference (trait_reference.get_mappings ().get_defid ()), locus (locus),
error_flag (false)
{
@@ -286,7 +286,7 @@ TypeBoundPredicate::TypeBoundPredicate (
TypeBoundPredicate::TypeBoundPredicate (
DefId reference, std::vector<SubstitutionParamMapping> subst, Location locus)
- : SubstitutionRef ({}, SubstitutionArgumentMappings::error ()),
+ : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
reference (reference), locus (locus), error_flag (false)
{
substitutions.clear ();
@@ -299,7 +299,7 @@ TypeBoundPredicate::TypeBoundPredicate (
}
TypeBoundPredicate::TypeBoundPredicate (const TypeBoundPredicate &other)
- : SubstitutionRef ({}, SubstitutionArgumentMappings::error ()),
+ : SubstitutionRef ({}, SubstitutionArgumentMappings::empty ()),
reference (other.reference), locus (other.locus),
error_flag (other.error_flag)
{
@@ -337,7 +337,7 @@ TypeBoundPredicate::operator= (const TypeBoundPredicate &other)
reference = other.reference;
locus = other.locus;
error_flag = other.error_flag;
- used_arguments = SubstitutionArgumentMappings::error ();
+ used_arguments = SubstitutionArgumentMappings::empty ();
substitutions.clear ();
for (const auto &p : other.get_substs ())
diff --git a/gcc/rust/typecheck/rust-tyty-subst.cc b/gcc/rust/typecheck/rust-tyty-subst.cc
index db31ff9..60bf219 100644
--- a/gcc/rust/typecheck/rust-tyty-subst.cc
+++ b/gcc/rust/typecheck/rust-tyty-subst.cc
@@ -236,16 +236,17 @@ SubstitutionArg::as_string () const
SubstitutionArgumentMappings::SubstitutionArgumentMappings (
std::vector<SubstitutionArg> mappings,
std::map<std::string, BaseType *> binding_args, Location locus,
- ParamSubstCb param_subst_cb, bool trait_item_flag)
+ ParamSubstCb param_subst_cb, bool trait_item_flag, bool error_flag)
: mappings (mappings), binding_args (binding_args), locus (locus),
- param_subst_cb (param_subst_cb), trait_item_flag (trait_item_flag)
+ param_subst_cb (param_subst_cb), trait_item_flag (trait_item_flag),
+ error_flag (error_flag)
{}
SubstitutionArgumentMappings::SubstitutionArgumentMappings (
const SubstitutionArgumentMappings &other)
: mappings (other.mappings), binding_args (other.binding_args),
locus (other.locus), param_subst_cb (nullptr),
- trait_item_flag (other.trait_item_flag)
+ trait_item_flag (other.trait_item_flag), error_flag (other.error_flag)
{}
SubstitutionArgumentMappings &
@@ -257,6 +258,7 @@ SubstitutionArgumentMappings::operator= (
locus = other.locus;
param_subst_cb = nullptr;
trait_item_flag = other.trait_item_flag;
+ error_flag = other.error_flag;
return *this;
}
@@ -264,13 +266,21 @@ SubstitutionArgumentMappings::operator= (
SubstitutionArgumentMappings
SubstitutionArgumentMappings::error ()
{
- return SubstitutionArgumentMappings ({}, {}, Location (), nullptr, false);
+ return SubstitutionArgumentMappings ({}, {}, Location (), nullptr, false,
+ true);
+}
+
+SubstitutionArgumentMappings
+SubstitutionArgumentMappings::empty ()
+{
+ return SubstitutionArgumentMappings ({}, {}, Location (), nullptr, false,
+ false);
}
bool
SubstitutionArgumentMappings::is_error () const
{
- return mappings.size () == 0;
+ return error_flag;
}
bool
diff --git a/gcc/rust/typecheck/rust-tyty-subst.h b/gcc/rust/typecheck/rust-tyty-subst.h
index b5a4181..639a275 100644
--- a/gcc/rust/typecheck/rust-tyty-subst.h
+++ b/gcc/rust/typecheck/rust-tyty-subst.h
@@ -109,7 +109,8 @@ public:
std::map<std::string, BaseType *> binding_args,
Location locus,
ParamSubstCb param_subst_cb = nullptr,
- bool trait_item_flag = false);
+ bool trait_item_flag = false,
+ bool error_flag = false);
SubstitutionArgumentMappings (const SubstitutionArgumentMappings &other);
SubstitutionArgumentMappings &
@@ -120,6 +121,7 @@ public:
= default;
static SubstitutionArgumentMappings error ();
+ static SubstitutionArgumentMappings empty ();
bool is_error () const;
@@ -161,6 +163,7 @@ private:
Location locus;
ParamSubstCb param_subst_cb;
bool trait_item_flag;
+ bool error_flag;
};
class SubstitutionRef