]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: late: Start setting up builtin types
authorArthur Cohen <arthur.cohen@embecosm.com>
Tue, 22 Aug 2023 14:58:28 +0000 (16:58 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 30 Jan 2024 11:36:45 +0000 (12:36 +0100)
gcc/rust/ChangeLog:

* resolve/rust-late-name-resolver-2.0.cc
(Late::setup_builtin_types): New function.
(Late::go): Setup builtin types.
* resolve/rust-late-name-resolver-2.0.h:
* resolve/rust-name-resolution-context.cc
(NameResolutionContext::map_usage): New function.
* resolve/rust-name-resolution-context.h: Likewise.

gcc/rust/resolve/rust-late-name-resolver-2.0.cc
gcc/rust/resolve/rust-late-name-resolver-2.0.h
gcc/rust/resolve/rust-name-resolution-context.cc
gcc/rust/resolve/rust-name-resolution-context.h

index 352d59b09205d5fe87aaabf4c91b7b5b3f6c5b65..3236886f37d42685ca3b74bdbe9c7d3346b3ea96 100644 (file)
 // along with GCC; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
+#include "optional.h"
 #include "rust-ast-full.h"
 #include "rust-late-name-resolver-2.0.h"
 #include "rust-default-resolver.h"
+#include "rust-tyty.h"
+#include "rust-hir-type-check.h"
 
 namespace Rust {
 namespace Resolver2_0 {
 
 Late::Late (NameResolutionContext &ctx) : DefaultResolver (ctx) {}
 
+void
+Late::setup_builtin_types ()
+{
+  auto next_id = [this] () { return ctx.mappings.get_next_hir_id (); };
+
+  static const std::pair<std::string, TyTy::BaseType *> builtins[] = {
+    {"u8", new TyTy::UintType (next_id (), TyTy::UintType::U8)},
+    {"u16", new TyTy::UintType (next_id (), TyTy::UintType::U16)},
+    {"u32", new TyTy::UintType (next_id (), TyTy::UintType::U32)},
+    {"u64", new TyTy::UintType (next_id (), TyTy::UintType::U64)},
+    {"u128", new TyTy::UintType (next_id (), TyTy::UintType::U128)},
+    {"i8", new TyTy::IntType (next_id (), TyTy::IntType::I8)},
+    {"i16", new TyTy::IntType (next_id (), TyTy::IntType::I16)},
+    {"i32", new TyTy::IntType (next_id (), TyTy::IntType::I32)},
+    {"i64", new TyTy::IntType (next_id (), TyTy::IntType::I64)},
+    {"i128", new TyTy::IntType (next_id (), TyTy::IntType::I128)},
+    {"f32", new TyTy::FloatType (next_id (), TyTy::FloatType::F32)},
+    {"f64", new TyTy::FloatType (next_id (), TyTy::FloatType::F64)},
+    {"usize", new TyTy::USizeType (next_id ())},
+    {"isize", new TyTy::ISizeType (next_id ())},
+    // missing char, str, never, ()
+    // does name resolution play a part for this? or is it all at typechecking?
+    // yeah it seems to be name resolution as well, which makes sense
+  };
+
+  for (const auto &builtin : builtins)
+    {
+      // we should be able to use `insert_at_root` or `insert` here, since we're
+      // at the root :) hopefully!
+      auto ok
+       = ctx.types.insert (builtin.first, builtin.second->get_ref ()
+                           /* FIXME: Invalid! This returns an *HirId* */);
+
+      rust_assert (ok);
+    }
+}
+
 void
 Late::go (AST::Crate &crate)
 {
+  setup_builtin_types ();
+
   for (auto &item : crate.items)
     item->accept_vis (*this);
 }
index 12540c0d22007c42267d1c6850637068bda28d27..f54bbf2eea4f677ea26bf0137fc85ae50a391190 100644 (file)
@@ -47,6 +47,8 @@ public:
   void visit (AST::PathInExpression &) override;
 
 private:
+  /* Setup Rust's builtin types (u8, i32, !...) in the resolver */
+  void setup_builtin_types ();
 };
 
 // TODO: Add missing mappings and data structures
index 8bb7a9a15c10b6e4e23cfacb88a7de87d9522f63..f71ef91505bd88def37a953ea80079b7170f0cd2 100644 (file)
@@ -43,6 +43,15 @@ NameResolutionContext::insert (Identifier name, NodeId id, Namespace ns)
     }
 }
 
+void
+NameResolutionContext::map_usage (NodeId usage, NodeId definition)
+{
+  auto inserted = resolved_nodes.emplace (usage, definition).second;
+
+  // is that valid?
+  rust_assert (inserted);
+}
+
 void
 NameResolutionContext::scoped (Rib rib, NodeId id,
                               std::function<void (void)> lambda,
index d63ee33378b8325e5ab82bb007f45c97fa945b18..7a1924581abdd7ab6afad38e06179d73549483a8 100644 (file)
@@ -19,7 +19,6 @@
 #ifndef RUST_NAME_RESOLVER_2_0_H
 #define RUST_NAME_RESOLVER_2_0_H
 
-#include "optional.h"
 #include "rust-forever-stack.h"
 #include "rust-hir-map.h"
 
@@ -179,6 +178,13 @@ public:
   ForeverStack<Namespace::Labels> labels;
 
   Analysis::Mappings &mappings;
+
+  // TODO: Rename
+  void map_usage (NodeId usage, NodeId definition);
+
+private:
+  /* Map of "usage" nodes which have been resolved to a "definition" node */
+  std::map<NodeId, NodeId> resolved_nodes;
 };
 
 } // namespace Resolver2_0