aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-08-11 14:10:05 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-08-11 15:55:28 +0100
commitd4ddd73b0b8ddd44204844a4d650424539335899 (patch)
tree26fb40b1fcbc93baa1c122286e7dc4e9bf806272
parent70a0039b82b3419820359c8a1552470e48b458f6 (diff)
downloadgcc-d4ddd73b0b8ddd44204844a4d650424539335899.zip
gcc-d4ddd73b0b8ddd44204844a4d650424539335899.tar.gz
gcc-d4ddd73b0b8ddd44204844a4d650424539335899.tar.bz2
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
-rw-r--r--gcc/rust/backend/rust-compile-block.h3
-rw-r--r--gcc/rust/backend/rust-compile-expr.cc120
-rw-r--r--gcc/rust/backend/rust-compile-expr.h2
-rw-r--r--gcc/rust/backend/rust-compile-resolve-path.cc15
-rw-r--r--gcc/rust/backend/rust-compile-struct-field-expr.h1
-rw-r--r--gcc/rust/backend/rust-compile.cc15
-rw-r--r--gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc4
-rw-r--r--gcc/rust/checks/errors/privacy/rust-privacy-reporter.h1
-rw-r--r--gcc/rust/checks/errors/rust-const-checker.cc4
-rw-r--r--gcc/rust/checks/errors/rust-const-checker.h1
-rw-r--r--gcc/rust/checks/errors/rust-unsafe-checker.cc15
-rw-r--r--gcc/rust/checks/errors/rust-unsafe-checker.h1
-rw-r--r--gcc/rust/checks/lints/rust-lint-marklive.cc14
-rw-r--r--gcc/rust/checks/lints/rust-lint-marklive.h1
-rw-r--r--gcc/rust/hir/rust-ast-lower-expr.h15
-rw-r--r--gcc/rust/hir/rust-hir-dump.cc3
-rw-r--r--gcc/rust/hir/rust-hir-dump.h1
-rw-r--r--gcc/rust/hir/tree/rust-hir-full-decls.h1
-rw-r--r--gcc/rust/hir/tree/rust-hir-full-test.cc12
-rw-r--r--gcc/rust/hir/tree/rust-hir-visitor.h3
-rw-r--r--gcc/rust/hir/tree/rust-hir.h58
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.cc56
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-expr.h1
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-struct.cc14
-rw-r--r--gcc/rust/typecheck/rust-tycheck-dump.h5
-rw-r--r--gcc/testsuite/rust/compile/torture/issue-1075.rs3
-rw-r--r--gcc/testsuite/rust/compile/traits3.rs4
-rw-r--r--gcc/testsuite/rust/execute/torture/issue-1120.rs3
-rw-r--r--gcc/testsuite/rust/execute/torture/issue-1133.rs3
-rw-r--r--gcc/testsuite/rust/execute/torture/issue-1232.rs3
-rw-r--r--gcc/testsuite/rust/execute/torture/issue-1436.rs3
-rw-r--r--gcc/testsuite/rust/execute/torture/slice-magic.rs3
-rw-r--r--gcc/testsuite/rust/execute/torture/slice-magic2.rs3
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 0595ee9..e3c7399 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 38d10d2..bfaa7fc 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 ();
@@ -1809,120 +1803,6 @@ HIRCompileBase::resolve_unsized_adjustment (Resolver::Adjustment &adjustment,
}
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)
{
tree from = CompileExpr::Compile (expr.get_from_expr ().get (), ctx);
diff --git a/gcc/rust/backend/rust-compile-expr.h b/gcc/rust/backend/rust-compile-expr.h
index 9b8976d..69f9492 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 8c1b7ef..f799445 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 6968c06..90c3140 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 8a614f2..c4100c4 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 00d9934..35fde40 100644
--- a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
+++ b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.cc
@@ -201,10 +201,6 @@ PrivacyReporter::check_type_privacy (const HIR::Type *type)
}
void
-PrivacyReporter::visit (HIR::IdentifierExpr &ident_expr)
-{}
-
-void
PrivacyReporter::visit (HIR::PathInExpression &path)
{
check_for_privacy_violation (path.get_mappings ().get_nodeid (),
diff --git a/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h b/gcc/rust/checks/errors/privacy/rust-privacy-reporter.h
index a04e318..546b108 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 ad0a2cf..35c61fe 100644
--- a/gcc/rust/checks/errors/rust-const-checker.cc
+++ b/gcc/rust/checks/errors/rust-const-checker.cc
@@ -53,10 +53,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 608ea3e..50838d1 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 174901f0..d9ef551 100644
--- a/gcc/rust/checks/errors/rust-unsafe-checker.cc
+++ b/gcc/rust/checks/errors/rust-unsafe-checker.cc
@@ -129,21 +129,6 @@ UnsafeChecker::check_function_call (HirId node_id, Location 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 087bdb7..ae1eb509 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 edc4b71..245632b 100644
--- a/gcc/rust/checks/lints/rust-lint-marklive.cc
+++ b/gcc/rust/checks/lints/rust-lint-marklive.cc
@@ -247,20 +247,6 @@ MarkLive::visit (HIR::TupleIndexExpr &expr)
}
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)
{
NodeId ast_node_id;
diff --git a/gcc/rust/checks/lints/rust-lint-marklive.h b/gcc/rust/checks/lints/rust-lint-marklive.h
index ef37e17..119af8b 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 b420a4d..4f7f40f 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 f6786f8..bb139a7 100644
--- a/gcc/rust/hir/rust-hir-dump.cc
+++ b/gcc/rust/hir/rust-hir-dump.cc
@@ -78,9 +78,6 @@ Dump::go (HIR::Crate &crate)
}
void
-Dump::visit (IdentifierExpr &)
-{}
-void
Dump::visit (Lifetime &)
{}
void
diff --git a/gcc/rust/hir/rust-hir-dump.h b/gcc/rust/hir/rust-hir-dump.h
index a108c5c..8b9e893 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 af838fd..2798ba9 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 8000e5c..4e25532 100644
--- a/gcc/rust/hir/tree/rust-hir-full-test.cc
+++ b/gcc/rust/hir/tree/rust-hir-full-test.cc
@@ -3752,18 +3752,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)
{
vis.visit (*this);
diff --git a/gcc/rust/hir/tree/rust-hir-visitor.h b/gcc/rust/hir/tree/rust-hir-visitor.h
index 11eacbe..b3c0b93 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 c2f6fef..927ac06 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 03999ba..6d8bbda 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -263,62 +263,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)
{
infered = resolve_literal (expr.get_mappings (), expr.get_literal (),
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.h b/gcc/rust/typecheck/rust-hir-type-check-expr.h
index 01cb213..19a6c79 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 ec82442..f22b35d 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 f66d7eb..ccf0f62 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 f346d9a..7c0a043 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 c971a11..fd3fa45 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 740cf7c..242c94b 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 fd3d7b6..f2080a6 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 63d7681..c56d5c1 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 327de26..5c079a6 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 f9762b2..d113298 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 d6cbe21..64a5661 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 {