From: Philip Herron <herron.phi...@googlemail.com> 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.phi...@googlemail.com> --- gcc/rust/resolve/rust-ast-resolve-type.cc | 8 +++++++- gcc/rust/resolve/rust-ast-resolve-type.h | 2 ++ gcc/rust/resolve/rust-name-resolver.cc | 9 ++++++-- gcc/rust/resolve/rust-name-resolver.h | 7 ++++++- gcc/testsuite/rust/compile/issue-3035.rs | 25 +++++++++++++++++++++++ gcc/testsuite/rust/compile/nr2/exclude | 3 ++- 6 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/rust/compile/issue-3035.rs diff --git a/gcc/rust/resolve/rust-ast-resolve-type.cc b/gcc/rust/resolve/rust-ast-resolve-type.cc index 934d6ea3fbd..cee259cceb4 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 0076424ef51..5e382445a14 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 ee52e5cc3d1..21147bd86fa 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 c34002eb18e..43b79e51005 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 00000000000..3266d841dea --- /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 8993c6d5750..5f5863bde87 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 -- 2.45.2