diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-06-24 11:20:58 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2022-06-30 16:57:17 +0200 |
commit | 93f63a94d4389f31d5b225ad220ebea5f7288fb7 (patch) | |
tree | de1e4342203a3567c8a719c8d689a3a097abc71a /gcc/rust | |
parent | 49276efb07ef18098c0f72970acf523a1fc31eb8 (diff) | |
download | gcc-93f63a94d4389f31d5b225ad220ebea5f7288fb7.zip gcc-93f63a94d4389f31d5b225ad220ebea5f7288fb7.tar.gz gcc-93f63a94d4389f31d5b225ad220ebea5f7288fb7.tar.bz2 |
resolver: Add base for resolving const generic parameters
This commit adds a base for resolving the type and default expression of
const generic parameters.
For now, there is no disambiguation happening. So we are still
extremely limited.
For example, this structure gets its const generic parameter ignored and
unresolved because it looks like a type: Despite us knowing for sure
that the default expression here WILL be a constant expression.
```rust
const M: usize = 15;
struct Foo<const N: usize = M>;
```
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-item.cc | 95 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-item.h | 11 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-stmt.cc | 2 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-stmt.h | 26 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-type.h | 27 |
5 files changed, 67 insertions, 94 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc index 1ad91af..62518b6 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.cc +++ b/gcc/rust/resolve/rust-ast-resolve-item.cc @@ -73,10 +73,8 @@ ResolveTraitItems::visit (AST::TraitItemFunc &func) AST::TraitFunctionDecl &function = func.get_trait_function_decl (); if (function.has_generics ()) - { - for (auto &generic : function.get_generic_params ()) - ResolveGenericParam::go (generic.get ()); - } + for (auto &generic : function.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (function.has_return_type ()) ResolveType::go (function.get_return_type ().get ()); @@ -122,10 +120,8 @@ ResolveTraitItems::visit (AST::TraitItemMethod &func) AST::TraitMethodDecl &function = func.get_trait_method_decl (); if (function.has_generics ()) - { - for (auto &generic : function.get_generic_params ()) - ResolveGenericParam::go (generic.get ()); - } + for (auto &generic : function.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (function.has_return_type ()) ResolveType::go (function.get_return_type ().get ()); @@ -210,10 +206,8 @@ ResolveItem::visit (AST::TypeAlias &alias) resolver->get_type_scope ().push (scope_node_id); if (alias.has_generics ()) - { - for (auto &generic : alias.get_generic_params ()) - ResolveGenericParam::go (generic.get ()); - } + for (auto &generic : alias.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (alias.has_where_clause ()) ResolveWhereClause::Resolve (alias.get_where_clause ()); @@ -274,12 +268,8 @@ ResolveItem::visit (AST::TupleStruct &struct_decl) resolver->get_type_scope ().push (scope_node_id); if (struct_decl.has_generics ()) - { - for (auto &generic : struct_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } - } + for (auto &generic : struct_decl.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (struct_decl.has_where_clause ()) ResolveWhereClause::Resolve (struct_decl.get_where_clause ()); @@ -313,12 +303,8 @@ ResolveItem::visit (AST::Enum &enum_decl) resolver->get_type_scope ().push (scope_node_id); if (enum_decl.has_generics ()) - { - for (auto &generic : enum_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } - } + for (auto &generic : enum_decl.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, cpath); if (enum_decl.has_where_clause ()) ResolveWhereClause::Resolve (enum_decl.get_where_clause ()); @@ -411,12 +397,8 @@ ResolveItem::visit (AST::StructStruct &struct_decl) resolver->get_type_scope ().push (scope_node_id); if (struct_decl.has_generics ()) - { - for (auto &generic : struct_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } - } + for (auto &generic : struct_decl.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (struct_decl.has_where_clause ()) ResolveWhereClause::Resolve (struct_decl.get_where_clause ()); @@ -450,12 +432,8 @@ ResolveItem::visit (AST::Union &union_decl) resolver->get_type_scope ().push (scope_node_id); if (union_decl.has_generics ()) - { - for (auto &generic : union_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } - } + for (auto &generic : union_decl.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (union_decl.has_where_clause ()) ResolveWhereClause::Resolve (union_decl.get_where_clause ()); @@ -523,10 +501,8 @@ ResolveItem::visit (AST::Function &function) resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); if (function.has_generics ()) - { - for (auto &generic : function.get_generic_params ()) - ResolveGenericParam::go (generic.get ()); - } + for (auto &generic : function.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); // resolve any where clause items if (function.has_where_clause ()) @@ -566,12 +542,8 @@ ResolveItem::visit (AST::InherentImpl &impl_block) resolve_visibility (impl_block.get_visibility ()); if (impl_block.has_generics ()) - { - for (auto &generic : impl_block.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } - } + for (auto &generic : impl_block.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); // resolve any where clause items if (impl_block.has_where_clause ()) @@ -657,10 +629,8 @@ ResolveItem::visit (AST::Method &method) resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); if (method.has_generics ()) - { - for (auto &generic : method.get_generic_params ()) - ResolveGenericParam::go (generic.get ()); - } + for (auto &generic : method.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); // resolve any where clause items if (method.has_where_clause ()) @@ -719,12 +689,8 @@ ResolveItem::visit (AST::TraitImpl &impl_block) resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); if (impl_block.has_generics ()) - { - for (auto &generic : impl_block.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } - } + for (auto &generic : impl_block.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); // resolve any where clause items if (impl_block.has_where_clause ()) @@ -836,9 +802,7 @@ ResolveItem::visit (AST::Trait &trait) CanonicalPath Self = CanonicalPath::get_big_self (trait.get_node_id ()); for (auto &generic : trait.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); // Self is an implicit TypeParam so lets mark it as such resolver->get_type_scope ().append_reference_for_def ( @@ -900,7 +864,7 @@ ResolveItem::resolve_impl_item (AST::InherentImplItem *item, void ResolveItem::resolve_extern_item (AST::ExternalItem *item) { - ResolveExternItem::go (item); + ResolveExternItem::go (item, prefix, canonical_prefix); } static void @@ -1070,9 +1034,10 @@ ResolveImplItems::visit (AST::TypeAlias &alias) } void -ResolveExternItem::go (AST::ExternalItem *item) +ResolveExternItem::go (AST::ExternalItem *item, const CanonicalPath &prefix, + const CanonicalPath &canonical_prefix) { - ResolveExternItem resolver; + ResolveExternItem resolver (prefix, canonical_prefix); item->accept_vis (resolver); } @@ -1092,10 +1057,8 @@ ResolveExternItem::visit (AST::ExternalFunctionItem &function) // resolve the generics if (function.has_generics ()) - { - for (auto &generic : function.get_generic_params ()) - ResolveGenericParam::go (generic.get ()); - } + for (auto &generic : function.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (function.has_return_type ()) ResolveType::go (function.get_return_type ().get ()); diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h index 2824d09..ce521f0 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.h +++ b/gcc/rust/resolve/rust-ast-resolve-item.h @@ -118,13 +118,20 @@ class ResolveExternItem : public ResolverBase using Rust::Resolver::ResolverBase::visit; public: - static void go (AST::ExternalItem *item); + static void go (AST::ExternalItem *item, const CanonicalPath &prefix, + const CanonicalPath &canonical_prefix); void visit (AST::ExternalFunctionItem &function) override; void visit (AST::ExternalStaticItem &item) override; private: - ResolveExternItem () : ResolverBase () {} + ResolveExternItem (const CanonicalPath &prefix, + const CanonicalPath &canonical_prefix) + : ResolverBase (), prefix (prefix), canonical_prefix (canonical_prefix) + {} + + const CanonicalPath &prefix; + const CanonicalPath &canonical_prefix; }; } // namespace Resolver diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.cc b/gcc/rust/resolve/rust-ast-resolve-stmt.cc index 6fc929f..1ce3df0 100644 --- a/gcc/rust/resolve/rust-ast-resolve-stmt.cc +++ b/gcc/rust/resolve/rust-ast-resolve-stmt.cc @@ -30,7 +30,7 @@ ResolveStmt::visit (AST::ExternBlock &extern_block) { ResolveToplevelExternItem::go (item.get (), CanonicalPath::create_empty ()); - ResolveExternItem::go (item.get ()); + ResolveExternItem::go (item.get (), prefix, canonical_prefix); } } diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h b/gcc/rust/resolve/rust-ast-resolve-stmt.h index 202a280..8867845 100644 --- a/gcc/rust/resolve/rust-ast-resolve-stmt.h +++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h @@ -111,9 +111,7 @@ public: if (struct_decl.has_generics ()) { for (auto &generic : struct_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); } for (AST::TupleField &field : struct_decl.get_fields ()) @@ -145,9 +143,7 @@ public: if (enum_decl.has_generics ()) { for (auto &generic : enum_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); } for (auto &variant : enum_decl.get_variants ()) @@ -271,9 +267,7 @@ public: if (struct_decl.has_generics ()) { for (auto &generic : struct_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); } for (AST::StructField &field : struct_decl.get_fields ()) @@ -308,12 +302,8 @@ public: resolver->get_type_scope ().push (scope_node_id); if (union_decl.has_generics ()) - { - for (auto &generic : union_decl.get_generic_params ()) - { - ResolveGenericParam::go (generic.get ()); - } - } + for (auto &generic : union_decl.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); for (AST::StructField &field : union_decl.get_variants ()) { @@ -352,10 +342,8 @@ public: resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); if (function.has_generics ()) - { - for (auto &generic : function.get_generic_params ()) - ResolveGenericParam::go (generic.get ()); - } + for (auto &generic : function.get_generic_params ()) + ResolveGenericParam::go (generic.get (), prefix, canonical_prefix); if (function.has_return_type ()) ResolveType::go (function.get_return_type ().get ()); diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h index 965df42..946cdd4 100644 --- a/gcc/rust/resolve/rust-ast-resolve-type.h +++ b/gcc/rust/resolve/rust-ast-resolve-type.h @@ -20,6 +20,7 @@ #define RUST_AST_RESOLVE_TYPE_H #include "rust-ast-resolve-base.h" +#include "rust-ast-resolve-expr.h" #include "rust-ast-full.h" namespace Rust { @@ -146,17 +147,23 @@ class ResolveGenericParam : public ResolverBase using Rust::Resolver::ResolverBase::visit; public: - static NodeId go (AST::GenericParam *param) + static NodeId go (AST::GenericParam *param, const CanonicalPath &prefix, + const CanonicalPath &canonical_prefix) { - ResolveGenericParam resolver; + ResolveGenericParam resolver (prefix, canonical_prefix); param->accept_vis (resolver); return resolver.resolved_node; } - void visit (AST::ConstGenericParam &) override + void visit (AST::ConstGenericParam ¶m) override { - // For now do not do anything and accept everything. - // FIXME: This needs to change soon! + ResolveType::go (param.get_type ().get ()); + + if (param.has_default_value ()) + ResolveExpr::go (param.get_default_value ().get_expression ().get (), + prefix, canonical_prefix); + + ok = true; } void visit (AST::TypeParam ¶m) override @@ -188,7 +195,15 @@ public: } private: - ResolveGenericParam () : ResolverBase () {} + ResolveGenericParam (const CanonicalPath &prefix, + const CanonicalPath &canonical_prefix) + : ResolverBase (), ok (false), prefix (prefix), + canonical_prefix (canonical_prefix) + {} + + bool ok; + const CanonicalPath &prefix; + const CanonicalPath &canonical_prefix; }; class ResolveWhereClause : public ResolverBase |