From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1643) id 4AFD5383EC61; Thu, 30 Jun 2022 18:51:08 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4AFD5383EC61 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Thomas Schwinge To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/rust/master] resolver: Add base for resolving const generic parameters X-Act-Checkin: gcc X-Git-Author: Arthur Cohen X-Git-Refname: refs/heads/devel/rust/master X-Git-Oldrev: 49276efb07ef18098c0f72970acf523a1fc31eb8 X-Git-Newrev: 93f63a94d4389f31d5b225ad220ebea5f7288fb7 Message-Id: <20220630185108.4AFD5383EC61@sourceware.org> Date: Thu, 30 Jun 2022 18:51:08 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Jun 2022 18:51:08 -0000 https://gcc.gnu.org/g:93f63a94d4389f31d5b225ad220ebea5f7288fb7 commit 93f63a94d4389f31d5b225ad220ebea5f7288fb7 Author: Arthur Cohen Date: Fri Jun 24 11:20:58 2022 +0200 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; ``` Diff: --- gcc/rust/resolve/rust-ast-resolve-item.cc | 95 ++++++++------------------ gcc/rust/resolve/rust-ast-resolve-item.h | 11 ++- gcc/rust/resolve/rust-ast-resolve-stmt.cc | 2 +- gcc/rust/resolve/rust-ast-resolve-stmt.h | 26 ++----- gcc/rust/resolve/rust-ast-resolve-type.h | 27 ++++++-- gcc/testsuite/rust/compile/const_generics_4.rs | 7 ++ 6 files changed, 74 insertions(+), 94 deletions(-) diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc index 1ad91af3917..62518b6a403 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 2824d09a11e..ce521f057f6 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 6fc929f3e43..1ce3df0891c 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 202a280bb75..88678455211 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 965df42e6bf..946cdd4db18 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 diff --git a/gcc/testsuite/rust/compile/const_generics_4.rs b/gcc/testsuite/rust/compile/const_generics_4.rs new file mode 100644 index 00000000000..8a3754da433 --- /dev/null +++ b/gcc/testsuite/rust/compile/const_generics_4.rs @@ -0,0 +1,7 @@ +// { dg-additional-options "-w" } + +const P: usize = 14; + +struct Foo; // { dg-error "failed to find name: M" } +struct Bar; +struct Baz; // { dg-error "failed to resolve TypePath: NotAType in this scope" }