aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2022-07-08 10:28:15 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2022-07-08 12:11:19 +0200
commit43cd742e348d376ed4e7e0375b23289286525c8a (patch)
treee1afd9eb89f45c2aa15ea964586d196984104a1d
parent64f69dbca26c2d76da569b4a09dd3541a85652b0 (diff)
downloadgcc-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.h10
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-toplevel.cc20
-rw-r--r--gcc/testsuite/rust/compile/const_generics_6.rs2
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." }