aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-10-05 17:22:43 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2023-02-21 12:36:32 +0100
commit79434fabf762d60b7aa54e2319c44c1610dd8065 (patch)
tree0167db1d252b7420e0d7a5d69cee7768013cec01 /gcc/rust
parent00e0684a78a37549eef89d3f445e2129cb90a5d9 (diff)
downloadgcc-79434fabf762d60b7aa54e2319c44c1610dd8065.zip
gcc-79434fabf762d60b7aa54e2319c44c1610dd8065.tar.gz
gcc-79434fabf762d60b7aa54e2319c44c1610dd8065.tar.bz2
gccrs: Track DefId on ADT variants
We must track the DefID on variants for algebraic data types as this will allow us to enforce unique'ness on path queries relating to this. gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-enumitem.cc (TypeCheckEnumItem::visit): Adjust VariantDef ctor calls with DefID. * typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): Likewise. * typecheck/rust-tyty.h (VariantDef): Add defid parameter to ctor.
Diffstat (limited to 'gcc/rust')
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-enumitem.cc4
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-item.cc9
-rw-r--r--gcc/rust/typecheck/rust-tyty.h22
3 files changed, 22 insertions, 13 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc b/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
index dd3cb12..30db967 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-enumitem.cc
@@ -82,6 +82,7 @@ TypeCheckEnumItem::visit (HIR::EnumItem &item)
RustIdent ident{*canonical_path, item.get_locus ()};
variant = new TyTy::VariantDef (item.get_mappings ().get_hirid (),
+ item.get_mappings ().get_defid (),
item.get_identifier (), ident, discim_expr);
}
@@ -111,6 +112,7 @@ TypeCheckEnumItem::visit (HIR::EnumItemDiscriminant &item)
RustIdent ident{*canonical_path, item.get_locus ()};
variant = new TyTy::VariantDef (item.get_mappings ().get_hirid (),
+ item.get_mappings ().get_defid (),
item.get_identifier (), ident,
item.get_discriminant_expression ().get ());
}
@@ -159,6 +161,7 @@ TypeCheckEnumItem::visit (HIR::EnumItemTuple &item)
RustIdent ident{*canonical_path, item.get_locus ()};
variant = new TyTy::VariantDef (item.get_mappings ().get_hirid (),
+ item.get_mappings ().get_defid (),
item.get_identifier (), ident,
TyTy::VariantDef::VariantType::TUPLE,
discim_expr, fields);
@@ -206,6 +209,7 @@ TypeCheckEnumItem::visit (HIR::EnumItemStruct &item)
RustIdent ident{*canonical_path, item.get_locus ()};
variant = new TyTy::VariantDef (item.get_mappings ().get_hirid (),
+ item.get_mappings ().get_defid (),
item.get_identifier (), ident,
TyTy::VariantDef::VariantType::STRUCT,
discrim_expr, fields);
diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc b/gcc/rust/typecheck/rust-hir-type-check-item.cc
index e39dd53..af1e396 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-item.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc
@@ -125,7 +125,8 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl)
// its a single variant ADT
std::vector<TyTy::VariantDef *> variants;
variants.push_back (new TyTy::VariantDef (
- struct_decl.get_mappings ().get_hirid (), struct_decl.get_identifier (),
+ struct_decl.get_mappings ().get_hirid (),
+ struct_decl.get_mappings ().get_defid (), struct_decl.get_identifier (),
ident, TyTy::VariantDef::VariantType::TUPLE, nullptr, std::move (fields)));
// Process #[repr(X)] attribute, if any
@@ -179,7 +180,8 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl)
// its a single variant ADT
std::vector<TyTy::VariantDef *> variants;
variants.push_back (new TyTy::VariantDef (
- struct_decl.get_mappings ().get_hirid (), struct_decl.get_identifier (),
+ struct_decl.get_mappings ().get_hirid (),
+ struct_decl.get_mappings ().get_defid (), struct_decl.get_identifier (),
ident, TyTy::VariantDef::VariantType::STRUCT, nullptr, std::move (fields)));
// Process #[repr(X)] attribute, if any
@@ -273,7 +275,8 @@ TypeCheckItem::visit (HIR::Union &union_decl)
// there is only a single variant
std::vector<TyTy::VariantDef *> variants;
variants.push_back (new TyTy::VariantDef (
- union_decl.get_mappings ().get_hirid (), union_decl.get_identifier (),
+ union_decl.get_mappings ().get_hirid (),
+ union_decl.get_mappings ().get_defid (), union_decl.get_identifier (),
ident, TyTy::VariantDef::VariantType::STRUCT, nullptr, std::move (fields)));
TyTy::BaseType *type
diff --git a/gcc/rust/typecheck/rust-tyty.h b/gcc/rust/typecheck/rust-tyty.h
index e3cf4d6..a033fca 100644
--- a/gcc/rust/typecheck/rust-tyty.h
+++ b/gcc/rust/typecheck/rust-tyty.h
@@ -1063,9 +1063,9 @@ public:
return "";
}
- VariantDef (HirId id, std::string identifier, RustIdent ident,
+ VariantDef (HirId id, DefId defid, std::string identifier, RustIdent ident,
HIR::Expr *discriminant)
- : id (id), identifier (identifier), ident (ident),
+ : id (id), defid (defid), identifier (identifier), ident (ident),
discriminant (discriminant)
{
@@ -1073,11 +1073,11 @@ public:
fields = {};
}
- VariantDef (HirId id, std::string identifier, RustIdent ident,
+ VariantDef (HirId id, DefId defid, std::string identifier, RustIdent ident,
VariantType type, HIR::Expr *discriminant,
std::vector<StructFieldType *> fields)
- : id (id), identifier (identifier), ident (ident), type (type),
- discriminant (discriminant), fields (fields)
+ : id (id), defid (defid), identifier (identifier), ident (ident),
+ type (type), discriminant (discriminant), fields (fields)
{
rust_assert (
(type == VariantType::NUM && fields.empty ())
@@ -1085,8 +1085,8 @@ public:
}
VariantDef (const VariantDef &other)
- : id (other.id), identifier (other.identifier), ident (other.ident),
- type (other.type), discriminant (other.discriminant),
+ : id (other.id), defid (other.defid), identifier (other.identifier),
+ ident (other.ident), type (other.type), discriminant (other.discriminant),
fields (other.fields)
{}
@@ -1105,7 +1105,7 @@ public:
static VariantDef &get_error_node ()
{
static VariantDef node
- = VariantDef (UNKNOWN_HIRID, "",
+ = VariantDef (UNKNOWN_HIRID, UNKNOWN_DEFID, "",
{Resolver::CanonicalPath::create_empty (),
Linemap::unknown_location ()},
nullptr);
@@ -1116,6 +1116,7 @@ public:
bool is_error () const { return get_id () == UNKNOWN_HIRID; }
HirId get_id () const { return id; }
+ DefId get_defid () const { return defid; }
VariantType get_variant_type () const { return type; }
bool is_data_variant () const { return type != VariantType::NUM; }
@@ -1211,7 +1212,7 @@ public:
for (auto &f : fields)
cloned_fields.push_back ((StructFieldType *) f->clone ());
- return new VariantDef (id, identifier, ident, type, discriminant,
+ return new VariantDef (id, defid, identifier, ident, type, discriminant,
cloned_fields);
}
@@ -1221,7 +1222,7 @@ public:
for (auto &f : fields)
cloned_fields.push_back ((StructFieldType *) f->monomorphized_clone ());
- return new VariantDef (id, identifier, ident, type, discriminant,
+ return new VariantDef (id, defid, identifier, ident, type, discriminant,
cloned_fields);
}
@@ -1229,6 +1230,7 @@ public:
private:
HirId id;
+ DefId defid;
std::string identifier;
RustIdent ident;
VariantType type;