aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2024-11-06 16:32:35 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2025-03-21 12:33:13 +0100
commit5d79fbd65ccaf51afa90cab5454b3f6f5b0e6f75 (patch)
tree7a224ceaeeb98b238a7ad5f56d83a9d88bd90317
parent081828243086965b3882489ffc36216c1d7b3cb0 (diff)
downloadgcc-5d79fbd65ccaf51afa90cab5454b3f6f5b0e6f75.zip
gcc-5d79fbd65ccaf51afa90cab5454b3f6f5b0e6f75.tar.gz
gcc-5d79fbd65ccaf51afa90cab5454b3f6f5b0e6f75.tar.bz2
gccrs: hir: Start adapting visitors to accept multiple kinds of Paths
gcc/rust/ChangeLog: * ast/rust-item.h: Add new method to specifically get a type-path. * ast/rust-path.cc (LangItemPath::as_string): Implement properly. * hir/rust-ast-lower-type.cc (ASTLowerTypePath::translate): Adapt visitor to use the new LangItemPath. * hir/rust-ast-lower-type.h: Likewise. * resolve/rust-ast-resolve-item.cc (ResolveItem::visit): Likewise. * resolve/rust-ast-resolve-type.h: Likewise.
-rw-r--r--gcc/rust/ast/rust-item.h7
-rw-r--r--gcc/rust/ast/rust-path.cc3
-rw-r--r--gcc/rust/hir/rust-ast-lower-type.cc9
-rw-r--r--gcc/rust/hir/rust-ast-lower-type.h1
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-item.cc2
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.h28
6 files changed, 47 insertions, 3 deletions
diff --git a/gcc/rust/ast/rust-item.h b/gcc/rust/ast/rust-item.h
index a6276a72..dca4aab 100644
--- a/gcc/rust/ast/rust-item.h
+++ b/gcc/rust/ast/rust-item.h
@@ -3264,6 +3264,13 @@ public:
return *trait_path;
}
+ Type &get_trait_path_type ()
+ {
+ rust_assert (trait_path->get_path_kind () == Path::Kind::Type);
+
+ return (AST::Type &) static_cast<AST::TypePath &> (*trait_path);
+ }
+
protected:
/* Use covariance to implement clone function as returning this object
* rather than base */
diff --git a/gcc/rust/ast/rust-path.cc b/gcc/rust/ast/rust-path.cc
index 06c98cd..94cf2bb 100644
--- a/gcc/rust/ast/rust-path.cc
+++ b/gcc/rust/ast/rust-path.cc
@@ -152,8 +152,7 @@ RegularPath::as_string () const
std::string
LangItemPath::as_string () const
{
- // FIXME: Handle #[lang] paths
- rust_unreachable ();
+ return "#[lang = \"" + LangItem::ToString (kind) + "\"]";
}
SimplePath
diff --git a/gcc/rust/hir/rust-ast-lower-type.cc b/gcc/rust/hir/rust-ast-lower-type.cc
index 58c93b9..c09d60f 100644
--- a/gcc/rust/hir/rust-ast-lower-type.cc
+++ b/gcc/rust/hir/rust-ast-lower-type.cc
@@ -19,11 +19,20 @@
#include "rust-ast-lower-type.h"
#include "optional.h"
#include "rust-attribute-values.h"
+#include "rust-path.h"
namespace Rust {
namespace HIR {
HIR::TypePath *
+ASTLowerTypePath::translate (AST::Path &type)
+{
+ rust_assert (type.get_path_kind () == AST::Path::Kind::Type);
+
+ return ASTLowerTypePath::translate (static_cast<AST::TypePath &> (type));
+}
+
+HIR::TypePath *
ASTLowerTypePath::translate (AST::TypePath &type)
{
ASTLowerTypePath resolver;
diff --git a/gcc/rust/hir/rust-ast-lower-type.h b/gcc/rust/hir/rust-ast-lower-type.h
index 5bb9a7e..72c6b29 100644
--- a/gcc/rust/hir/rust-ast-lower-type.h
+++ b/gcc/rust/hir/rust-ast-lower-type.h
@@ -31,6 +31,7 @@ protected:
using Rust::HIR::ASTLoweringBase::visit;
public:
+ static HIR::TypePath *translate (AST::Path &type);
static HIR::TypePath *translate (AST::TypePath &type);
void visit (AST::TypePathSegmentFunction &segment) override;
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.cc b/gcc/rust/resolve/rust-ast-resolve-item.cc
index 245523a..a330541 100644
--- a/gcc/rust/resolve/rust-ast-resolve-item.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-item.cc
@@ -680,7 +680,7 @@ ResolveItem::visit (AST::TraitImpl &impl_block)
// setup paths
CanonicalPath canonical_trait_type = CanonicalPath::create_empty ();
- bool ok = ResolveTypeToCanonicalPath::go (impl_block.get_trait_path (),
+ bool ok = ResolveTypeToCanonicalPath::go (impl_block.get_trait_path_type (),
canonical_trait_type);
if (!ok)
{
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h
index 561948e..ed055a1 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.h
+++ b/gcc/rust/resolve/rust-ast-resolve-type.h
@@ -21,6 +21,8 @@
#include "rust-ast-resolve-base.h"
#include "rust-ast-resolve-expr.h"
+#include "rust-hir-map.h"
+#include "rust-path.h"
namespace Rust {
namespace Resolver {
@@ -56,6 +58,32 @@ class ResolveType : public ResolverBase
using Rust::Resolver::ResolverBase::visit;
public:
+ static NodeId go (AST::TypePath &type_path)
+ {
+ return ResolveType::go ((AST::Type &) type_path);
+ }
+
+ static NodeId go (AST::Path &type_path)
+ {
+ if (type_path.get_path_kind () == AST::Path::Kind::LangItem)
+ {
+ auto &type = static_cast<AST::LangItemPath &> (type_path);
+
+ Analysis::Mappings::get_lang_item (type);
+
+ type.get_node_id ();
+ }
+
+ rust_assert (type_path.get_path_kind () == AST::Path::Kind::Type);
+
+ // We have to do this dance to first downcast to a typepath, and then upcast
+ // to a Type. The altnernative is to split `go` into `go` and `go_inner` or
+ // something, but eventually this will need to change as we'll need
+ // `ResolveType::` to resolve other kinds of `Path`s as well.
+ return ResolveType::go (
+ (AST::Type &) static_cast<AST::TypePath &> (type_path));
+ }
+
static NodeId go (AST::Type &type)
{
ResolveType resolver;