aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2022-06-24 11:20:58 +0200
committerArthur Cohen <arthur.cohen@embecosm.com>2022-06-30 16:57:17 +0200
commit93f63a94d4389f31d5b225ad220ebea5f7288fb7 (patch)
treede1e4342203a3567c8a719c8d689a3a097abc71a /gcc/rust/resolve
parent49276efb07ef18098c0f72970acf523a1fc31eb8 (diff)
downloadgcc-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/resolve')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.cc95
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.h11
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-stmt.cc2
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-stmt.h26
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.h27
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 &param) 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 &param) 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