diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-07-08 10:28:15 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-07-08 12:11:19 +0200 |
commit | 43cd742e348d376ed4e7e0375b23289286525c8a (patch) | |
tree | e1afd9eb89f45c2aa15ea964586d196984104a1d | |
parent | 64f69dbca26c2d76da569b4a09dd3541a85652b0 (diff) | |
download | gcc-43cd742e348d376ed4e7e0375b23289286525c8a.zip gcc-43cd742e348d376ed4e7e0375b23289286525c8a.tar.gz gcc-43cd742e348d376ed4e7e0375b23289286525c8a.tar.bz2 |
typecheck: Add base for resolving const generic params and their default
expression
-rw-r--r-- | gcc/rust/hir/tree/rust-hir.h | 10 | ||||
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-toplevel.cc | 20 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/const_generics_6.rs | 2 |
3 files changed, 30 insertions, 2 deletions
diff --git a/gcc/rust/hir/tree/rust-hir.h b/gcc/rust/hir/tree/rust-hir.h index ff4c39e..58f4db2 100644 --- a/gcc/rust/hir/tree/rust-hir.h +++ b/gcc/rust/hir/tree/rust-hir.h @@ -769,6 +769,16 @@ public: Location get_locus () const override final { return locus; }; + bool has_default_expression () { return default_expression != nullptr; } + + std::unique_ptr<Type> &get_type () { return type; } + std::unique_ptr<Expr> &get_default_expression () + { + rust_assert (has_default_expression ()); + + return default_expression; + } + protected: /* Use covariance to implement clone function as returning this object rather * than base */ diff --git a/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc b/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc index e46d312..e242539 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-toplevel.cc @@ -38,10 +38,26 @@ TypeCheckTopLevel::resolve_generic_params ( switch (generic_param.get ()->get_kind ()) { case HIR::GenericParam::GenericKind::LIFETIME: - case HIR::GenericParam::GenericKind::CONST: - // FIXME: Skipping Lifetime and Const completely until better + // 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 diff --git a/gcc/testsuite/rust/compile/const_generics_6.rs b/gcc/testsuite/rust/compile/const_generics_6.rs new file mode 100644 index 0000000..de26123 --- /dev/null +++ b/gcc/testsuite/rust/compile/const_generics_6.rs @@ -0,0 +1,2 @@ +struct Foo<const N: usize>; +struct Bar<const N: usize = { 15i32 }>; // { dg-error "expected .usize. got .i32." } |