diff options
author | Philip Herron <philip.herron@embecosm.com> | 2022-08-10 14:47:44 +0100 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2022-08-11 09:52:13 +0100 |
commit | 630ef83dfc9a62ef0b0b822b34bfd7e3389b909d (patch) | |
tree | 1fc92e4faca93c9b0b543f79314bfe5b0ec30608 | |
parent | eca2ac2c23e0c8b438fd696d4f85e35c9210d8dd (diff) | |
download | gcc-630ef83dfc9a62ef0b0b822b34bfd7e3389b909d.zip gcc-630ef83dfc9a62ef0b0b822b34bfd7e3389b909d.tar.gz gcc-630ef83dfc9a62ef0b0b822b34bfd7e3389b909d.tar.bz2 |
Refactor helper from TypeCheckResolveToplevel
The reason we cannot type-resolve forward declared items is due to the
fact our type-resolver runs in a toplevel pass trying to type resolve as
best it can but when we hit structs for example which contain types that
are forward declared they need to be resolved in a query based manar. We
have all the missing pieces to do this now and this means we need to get
rid of this toplevel pass as the starting point.
Addresses #1455
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-base.cc | 46 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-base.h | 4 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-toplevel.cc | 44 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-toplevel.h | 4 |
4 files changed, 50 insertions, 48 deletions
diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.cc b/gcc/rust/typecheck/rust-hir-type-check-base.cc index c501998..e263056 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-base.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-base.cc @@ -17,6 +17,8 @@ // <http://www.gnu.org/licenses/>. #include "rust-hir-type-check-base.h" +#include "rust-hir-type-check-type.h" +#include "rust-hir-type-check-expr.h" #include "rust-coercion.h" namespace Rust { @@ -349,5 +351,49 @@ TypeCheckBase::coercion_site (HirId id, TyTy::BaseType *expected, return expected->coerce (expr); } +void +TypeCheckBase::resolve_generic_params ( + const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params, + std::vector<TyTy::SubstitutionParamMapping> &substitutions) +{ + for (auto &generic_param : generic_params) + { + switch (generic_param.get ()->get_kind ()) + { + case HIR::GenericParam::GenericKind::LIFETIME: + // FIXME: Skipping Lifetime completely until better + // handling. + break; + case HIR::GenericParam::GenericKind::CONST: { + auto param + = static_cast<HIR::ConstGenericParam *> (generic_param.get ()); + auto specified_type + = TypeCheckType::Resolve (param->get_type ().get ()); + + if (param->has_default_expression ()) + { + auto expr_type = TypeCheckExpr::Resolve ( + param->get_default_expression ().get ()); + specified_type->coerce (expr_type); + } + + context->insert_type (generic_param->get_mappings (), + specified_type); + } + break; + + case HIR::GenericParam::GenericKind::TYPE: { + auto param_type + = TypeResolveGenericParam::Resolve (generic_param.get ()); + context->insert_type (generic_param->get_mappings (), param_type); + + substitutions.push_back (TyTy::SubstitutionParamMapping ( + static_cast<HIR::TypeParam &> (*generic_param), param_type)); + } + break; + } + } +} + } // namespace Resolver } // namespace Rust diff --git a/gcc/rust/typecheck/rust-hir-type-check-base.h b/gcc/rust/typecheck/rust-hir-type-check-base.h index 4078697..b6f4b63 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-base.h +++ b/gcc/rust/typecheck/rust-hir-type-check-base.h @@ -64,6 +64,10 @@ protected: TyTy::ADTType::ReprOptions parse_repr_options (const AST::AttrVec &attrs, Location locus); + void resolve_generic_params ( + const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params, + std::vector<TyTy::SubstitutionParamMapping> &substitutions); + Analysis::Mappings *mappings; Resolver *resolver; TypeCheckContext *context; diff --git a/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc b/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc index 69377e2..d5270c9 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc @@ -29,50 +29,6 @@ TypeCheckTopLevel::Resolve (HIR::Item *item) } void -TypeCheckTopLevel::resolve_generic_params ( - const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params, - std::vector<TyTy::SubstitutionParamMapping> &substitutions) -{ - for (auto &generic_param : generic_params) - { - switch (generic_param.get ()->get_kind ()) - { - case HIR::GenericParam::GenericKind::LIFETIME: - // FIXME: Skipping Lifetime completely until better - // handling. - break; - case HIR::GenericParam::GenericKind::CONST: { - auto param - = static_cast<HIR::ConstGenericParam *> (generic_param.get ()); - auto specified_type - = TypeCheckType::Resolve (param->get_type ().get ()); - - if (param->has_default_expression ()) - { - auto expr_type = TypeCheckExpr::Resolve ( - param->get_default_expression ().get ()); - specified_type->coerce (expr_type); - } - - context->insert_type (generic_param->get_mappings (), - specified_type); - } - break; - - case HIR::GenericParam::GenericKind::TYPE: { - auto param_type - = TypeResolveGenericParam::Resolve (generic_param.get ()); - context->insert_type (generic_param->get_mappings (), param_type); - - substitutions.push_back (TyTy::SubstitutionParamMapping ( - static_cast<HIR::TypeParam &> (*generic_param), param_type)); - } - break; - } - } -} - -void TypeCheckTopLevel::visit (HIR::TypeAlias &alias) { TyTy::BaseType *actual_type diff --git a/gcc/rust/typecheck/rust-hir-type-check-toplevel.h b/gcc/rust/typecheck/rust-hir-type-check-toplevel.h index fdc13f7..d2785b1 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-toplevel.h +++ b/gcc/rust/typecheck/rust-hir-type-check-toplevel.h @@ -51,10 +51,6 @@ public: private: TypeCheckTopLevel () : TypeCheckBase () {} - - void resolve_generic_params ( - const std::vector<std::unique_ptr<HIR::GenericParam>> &generic_params, - std::vector<TyTy::SubstitutionParamMapping> &substitutions); }; } // namespace Resolver |