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 &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
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).