public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] resolver: Add base for resolving const generic parameters
@ 2022-06-30 18:51 Thomas Schwinge
0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-06-30 18:51 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:93f63a94d4389f31d5b225ad220ebea5f7288fb7
commit 93f63a94d4389f31d5b225ad220ebea5f7288fb7
Author: Arthur Cohen <arthur.cohen@embecosm.com>
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<const N: usize = M>;
```
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<const N: usize = { M }>; // { dg-error "failed to find name: M" }
+struct Bar<const N: usize = { P }>;
+struct Baz<const N: NotAType = { P }>; // { dg-error "failed to resolve TypePath: NotAType in this scope" }
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-30 18:51 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-30 18:51 [gcc/devel/rust/master] resolver: Add base for resolving const generic parameters Thomas Schwinge
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).