aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2024-09-20 18:45:12 +0100
committerArthur Cohen <arthur.cohen@embecosm.com>2025-03-19 15:32:11 +0100
commitd007ce87451f75134ccf38a3d760cbdc6720e608 (patch)
tree7238b1f2339bb3c2a24da281ce5c023a2594efb8 /gcc
parent88524c5314967f013f1596cdd935da4d9dc27500 (diff)
downloadgcc-d007ce87451f75134ccf38a3d760cbdc6720e608.zip
gcc-d007ce87451f75134ccf38a3d760cbdc6720e608.tar.gz
gcc-d007ce87451f75134ccf38a3d760cbdc6720e608.tar.bz2
rust: fix ICE when compiling impl block for !
We need to resolve the never type which is its own special AST node so it doesnt magically get handled like the regular builtin type paths such as i32. Fixes #3035 gcc/rust/ChangeLog: * resolve/rust-ast-resolve-type.cc (ResolveType::visit): handle never type (ResolveTypeToCanonicalPath::visit): likewise * resolve/rust-ast-resolve-type.h: missing never type * resolve/rust-name-resolver.cc (Resolver::generate_builtins): track never type node_id (Resolver::setup_builtin): likewise * resolve/rust-name-resolver.h: new never type getter gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: nr2 cant handle this * rust/compile/issue-3035.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.cc8
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-type.h2
-rw-r--r--gcc/rust/resolve/rust-name-resolver.cc9
-rw-r--r--gcc/rust/resolve/rust-name-resolver.h7
-rw-r--r--gcc/testsuite/rust/compile/issue-3035.rs25
-rw-r--r--gcc/testsuite/rust/compile/nr2/exclude3
6 files changed, 49 insertions, 5 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc
index 934d6ea..cee259c 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.cc
+++ b/gcc/rust/resolve/rust-ast-resolve-type.cc
@@ -69,7 +69,7 @@ ResolveType::visit (AST::InferredType &)
void
ResolveType::visit (AST::NeverType &)
{
- // FIXME
+ resolved_node = resolver->get_never_type_node_id ();
}
void
@@ -501,6 +501,12 @@ ResolveTypeToCanonicalPath::visit (AST::TraitObjectType &)
rust_unreachable ();
}
+void
+ResolveTypeToCanonicalPath::visit (AST::NeverType &type)
+{
+ result = CanonicalPath::new_seg (type.get_node_id (), "!");
+}
+
ResolveTypeToCanonicalPath::ResolveTypeToCanonicalPath ()
: ResolverBase (), result (CanonicalPath::create_empty ())
{}
diff --git a/gcc/rust/resolve/rust-ast-resolve-type.h b/gcc/rust/resolve/rust-ast-resolve-type.h
index 0076424..5e38244 100644
--- a/gcc/rust/resolve/rust-ast-resolve-type.h
+++ b/gcc/rust/resolve/rust-ast-resolve-type.h
@@ -246,6 +246,8 @@ public:
void visit (AST::TraitObjectType &type) override;
+ void visit (AST::NeverType &type) override;
+
private:
ResolveTypeToCanonicalPath ();
diff --git a/gcc/rust/resolve/rust-name-resolver.cc b/gcc/rust/resolve/rust-name-resolver.cc
index ee52e5c..21147bd8 100644
--- a/gcc/rust/resolve/rust-name-resolver.cc
+++ b/gcc/rust/resolve/rust-name-resolver.cc
@@ -429,7 +429,10 @@ Resolver::generate_builtins ()
setup_builtin ("isize", isize);
setup_builtin ("char", char_tyty);
setup_builtin ("str", str);
- setup_builtin ("!", never);
+
+ // never type
+ NodeId never_node_id = setup_builtin ("!", never);
+ set_never_type_node_id (never_node_id);
// unit type ()
TyTy::TupleType *unit_tyty
@@ -443,7 +446,7 @@ Resolver::generate_builtins ()
set_unit_type_node_id (unit_type->get_node_id ());
}
-void
+NodeId
Resolver::setup_builtin (const std::string &name, TyTy::BaseType *tyty)
{
AST::PathIdentSegment seg (name, BUILTINS_LOCATION);
@@ -459,6 +462,8 @@ Resolver::setup_builtin (const std::string &name, TyTy::BaseType *tyty)
mappings.insert_canonical_path (
builtin_type->get_node_id (),
CanonicalPath::new_seg (builtin_type->get_node_id (), name));
+
+ return builtin_type->get_node_id ();
}
void
diff --git a/gcc/rust/resolve/rust-name-resolver.h b/gcc/rust/resolve/rust-name-resolver.h
index c34002e..43b79e5 100644
--- a/gcc/rust/resolve/rust-name-resolver.h
+++ b/gcc/rust/resolve/rust-name-resolver.h
@@ -163,9 +163,13 @@ public:
Scope &get_macro_scope () { return macro_scope; }
NodeId get_global_type_node_id () { return global_type_node_id; }
+
void set_unit_type_node_id (NodeId id) { unit_ty_node_id = id; }
NodeId get_unit_type_node_id () { return unit_ty_node_id; }
+ void set_never_type_node_id (NodeId id) { never_ty_node_id = id; }
+ NodeId get_never_type_node_id () { return never_ty_node_id; }
+
void push_new_module_scope (NodeId module_id)
{
current_module_stack.push_back (module_id);
@@ -208,7 +212,7 @@ private:
Resolver ();
void generate_builtins ();
- void setup_builtin (const std::string &name, TyTy::BaseType *tyty);
+ NodeId setup_builtin (const std::string &name, TyTy::BaseType *tyty);
Analysis::Mappings &mappings;
TypeCheckContext *tyctx;
@@ -222,6 +226,7 @@ private:
NodeId global_type_node_id;
NodeId unit_ty_node_id;
+ NodeId never_ty_node_id;
// map a AST Node to a Rib
std::map<NodeId, Rib *> name_ribs;
diff --git a/gcc/testsuite/rust/compile/issue-3035.rs b/gcc/testsuite/rust/compile/issue-3035.rs
new file mode 100644
index 0000000..3266d84
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3035.rs
@@ -0,0 +1,25 @@
+#[lang = "sized"]
+trait Sized {}
+
+// ---- gccrs additions
+
+#[lang = "clone"]
+pub trait Clone: Sized {
+ #[stable(feature = "rust1", since = "1.0.0")]
+ #[must_use = "cloning is often expensive and is not expected to have side effects"]
+ fn clone(&self) -> Self;
+
+ #[inline]
+ #[stable(feature = "rust1", since = "1.0.0")]
+ fn clone_from(&mut self, source: &Self) {
+ *self = source.clone()
+ }
+}
+
+#[unstable(feature = "never_type", issue = "35121")]
+impl Clone for ! {
+ #[inline]
+ fn clone(&self) -> Self {
+ *self
+ }
+}
diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude
index 8993c6d..5f5863b 100644
--- a/gcc/testsuite/rust/compile/nr2/exclude
+++ b/gcc/testsuite/rust/compile/nr2/exclude
@@ -275,4 +275,5 @@ unknown-associated-item.rs
box_syntax_feature_gate.rs
dropck_eyepatch_feature_gate.rs
inline_asm_parse_output_operand.rs
-issue-3030.rs \ No newline at end of file
+issue-3030.rs
+issue-3035.rs