diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-06-20 14:57:21 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-06-20 16:11:36 +0200 |
commit | 8f996567e84015714bcf322d11a46580611e3377 (patch) | |
tree | 75d3cf6b9c387a2a9aab9ee40895fb95b4570258 | |
parent | c0f11672d760513256997f325da678016d13f677 (diff) | |
download | gcc-8f996567e84015714bcf322d11a46580611e3377.zip gcc-8f996567e84015714bcf322d11a46580611e3377.tar.gz gcc-8f996567e84015714bcf322d11a46580611e3377.tar.bz2 |
hir: Add ConstGenericParam and lower to them properly
-rw-r--r-- | gcc/rust/ast/rust-ast.h | 3 | ||||
-rw-r--r-- | gcc/rust/hir/rust-ast-lower-type.h | 18 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir-full-test.cc | 15 | ||||
-rw-r--r-- | gcc/rust/hir/tree/rust-hir.h | 55 | ||||
-rw-r--r-- | gcc/rust/privacy/rust-reachability.cc | 2 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-trait-resolve.cc | 8 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-implitem.h | 8 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-item.h | 4 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-stmt.h | 20 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-toplevel.h | 24 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check.cc | 4 |
11 files changed, 131 insertions, 30 deletions
diff --git a/gcc/rust/ast/rust-ast.h b/gcc/rust/ast/rust-ast.h index b4d401c..76324dc 100644 --- a/gcc/rust/ast/rust-ast.h +++ b/gcc/rust/ast/rust-ast.h @@ -1381,6 +1381,9 @@ public: } bool has_type () { return type != nullptr; } + bool has_default_value () { return default_value != nullptr; } + + const Identifier &get_name () const { return name; } std::unique_ptr<AST::Type> &get_type () { diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h index 58ee560..dc20be7 100644 --- a/gcc/rust/hir/rust-ast-lower-type.h +++ b/gcc/rust/hir/rust-ast-lower-type.h @@ -375,13 +375,17 @@ public: mappings->get_next_hir_id (crate_num), mappings->get_next_localdef_id (crate_num)); - // FIXME: This creates a BOGUS HIR::Lifetime instance because we do not have - // an `HIR::ConstGenericParam` type yet. This needs to be removed, but for - // now it avoids bogus ICEs - HIR::Lifetime lt (mapping, AST::Lifetime::LifetimeType::WILDCARD, "fixme", - param.get_locus ()); - translated = new HIR::LifetimeParam (mapping, lt, param.get_locus (), - std::vector<Lifetime> ()); + auto type = ASTLoweringType::translate (param.get_type ().get ()); + auto default_expr + = param.has_default_value () + ? ASTLoweringExpr::translate (param.get_default_value ().get ()) + : nullptr; + + translated + = new HIR::ConstGenericParam (param.get_name (), + std::unique_ptr<Type> (type), + std::unique_ptr<Expr> (default_expr), + mapping, param.get_locus ()); } void visit (AST::TypeParam ¶m) override diff --git a/gcc/rust/hir/tree/rust-hir-full-test.cc b/gcc/rust/hir/tree/rust-hir-full-test.cc index b328a7f..8000e5c 100644 --- a/gcc/rust/hir/tree/rust-hir-full-test.cc +++ b/gcc/rust/hir/tree/rust-hir-full-test.cc @@ -5285,5 +5285,20 @@ StaticItem::accept_vis (HIRVisItemVisitor &vis) vis.visit (*this); } +std::string +ConstGenericParam::as_string () const +{ + auto result = "ConstGenericParam: " + name + " : " + type->as_string (); + + if (default_expression) + result += " = " + default_expression->as_string (); + + return result; +} + +void +ConstGenericParam::accept_vis (HIRFullVisitor &vis) +{} + } // namespace HIR } // namespace Rust diff --git a/gcc/rust/hir/tree/rust-hir.h b/gcc/rust/hir/tree/rust-hir.h index cab46b2..2267a1f 100644 --- a/gcc/rust/hir/tree/rust-hir.h +++ b/gcc/rust/hir/tree/rust-hir.h @@ -615,13 +615,11 @@ class GenericParam public: virtual ~GenericParam () {} - enum GenericKind + enum class GenericKind { TYPE, LIFETIME, - - // CONST generic parameter not yet handled - // CONST, + CONST, }; // Unique pointer custom clone function @@ -648,7 +646,8 @@ protected: enum GenericKind kind; - GenericParam (Analysis::NodeMapping mapping, enum GenericKind kind = TYPE) + GenericParam (Analysis::NodeMapping mapping, + enum GenericKind kind = GenericKind::TYPE) : mappings (mapping), kind (kind) {} }; @@ -732,6 +731,52 @@ protected: } }; +class ConstGenericParam : public GenericParam +{ +public: + ConstGenericParam (std::string name, std::unique_ptr<Type> type, + std::unique_ptr<Expr> default_expression, + Analysis::NodeMapping mapping, Location locus) + : GenericParam (mapping, GenericKind::CONST), name (std::move (name)), + type (std::move (type)), + default_expression (std::move (default_expression)), locus (locus) + {} + + ConstGenericParam (const ConstGenericParam &other) : GenericParam (other) + { + name = other.name; + locus = other.locus; + + if (other.type) + type = other.type->clone_type (); + if (other.default_expression) + default_expression = other.default_expression->clone_expr (); + } + + std::string as_string () const override final; + + void accept_vis (HIRFullVisitor &vis) override final; + + Location get_locus () const override final { return locus; }; + +protected: + /* Use covariance to implement clone function as returning this object rather + * than base */ + ConstGenericParam *clone_generic_param_impl () const override + { + return new ConstGenericParam (*this); + } + +private: + std::string name; + std::unique_ptr<Type> type; + + /* Optional - can be a null pointer if there is no default expression */ + std::unique_ptr<Expr> default_expression; + + Location locus; +}; + // Item used in trait declarations - abstract base class class TraitItem : public Node { diff --git a/gcc/rust/privacy/rust-reachability.cc b/gcc/rust/privacy/rust-reachability.cc index bf2480b..b322e29 100644 --- a/gcc/rust/privacy/rust-reachability.cc +++ b/gcc/rust/privacy/rust-reachability.cc @@ -48,7 +48,7 @@ ReachabilityVisitor::visit_generic_predicates ( for (const auto &generic : generics) { - if (generic->get_kind () == HIR::GenericParam::TYPE) + if (generic->get_kind () == HIR::GenericParam::GenericKind::TYPE) { TyTy::BaseType *generic_ty = nullptr; auto ok = ty_ctx.lookup_type (generic->get_mappings ().get_hirid (), diff --git a/gcc/rust/typecheck/rust-hir-trait-resolve.cc b/gcc/rust/typecheck/rust-hir-trait-resolve.cc index 7e87e1d..c008763 100644 --- a/gcc/rust/typecheck/rust-hir-trait-resolve.cc +++ b/gcc/rust/typecheck/rust-hir-trait-resolve.cc @@ -141,7 +141,9 @@ TraitResolver::resolve_trait (HIR::Trait *trait_reference) switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -383,7 +385,9 @@ AssociatedImplTrait::setup_associated_types ( switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.h b/gcc/rust/typecheck/rust-hir-type-check-implitem.h index c7af9b2..0bca9b4 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-implitem.h +++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.h @@ -57,7 +57,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -190,7 +192,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.h b/gcc/rust/typecheck/rust-hir-type-check-item.h index 8573335..84a33f8 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-item.h +++ b/gcc/rust/typecheck/rust-hir-type-check-item.h @@ -51,7 +51,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { diff --git a/gcc/rust/typecheck/rust-hir-type-check-stmt.h b/gcc/rust/typecheck/rust-hir-type-check-stmt.h index 96e92b4..67eddb5 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-stmt.h +++ b/gcc/rust/typecheck/rust-hir-type-check-stmt.h @@ -139,7 +139,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -215,7 +217,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -273,7 +277,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -347,7 +353,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -415,7 +423,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { diff --git a/gcc/rust/typecheck/rust-hir-type-check-toplevel.h b/gcc/rust/typecheck/rust-hir-type-check-toplevel.h index fe961d1..af63c5a 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-toplevel.h +++ b/gcc/rust/typecheck/rust-hir-type-check-toplevel.h @@ -64,7 +64,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -150,7 +152,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -228,7 +232,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -286,7 +292,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -374,7 +382,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { @@ -457,7 +467,9 @@ public: switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { diff --git a/gcc/rust/typecheck/rust-hir-type-check.cc b/gcc/rust/typecheck/rust-hir-type-check.cc index 1d26d60..7cfb952 100644 --- a/gcc/rust/typecheck/rust-hir-type-check.cc +++ b/gcc/rust/typecheck/rust-hir-type-check.cc @@ -203,7 +203,9 @@ TraitItemReference::get_type_from_fn (/*const*/ HIR::TraitItemFunc &fn) const switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - // Skipping Lifetime completely until better handling. + case HIR::GenericParam::GenericKind::CONST: + // FIXME: Skipping Lifetime and Const completely until better + // handling. break; case HIR::GenericParam::GenericKind::TYPE: { |