aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-08-10 14:47:44 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-08-11 09:52:13 +0100
commit630ef83dfc9a62ef0b0b822b34bfd7e3389b909d (patch)
tree1fc92e4faca93c9b0b543f79314bfe5b0ec30608
parenteca2ac2c23e0c8b438fd696d4f85e35c9210d8dd (diff)
downloadgcc-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.cc46
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-base.h4
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-toplevel.cc44
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-toplevel.h4
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