public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/rust/master] Desugar HIR::IdentifierExpr into HIR::PathInExpression
@ 2022-08-13  8:42 Thomas Schwinge
  0 siblings, 0 replies; only message in thread
From: Thomas Schwinge @ 2022-08-13  8:42 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:d4ddd73b0b8ddd44204844a4d650424539335899

commit d4ddd73b0b8ddd44204844a4d650424539335899
Author: Philip Herron <philip.herron@embecosm.com>
Date:   Thu Aug 11 14:10:05 2022 +0100

    Desugar HIR::IdentifierExpr into HIR::PathInExpression
    
    This completly removes the HIR::IdentifierExpr and unifies how we handle
    generics in general. There was a hack from last year that did not infer
    generic arguments on IdentifierExpr's which leads to a type inferencing
    behvaiour mismatch which was becoming difficult to debug. This simplifies
    everything.
    
    The changes to the test case reflect making our code more compliant to
    real rustc apart from compile/traits3.rs which will be fixed as part of the
    refactoring effort going on in the type system.
    
    Fixes #1456

Diff:
---
 gcc/rust/backend/rust-compile-block.h              |   3 -
 gcc/rust/backend/rust-compile-expr.cc              | 120 ---------------------
 gcc/rust/backend/rust-compile-expr.h               |   2 -
 gcc/rust/backend/rust-compile-resolve-path.cc      |  15 +++
 gcc/rust/backend/rust-compile-struct-field-expr.h  |   1 -
 gcc/rust/backend/rust-compile.cc                   |  15 ++-
 .../checks/errors/privacy/rust-privacy-reporter.cc |   4 -
 .../checks/errors/privacy/rust-privacy-reporter.h  |   1 -
 gcc/rust/checks/errors/rust-const-checker.cc       |   4 -
 gcc/rust/checks/errors/rust-const-checker.h        |   1 -
 gcc/rust/checks/errors/rust-unsafe-checker.cc      |  15 ---
 gcc/rust/checks/errors/rust-unsafe-checker.h       |   1 -
 gcc/rust/checks/lints/rust-lint-marklive.cc        |  14 ---
 gcc/rust/checks/lints/rust-lint-marklive.h         |   1 -
 gcc/rust/hir/rust-ast-lower-expr.h                 |  15 ++-
 gcc/rust/hir/rust-hir-dump.cc                      |   3 -
 gcc/rust/hir/rust-hir-dump.h                       |   1 -
 gcc/rust/hir/tree/rust-hir-full-decls.h            |   1 -
 gcc/rust/hir/tree/rust-hir-full-test.cc            |  12 ---
 gcc/rust/hir/tree/rust-hir-visitor.h               |   3 -
 gcc/rust/hir/tree/rust-hir.h                       |  58 ----------
 gcc/rust/typecheck/rust-hir-type-check-expr.cc     |  56 ----------
 gcc/rust/typecheck/rust-hir-type-check-expr.h      |   1 -
 gcc/rust/typecheck/rust-hir-type-check-struct.cc   |  14 ++-
 gcc/rust/typecheck/rust-tycheck-dump.h             |   5 -
 gcc/testsuite/rust/compile/torture/issue-1075.rs   |   3 +-
 gcc/testsuite/rust/compile/traits3.rs              |   4 +-
 gcc/testsuite/rust/execute/torture/issue-1120.rs   |   3 +-
 gcc/testsuite/rust/execute/torture/issue-1133.rs   |   3 +-
 gcc/testsuite/rust/execute/torture/issue-1232.rs   |   3 +-
 gcc/testsuite/rust/execute/torture/issue-1436.rs   |   3 +-
 gcc/testsuite/rust/execute/torture/slice-magic.rs  |   3 +-
 gcc/testsuite/rust/execute/torture/slice-magic2.rs |   3 +-
 33 files changed, 55 insertions(+), 336 deletions(-)

diff --git a/gcc/rust/backend/rust-compile-block.h b/gcc/rust/backend/rust-compile-block.h
index 0595ee905ab..e3c7399c39d 100644
--- a/gcc/rust/backend/rust-compile-block.h
+++ b/gcc/rust/backend/rust-compile-block.h
@@ -46,7 +46,6 @@ public:
   void visit (HIR::StructExprFieldIndexValue &) override {}
   void visit (HIR::StructExprStruct &) override {}
   void visit (HIR::StructExprStructFields &) override {}
-  void visit (HIR::IdentifierExpr &) override {}
   void visit (HIR::LiteralExpr &) override {}
   void visit (HIR::BorrowExpr &) override {}
   void visit (HIR::DereferenceExpr &) override {}
@@ -126,7 +125,6 @@ public:
   void visit (HIR::StructExprFieldIndexValue &) override {}
   void visit (HIR::StructExprStruct &) override {}
   void visit (HIR::StructExprStructFields &) override {}
-  void visit (HIR::IdentifierExpr &) override {}
   void visit (HIR::LiteralExpr &) override {}
   void visit (HIR::BorrowExpr &) override {}
   void visit (HIR::DereferenceExpr &) override {}
@@ -216,7 +214,6 @@ public:
   void visit (HIR::StructExprFieldIndexValue &) override {}
   void visit (HIR::StructExprStruct &) override {}
   void visit (HIR::StructExprStructFields &) override {}
-  void visit (HIR::IdentifierExpr &) override {}
   void visit (HIR::LiteralExpr &) override {}
   void visit (HIR::BorrowExpr &) override {}
   void visit (HIR::DereferenceExpr &) override {}
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc
index 38d10d2d41c..bfaa7fc05b3 100644
--- a/gcc/rust/backend/rust-compile-expr.cc
+++ b/gcc/rust/backend/rust-compile-expr.cc
@@ -692,12 +692,6 @@ CompileExpr::visit (HIR::MatchExpr &expr)
 	  }
 	  break;
 
-	  case HIR::Expr::ExprType::Ident: {
-	    // FIXME
-	    gcc_unreachable ();
-	  }
-	  break;
-
 	  case HIR::Expr::ExprType::Path: {
 	    // FIXME
 	    gcc_unreachable ();
@@ -1808,120 +1802,6 @@ HIRCompileBase::resolve_unsized_adjustment (Resolver::Adjustment &adjustment,
 						      {data, size}, -1, locus);
 }
 
-void
-CompileExpr::visit (HIR::IdentifierExpr &expr)
-{
-  NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
-
-  bool is_value = false;
-  NodeId ref_node_id = UNKNOWN_NODEID;
-  if (ctx->get_resolver ()->lookup_resolved_name (ast_node_id, &ref_node_id))
-    {
-      is_value = true;
-    }
-  else if (!ctx->get_resolver ()->lookup_resolved_type (ast_node_id,
-							&ref_node_id))
-    {
-      rust_error_at (expr.get_locus (),
-		     "Failed to lookup type reference for node: %s",
-		     expr.as_string ().c_str ());
-      return;
-    }
-
-  if (ref_node_id == UNKNOWN_NODEID)
-    {
-      rust_fatal_error (expr.get_locus (), "unresolved IdentifierExpr: %s",
-			expr.as_string ().c_str ());
-      return;
-    }
-
-  // node back to HIR
-  HirId ref;
-  if (!ctx->get_mappings ()->lookup_node_to_hir (ref_node_id, &ref))
-    {
-      rust_error_at (expr.get_locus (), "reverse lookup failure");
-      return;
-    }
-
-  TyTy::BaseType *lookup = nullptr;
-  if (!ctx->get_tyctx ()->lookup_type (ref, &lookup))
-    {
-      rust_fatal_error (expr.get_locus (),
-			"failed to find type relevant to this context: %s",
-			expr.get_mappings ().as_string ().c_str ());
-      return;
-    }
-
-  bool is_type_ref = !is_value;
-  if (is_type_ref)
-    {
-      // this might be a case for
-      //
-      // struct S;
-      //
-      // fn main() {
-      //    let s = S;
-      // }
-
-      if (lookup->is_unit ())
-	{
-	  translated = ctx->get_backend ()->unit_expression ();
-	  return;
-	}
-
-      // rust actually treats like this an fn call or structs with fields but
-      // unit structs are just the struct name lets catch it with an is-unit
-      // check
-      gcc_unreachable ();
-    }
-
-  tree fn = NULL_TREE;
-  Bvariable *var = nullptr;
-  if (ctx->lookup_const_decl (ref, &translated))
-    {
-      TREE_USED (translated) = 1;
-      return;
-    }
-  else if (ctx->lookup_function_decl (ref, &fn))
-    {
-      TREE_USED (fn) = 1;
-      translated = address_expression (fn, expr.get_locus ());
-    }
-  else if (ctx->lookup_var_decl (ref, &var))
-    {
-      // TREE_USED is setup in the gcc abstraction here
-      translated = ctx->get_backend ()->var_expression (var, expr.get_locus ());
-    }
-  else if (ctx->lookup_pattern_binding (ref, &translated))
-    {
-      TREE_USED (translated) = 1;
-      return;
-    }
-  else
-    {
-      // lets try and query compile it to an item/impl item
-      HIR::Item *resolved_item = ctx->get_mappings ()->lookup_hir_item (ref);
-      bool is_hir_item = resolved_item != nullptr;
-      if (!is_hir_item)
-	{
-	  translated = error_mark_node;
-	  return;
-	}
-
-      if (!lookup->has_subsititions_defined ())
-	translated = CompileItem::compile (resolved_item, ctx, nullptr, true,
-					   expr.get_locus ());
-      else
-	translated = CompileItem::compile (resolved_item, ctx, lookup, true,
-					   expr.get_locus ());
-
-      if (translated != error_mark_node)
-	{
-	  TREE_USED (translated) = 1;
-	}
-    }
-}
-
 void
 CompileExpr::visit (HIR::RangeFromToExpr &expr)
 {
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index 9b8976de18a..69f9492b97c 100644
--- a/gcc/rust/backend/rust-compile-expr.h
+++ b/gcc/rust/backend/rust-compile-expr.h
@@ -118,8 +118,6 @@ public:
 
   void visit (HIR::MethodCallExpr &expr) override;
 
-  void visit (HIR::IdentifierExpr &expr) override;
-
   void visit (HIR::LiteralExpr &expr) override
   {
     TyTy::BaseType *tyty = nullptr;
diff --git a/gcc/rust/backend/rust-compile-resolve-path.cc b/gcc/rust/backend/rust-compile-resolve-path.cc
index 8c1b7ef1f2b..f799445e131 100644
--- a/gcc/rust/backend/rust-compile-resolve-path.cc
+++ b/gcc/rust/backend/rust-compile-resolve-path.cc
@@ -64,6 +64,13 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment,
 	return error_mark_node;
 
       TyTy::ADTType *adt = static_cast<TyTy::ADTType *> (lookup);
+
+      // it might be a unit-struct
+      if (adt->is_unit ())
+	{
+	  return ctx->get_backend ()->unit_expression ();
+	}
+
       if (!adt->is_enum ())
 	return error_mark_node;
 
@@ -121,6 +128,14 @@ ResolvePathRef::resolve (const HIR::PathIdentSegment &final_segment,
       return ctx->get_backend ()->var_expression (var, expr_locus);
     }
 
+  // might be a match pattern binding
+  tree binding = error_mark_node;
+  if (ctx->lookup_pattern_binding (ref, &binding))
+    {
+      TREE_USED (binding) = 1;
+      return binding;
+    }
+
   // it might be a function call
   if (lookup->get_kind () == TyTy::TypeKind::FNDEF)
     {
diff --git a/gcc/rust/backend/rust-compile-struct-field-expr.h b/gcc/rust/backend/rust-compile-struct-field-expr.h
index 6968c069f0f..90c3140bf99 100644
--- a/gcc/rust/backend/rust-compile-struct-field-expr.h
+++ b/gcc/rust/backend/rust-compile-struct-field-expr.h
@@ -47,7 +47,6 @@ public:
   void visit (HIR::ClosureExprInnerTyped &) override {}
   void visit (HIR::StructExprStruct &) override {}
   void visit (HIR::StructExprStructFields &) override {}
-  void visit (HIR::IdentifierExpr &) override {}
   void visit (HIR::LiteralExpr &) override {}
   void visit (HIR::BorrowExpr &) override {}
   void visit (HIR::DereferenceExpr &) override {}
diff --git a/gcc/rust/backend/rust-compile.cc b/gcc/rust/backend/rust-compile.cc
index 8a614f200a6..c4100c4ef1b 100644
--- a/gcc/rust/backend/rust-compile.cc
+++ b/gcc/rust/backend/rust-compile.cc
@@ -188,10 +188,17 @@ CompileStructExprField::visit (HIR::StructExprFieldIndexValue &field)
 void
 CompileStructExprField::visit (HIR::StructExprFieldIdentifier &field)
 {
-  // we can make the field look like an identifier expr to take advantage of
-  // existing code
-  HIR::IdentifierExpr expr (field.get_mappings (), field.get_field_name (),
-			    field.get_locus ());
+  // we can make the field look like a path expr to take advantage of existing
+  // code
+
+  Analysis::NodeMapping mappings_copy1 = field.get_mappings ();
+  Analysis::NodeMapping mappings_copy2 = field.get_mappings ();
+
+  HIR::PathIdentSegment ident_seg (field.get_field_name ());
+  HIR::PathExprSegment seg (mappings_copy1, ident_seg, field.get_locus (),
+			    HIR::GenericArgs::create_empty ());
+  HIR::PathInExpression expr (mappings_copy2, {seg}, field.get_locus (), false,
+			      {});
   translated = CompileExpr::Compile (&expr, ctx);
 }
 
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
index 00d993483bc..35fde40782e 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
@@ -200,10 +200,6 @@ PrivacyReporter::check_type_privacy (const HIR::Type *type)
   return check_base_type_privacy (node_mappings, lookup, type->get_locus ());
 }
 
-void
-PrivacyReporter::visit (HIR::IdentifierExpr &ident_expr)
-{}
-
 void
 PrivacyReporter::visit (HIR::PathInExpression &path)
 {
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
index a04e318e9ea..546b108f36d 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
@@ -87,7 +87,6 @@ types
   virtual void visit (HIR::ClosureExprInner &expr);
   virtual void visit (HIR::StructExprStructFields &);
   virtual void visit (HIR::StructExprStruct &);
-  virtual void visit (HIR::IdentifierExpr &ident_expr);
   virtual void visit (HIR::LiteralExpr &expr);
   virtual void visit (HIR::BorrowExpr &expr);
   virtual void visit (HIR::DereferenceExpr &expr);
diff --git a/gcc/rust/checks/errors/rust-const-checker.cc b/gcc/rust/checks/errors/rust-const-checker.cc
index ad0a2cfc5c5..35c61fe03f0 100644
--- a/gcc/rust/checks/errors/rust-const-checker.cc
+++ b/gcc/rust/checks/errors/rust-const-checker.cc
@@ -52,10 +52,6 @@ ConstChecker::is_const_extern_fn (HIR::ExternalFunctionItem &fn)
     });
 }
 
-void
-ConstChecker::visit (IdentifierExpr &ident_expr)
-{}
-
 void
 ConstChecker::visit (Lifetime &lifetime)
 {}
diff --git a/gcc/rust/checks/errors/rust-const-checker.h b/gcc/rust/checks/errors/rust-const-checker.h
index 608ea3e0750..50838d18996 100644
--- a/gcc/rust/checks/errors/rust-const-checker.h
+++ b/gcc/rust/checks/errors/rust-const-checker.h
@@ -50,7 +50,6 @@ private:
   Resolver::Resolver &resolver;
   Analysis::Mappings &mappings;
 
-  virtual void visit (IdentifierExpr &ident_expr) override;
   virtual void visit (Lifetime &lifetime) override;
   virtual void visit (LifetimeParam &lifetime_param) override;
   virtual void visit (PathInExpression &path) override;
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.cc b/gcc/rust/checks/errors/rust-unsafe-checker.cc
index 174901f0449..d9ef551f5e1 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -128,21 +128,6 @@ UnsafeChecker::check_function_call (HirId node_id, Location locus)
 		       locus);
 }
 
-void
-UnsafeChecker::visit (IdentifierExpr &ident_expr)
-{
-  NodeId ast_node_id = ident_expr.get_mappings ().get_nodeid ();
-  NodeId ref_node_id;
-  HirId definition_id;
-
-  if (!resolver.lookup_resolved_name (ast_node_id, &ref_node_id))
-    return;
-
-  rust_assert (mappings.lookup_node_to_hir (ref_node_id, &definition_id));
-
-  check_use_of_static (definition_id, ident_expr.get_locus ());
-}
-
 void
 UnsafeChecker::visit (Lifetime &lifetime)
 {}
diff --git a/gcc/rust/checks/errors/rust-unsafe-checker.h b/gcc/rust/checks/errors/rust-unsafe-checker.h
index 087bdb77b56..ae1eb509d78 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.h
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.h
@@ -52,7 +52,6 @@ private:
   Resolver::Resolver &resolver;
   Analysis::Mappings &mappings;
 
-  virtual void visit (IdentifierExpr &ident_expr) override;
   virtual void visit (Lifetime &lifetime) override;
   virtual void visit (LifetimeParam &lifetime_param) override;
   virtual void visit (PathInExpression &path) override;
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.cc b/gcc/rust/checks/lints/rust-lint-marklive.cc
index edc4b718c1b..245632b4b4c 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.cc
+++ b/gcc/rust/checks/lints/rust-lint-marklive.cc
@@ -246,20 +246,6 @@ MarkLive::visit (HIR::TupleIndexExpr &expr)
   expr.get_tuple_expr ()->accept_vis (*this);
 }
 
-void
-MarkLive::visit (HIR::IdentifierExpr &expr)
-{
-  NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
-  NodeId ref_node_id = UNKNOWN_NODEID;
-  find_ref_node_id (ast_node_id, ref_node_id);
-
-  // node back to HIR
-  HirId ref;
-  bool ok = mappings->lookup_node_to_hir (ref_node_id, &ref);
-  rust_assert (ok);
-  mark_hir_id (ref);
-}
-
 void
 MarkLive::visit (HIR::TypeAlias &alias)
 {
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.h b/gcc/rust/checks/lints/rust-lint-marklive.h
index ef37e17c5fb..119af8b8c95 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.h
+++ b/gcc/rust/checks/lints/rust-lint-marklive.h
@@ -36,7 +36,6 @@ public:
   void go (HIR::Crate &crate);
 
   void visit (HIR::PathInExpression &expr) override;
-  void visit (HIR::IdentifierExpr &expr) override;
   void visit (HIR::FieldAccessExpr &expr) override;
   void visit (HIR::TupleIndexExpr &expr) override;
   void visit (HIR::MethodCallExpr &expr) override;
diff --git a/gcc/rust/hir/rust-ast-lower-expr.h b/gcc/rust/hir/rust-ast-lower-expr.h
index b420a4d808d..4f7f40f27e4 100644
--- a/gcc/rust/hir/rust-ast-lower-expr.h
+++ b/gcc/rust/hir/rust-ast-lower-expr.h
@@ -255,11 +255,16 @@ public:
   void visit (AST::IdentifierExpr &expr) override
   {
     auto crate_num = mappings->get_current_crate ();
-    Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
-				   mappings->get_next_hir_id (crate_num),
-				   UNKNOWN_LOCAL_DEFID);
-    translated
-      = new HIR::IdentifierExpr (mapping, expr.as_string (), expr.get_locus ());
+    Analysis::NodeMapping mapping1 (crate_num, expr.get_node_id (),
+				    mappings->get_next_hir_id (crate_num),
+				    UNKNOWN_LOCAL_DEFID);
+    Analysis::NodeMapping mapping2 (mapping1);
+
+    HIR::PathIdentSegment ident_seg (expr.get_ident ());
+    HIR::PathExprSegment seg (mapping1, ident_seg, expr.get_locus (),
+			      HIR::GenericArgs::create_empty ());
+    translated = new HIR::PathInExpression (mapping2, {seg}, expr.get_locus (),
+					    false, expr.get_outer_attrs ());
   }
 
   void visit (AST::ArrayExpr &expr) override
diff --git a/gcc/rust/hir/rust-hir-dump.cc b/gcc/rust/hir/rust-hir-dump.cc
index f6786f8b52e..bb139a7c1b7 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -77,9 +77,6 @@ Dump::go (HIR::Crate &crate)
   stream << "}" << std::endl;
 }
 
-void
-Dump::visit (IdentifierExpr &)
-{}
 void
 Dump::visit (Lifetime &)
 {}
diff --git a/gcc/rust/hir/rust-hir-dump.h b/gcc/rust/hir/rust-hir-dump.h
index a108c5ce546..8b9e8939a28 100644
--- a/gcc/rust/hir/rust-hir-dump.h
+++ b/gcc/rust/hir/rust-hir-dump.h
@@ -37,7 +37,6 @@ private:
   std::size_t indent; // current indentation level
   char indent_char = '\t';
 
-  virtual void visit (IdentifierExpr &) override;
   virtual void visit (Lifetime &) override;
   virtual void visit (LifetimeParam &) override;
   virtual void visit (PathInExpression &) override;
diff --git a/gcc/rust/hir/tree/rust-hir-full-decls.h b/gcc/rust/hir/tree/rust-hir-full-decls.h
index af838fd4508..2798ba9fd84 100644
--- a/gcc/rust/hir/tree/rust-hir-full-decls.h
+++ b/gcc/rust/hir/tree/rust-hir-full-decls.h
@@ -27,7 +27,6 @@ class Stmt;
 class Item;
 class Expr;
 class ExprWithoutBlock;
-class IdentifierExpr;
 class Pattern;
 class Type;
 class TypeNoBounds;
diff --git a/gcc/rust/hir/tree/rust-hir-full-test.cc b/gcc/rust/hir/tree/rust-hir-full-test.cc
index 8000e5c5894..4e255320e2d 100644
--- a/gcc/rust/hir/tree/rust-hir-full-test.cc
+++ b/gcc/rust/hir/tree/rust-hir-full-test.cc
@@ -3751,18 +3751,6 @@ Module::add_crate_name (std::vector<std::string> &names) const
 
 /* All accept_vis method below */
 
-void
-IdentifierExpr::accept_vis (HIRFullVisitor &vis)
-{
-  vis.visit (*this);
-}
-
-void
-IdentifierExpr::accept_vis (HIRExpressionVisitor &vis)
-{
-  vis.visit (*this);
-}
-
 void
 Lifetime::accept_vis (HIRFullVisitor &vis)
 {
diff --git a/gcc/rust/hir/tree/rust-hir-visitor.h b/gcc/rust/hir/tree/rust-hir-visitor.h
index 11eacbe3e36..b3c0b9359cc 100644
--- a/gcc/rust/hir/tree/rust-hir-visitor.h
+++ b/gcc/rust/hir/tree/rust-hir-visitor.h
@@ -27,7 +27,6 @@ namespace HIR {
 class HIRFullVisitor
 {
 public:
-  virtual void visit (IdentifierExpr &ident_expr) = 0;
   virtual void visit (Lifetime &lifetime) = 0;
   virtual void visit (LifetimeParam &lifetime_param) = 0;
   virtual void visit (PathInExpression &path) = 0;
@@ -166,7 +165,6 @@ class HIRFullVisitorBase : public HIRFullVisitor
 public:
   virtual ~HIRFullVisitorBase () {}
 
-  virtual void visit (IdentifierExpr &) override {}
   virtual void visit (Lifetime &) override {}
   virtual void visit (LifetimeParam &) override {}
   virtual void visit (PathInExpression &) override {}
@@ -425,7 +423,6 @@ public:
   virtual void visit (ClosureExprInner &expr) = 0;
   virtual void visit (StructExprStructFields &) = 0;
   virtual void visit (StructExprStruct &) = 0;
-  virtual void visit (IdentifierExpr &ident_expr) = 0;
   virtual void visit (LiteralExpr &expr) = 0;
   virtual void visit (BorrowExpr &expr) = 0;
   virtual void visit (DereferenceExpr &expr) = 0;
diff --git a/gcc/rust/hir/tree/rust-hir.h b/gcc/rust/hir/tree/rust-hir.h
index c2f6fef1383..927ac06fc4a 100644
--- a/gcc/rust/hir/tree/rust-hir.h
+++ b/gcc/rust/hir/tree/rust-hir.h
@@ -274,7 +274,6 @@ public:
     Match,
     Await,
     AsyncBlock,
-    Ident,
     Path,
   };
 
@@ -367,63 +366,6 @@ public:
   };
 };
 
-/* HACK: IdentifierExpr, delete when figure out identifier vs expr problem in
- * Pratt parser */
-/* Alternatively, identifiers could just be represented as single-segment paths
- */
-class IdentifierExpr : public ExprWithoutBlock
-{
-  Identifier ident;
-
-public:
-  Location locus;
-
-  IdentifierExpr (Analysis::NodeMapping mappings, Identifier ident,
-		  Location locus = Location (),
-		  AST::AttrVec outer_attrs = AST::AttrVec ())
-    : ExprWithoutBlock (std::move (mappings), std::move (outer_attrs)),
-      ident (std::move (ident)), locus (locus)
-  {}
-
-  std::string as_string () const override
-  {
-    return "( " + ident + " (" + get_mappings ().as_string () + "))";
-  }
-
-  Location get_locus () const override final { return locus; }
-
-  void accept_vis (HIRFullVisitor &vis) override;
-  void accept_vis (HIRExpressionVisitor &vis) override;
-
-  // Clones this object.
-  std::unique_ptr<IdentifierExpr> clone_identifier_expr () const
-  {
-    return std::unique_ptr<IdentifierExpr> (clone_identifier_expr_impl ());
-  }
-
-  Identifier get_identifier () const { return ident; }
-
-  ExprType get_expression_type () const final override
-  {
-    return ExprType::Ident;
-  }
-
-protected:
-  // Clone method implementation
-  IdentifierExpr *clone_expr_without_block_impl () const override
-  {
-    return clone_identifier_expr_impl ();
-  }
-
-  IdentifierExpr *clone_identifier_expr_impl () const
-  {
-    return new IdentifierExpr (*this);
-  }
-
-  IdentifierExpr (IdentifierExpr const &other) = default;
-  IdentifierExpr &operator= (IdentifierExpr const &other) = default;
-};
-
 // Pattern base HIR node
 class Pattern : public Node
 {
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index 03999baffa4..6d8bbda428c 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -262,62 +262,6 @@ TypeCheckExpr::visit (HIR::CompoundAssignmentExpr &expr)
     }
 }
 
-void
-TypeCheckExpr::visit (HIR::IdentifierExpr &expr)
-{
-  NodeId ast_node_id = expr.get_mappings ().get_nodeid ();
-
-  // then lookup the reference_node_id
-  NodeId ref_node_id = UNKNOWN_NODEID;
-  if (!resolver->lookup_resolved_name (ast_node_id, &ref_node_id))
-    {
-      resolver->lookup_resolved_type (ast_node_id, &ref_node_id);
-    }
-
-  if (ref_node_id == UNKNOWN_NODEID)
-    {
-      // FIXME this needs to go away and just return error node
-      rust_error_at (expr.get_locus (), "unresolved node: %s",
-		     expr.as_string ().c_str ());
-      return;
-    }
-
-  // node back to HIR
-  HirId ref;
-  if (!mappings->lookup_node_to_hir (ref_node_id, &ref))
-    {
-      // FIXME
-      // this is an internal error
-      rust_error_at (expr.get_locus (), "123 reverse lookup failure");
-      return;
-    }
-
-  // the base reference for this name _must_ have a type set
-  TyTy::BaseType *lookup;
-  if (!context->lookup_type (ref, &lookup))
-    {
-      // FIXME
-      // this is an internal error
-      rust_error_at (mappings->lookup_location (ref),
-		     "Failed to resolve IdentifierExpr type: %s",
-		     expr.as_string ().c_str ());
-      return;
-    }
-
-  infered = lookup->clone ();
-
-  // Generic unit structs look like an identifier but they actually need be
-  // handled as a path-in-expression so this gives us a chance to infer the
-  // generic parameters.
-  // see https://github.com/Rust-GCC/gccrs/issues/1447
-  bool is_unit_struct
-    = infered->get_kind () == TyTy::TypeKind::ADT && infered->is_unit ();
-  if (is_unit_struct && infered->needs_generic_substitutions ())
-    {
-      infered = SubstMapper::InferSubst (infered, expr.get_locus ());
-    }
-}
-
 void
 TypeCheckExpr::visit (HIR::LiteralExpr &expr)
 {
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h
index 01cb213f002..19a6c791a9d 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.h
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.h
@@ -37,7 +37,6 @@ public:
   void visit (HIR::MethodCallExpr &expr) override;
   void visit (HIR::AssignmentExpr &expr) override;
   void visit (HIR::CompoundAssignmentExpr &expr) override;
-  void visit (HIR::IdentifierExpr &expr) override;
   void visit (HIR::LiteralExpr &expr) override;
   void visit (HIR::ArithmeticOrLogicalExpr &expr) override;
   void visit (HIR::ComparisonExpr &expr) override;
diff --git a/gcc/rust/typecheck/rust-hir-type-check-struct.cc b/gcc/rust/typecheck/rust-hir-type-check-struct.cc
index ec82442beb2..f22b35d7942 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-struct.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-struct.cc
@@ -313,10 +313,16 @@ TypeCheckStructExpr::visit (HIR::StructExprFieldIdentifier &field)
       return;
     }
 
-  // we can make the field look like an identifier expr to take advantage of
-  // existing code to figure out the type
-  HIR::IdentifierExpr expr (field.get_mappings (), field.get_field_name (),
-			    field.get_locus ());
+  // we can make the field look like a path expr to take advantage of existing
+  // code
+  Analysis::NodeMapping mappings_copy1 = field.get_mappings ();
+  Analysis::NodeMapping mappings_copy2 = field.get_mappings ();
+
+  HIR::PathIdentSegment ident_seg (field.get_field_name ());
+  HIR::PathExprSegment seg (mappings_copy1, ident_seg, field.get_locus (),
+			    HIR::GenericArgs::create_empty ());
+  HIR::PathInExpression expr (mappings_copy2, {seg}, field.get_locus (), false,
+			      {});
   TyTy::BaseType *value = TypeCheckExpr::Resolve (&expr);
 
   resolved_field_value_expr
diff --git a/gcc/rust/typecheck/rust-tycheck-dump.h b/gcc/rust/typecheck/rust-tycheck-dump.h
index f66d7eb4b8c..ccf0f625e4b 100644
--- a/gcc/rust/typecheck/rust-tycheck-dump.h
+++ b/gcc/rust/typecheck/rust-tycheck-dump.h
@@ -159,11 +159,6 @@ public:
 	    + type_string (expr.get_mappings ());
   }
 
-  void visit (HIR::IdentifierExpr &expr) override
-  {
-    dump += expr.get_identifier () + ":" + type_string (expr.get_mappings ());
-  }
-
   void visit (HIR::ArrayExpr &expr) override
   {
     dump += type_string (expr.get_mappings ()) + ":[";
diff --git a/gcc/testsuite/rust/compile/torture/issue-1075.rs b/gcc/testsuite/rust/compile/torture/issue-1075.rs
index f346d9a572a..7c0a0434262 100644
--- a/gcc/testsuite/rust/compile/torture/issue-1075.rs
+++ b/gcc/testsuite/rust/compile/torture/issue-1075.rs
@@ -19,8 +19,7 @@ impl<T> *const [T] {
     pub const fn len(self) -> usize {
         // SAFETY: this is safe because `*const [T]` and `FatPtr<T>` have the same layout.
         // Only `std` can make this guarantee.
-        let a = unsafe { Repr { rust: self }.raw };
-        a.len
+        unsafe { Repr { rust: self }.raw.len }
     }
 
     pub const fn as_ptr(self) -> *const T {
diff --git a/gcc/testsuite/rust/compile/traits3.rs b/gcc/testsuite/rust/compile/traits3.rs
index c971a11bf88..fd3fa457cc8 100644
--- a/gcc/testsuite/rust/compile/traits3.rs
+++ b/gcc/testsuite/rust/compile/traits3.rs
@@ -10,9 +10,9 @@ impl<T> Foo for Bar<T> {
     type A = i32;
 
     fn baz(a: f32) -> f32 {
-        // { dg-error "expected .i32. got .f32." "" { target *-*-* } .-1 }
-        // { dg-error "method .baz. has an incompatible type for trait .Foo." "" { target *-*-* } .-2 }
+        // { dg-error "method .baz. has an incompatible type for trait .Foo." "" { target *-*-* } .-1 }
         a
+        // { dg-error "expected .i32. got .f32." "" { target *-*-* } .-1 }
     }
 }
 
diff --git a/gcc/testsuite/rust/execute/torture/issue-1120.rs b/gcc/testsuite/rust/execute/torture/issue-1120.rs
index 740cf7cfa93..242c94b5cb6 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1120.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1120.rs
@@ -29,8 +29,7 @@ pub struct Range<Idx> {
 #[lang = "const_slice_ptr"]
 impl<T> *const [T] {
     pub const fn len(self) -> usize {
-        let a = unsafe { Repr { rust: self }.raw };
-        a.len
+        unsafe { Repr { rust: self }.raw.len }
     }
 
     pub const fn as_ptr(self) -> *const T {
diff --git a/gcc/testsuite/rust/execute/torture/issue-1133.rs b/gcc/testsuite/rust/execute/torture/issue-1133.rs
index fd3d7b6d72a..f2080a6e072 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1133.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1133.rs
@@ -29,8 +29,7 @@ pub struct Range<Idx> {
 #[lang = "const_slice_ptr"]
 impl<T> *const [T] {
     pub const fn len(self) -> usize {
-        let a = unsafe { Repr { rust: self }.raw };
-        a.len
+        unsafe { Repr { rust: self }.raw.len }
     }
 
     pub const fn as_ptr(self) -> *const T {
diff --git a/gcc/testsuite/rust/execute/torture/issue-1232.rs b/gcc/testsuite/rust/execute/torture/issue-1232.rs
index 63d7681dc29..c56d5c18695 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1232.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1232.rs
@@ -34,8 +34,7 @@ pub struct Range<Idx> {
 #[lang = "const_slice_ptr"]
 impl<T> *const [T] {
     pub const fn len(self) -> usize {
-        let a = unsafe { Repr { rust: self }.raw };
-        a.len
+        unsafe { Repr { rust: self }.raw.len }
     }
 
     pub const fn as_ptr(self) -> *const T {
diff --git a/gcc/testsuite/rust/execute/torture/issue-1436.rs b/gcc/testsuite/rust/execute/torture/issue-1436.rs
index 327de26fb47..5c079a61f07 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1436.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1436.rs
@@ -42,8 +42,7 @@ pub struct Range<Idx> {
 #[lang = "const_slice_ptr"]
 impl<T> *const [T] {
     pub const fn len(self) -> usize {
-        let a = unsafe { Repr { rust: self }.raw };
-        a.len
+        unsafe { Repr { rust: self }.raw.len }
     }
 
     pub const fn as_ptr(self) -> *const T {
diff --git a/gcc/testsuite/rust/execute/torture/slice-magic.rs b/gcc/testsuite/rust/execute/torture/slice-magic.rs
index f9762b22fa6..d1132989ddb 100644
--- a/gcc/testsuite/rust/execute/torture/slice-magic.rs
+++ b/gcc/testsuite/rust/execute/torture/slice-magic.rs
@@ -24,8 +24,7 @@ pub struct Range<Idx> {
 #[lang = "const_slice_ptr"]
 impl<A> *const [A] {
     pub const fn len(self) -> usize {
-        let a = unsafe { Repr { rust: self }.raw };
-        a.len
+        unsafe { Repr { rust: self }.raw.len }
     }
 
     pub const fn as_ptr(self) -> *const A {
diff --git a/gcc/testsuite/rust/execute/torture/slice-magic2.rs b/gcc/testsuite/rust/execute/torture/slice-magic2.rs
index d6cbe21e7ec..64a566185fa 100644
--- a/gcc/testsuite/rust/execute/torture/slice-magic2.rs
+++ b/gcc/testsuite/rust/execute/torture/slice-magic2.rs
@@ -24,8 +24,7 @@ pub struct Range<Idx> {
 #[lang = "const_slice_ptr"]
 impl<T> *const [T] {
     pub const fn len(self) -> usize {
-        let a = unsafe { Repr { rust: self }.raw };
-        a.len
+        unsafe { Repr { rust: self }.raw.len }
     }
 
     pub const fn as_ptr(self) -> *const T {


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-08-13  8:42 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-13  8:42 [gcc/devel/rust/master] Desugar HIR::IdentifierExpr into HIR::PathInExpression 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).