aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-06-30 15:52:01 +0000
committerGitHub <noreply@github.com>2022-06-30 15:52:01 +0000
commit33912c1a08d3892d3c72506aed38771754b9cf54 (patch)
treede1e4342203a3567c8a719c8d689a3a097abc71a /gcc/rust/resolve
parent81abc8623cb75fa18315c65e94c5965ec36fdb54 (diff)
parent93f63a94d4389f31d5b225ad220ebea5f7288fb7 (diff)
downloadgcc-33912c1a08d3892d3c72506aed38771754b9cf54.zip
gcc-33912c1a08d3892d3c72506aed38771754b9cf54.tar.gz
gcc-33912c1a08d3892d3c72506aed38771754b9cf54.tar.bz2
Merge #1336
1336: Resolve const generic parameters r=CohenArthur a=CohenArthur Fixes #1319. This can only resolve the simpler test cases: Anything that is ambiguous is ignored and does not get resolved. This will be fixed very soon :) Co-authored-by: Arthur Cohen <arthur.cohen@embecosm.com>
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