From e82d79c4f39b62550769525b9dec4ce446c2c96f Mon Sep 17 00:00:00 2001 From: Philip Herron Date: Tue, 5 Nov 2024 17:41:44 +0000 Subject: [PATCH] gccrs: fix typechecking of Fn trait calls using ADT types Fixes RustGcc#2953 gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-item.cc (TypeCheckItem::visit): fix the ty_id gcc/testsuite/ChangeLog: * rust/compile/nr2/exclude: nr2 cant handle these * rust/compile/issue-2953-1.rs: New test. * rust/compile/issue-2953-2.rs: New test. Signed-off-by: Philip Herron --- .../typecheck/rust-hir-type-check-item.cc | 10 +++-- gcc/testsuite/rust/compile/issue-2953-1.rs | 27 ++++++++++++++ gcc/testsuite/rust/compile/issue-2953-2.rs | 37 +++++++++++++++++++ gcc/testsuite/rust/compile/nr2/exclude | 2 + 4 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/rust/compile/issue-2953-1.rs create mode 100644 gcc/testsuite/rust/compile/issue-2953-2.rs diff --git a/gcc/rust/typecheck/rust-hir-type-check-item.cc b/gcc/rust/typecheck/rust-hir-type-check-item.cc index 7bbe1e67d100..51ce8277b427 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-item.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-item.cc @@ -231,7 +231,8 @@ TypeCheckItem::visit (HIR::TupleStruct &struct_decl) = parse_repr_options (attrs, struct_decl.get_locus ()); auto *type = new TyTy::ADTType ( - struct_decl.get_mappings ().get_hirid (), mappings.get_next_hir_id (), + struct_decl.get_mappings ().get_hirid (), + struct_decl.get_mappings ().get_hirid (), struct_decl.get_identifier ().as_string (), ident, TyTy::ADTType::ADTKind::TUPLE_STRUCT, std::move (variants), std::move (substitutions), repr, @@ -312,7 +313,8 @@ TypeCheckItem::visit (HIR::StructStruct &struct_decl) = parse_repr_options (attrs, struct_decl.get_locus ()); auto *type = new TyTy::ADTType ( - struct_decl.get_mappings ().get_hirid (), mappings.get_next_hir_id (), + struct_decl.get_mappings ().get_hirid (), + struct_decl.get_mappings ().get_hirid (), struct_decl.get_identifier ().as_string (), ident, TyTy::ADTType::ADTKind::STRUCT_STRUCT, std::move (variants), std::move (substitutions), repr, @@ -369,7 +371,7 @@ TypeCheckItem::visit (HIR::Enum &enum_decl) // multi variant ADT auto *type = new TyTy::ADTType (enum_decl.get_mappings ().get_hirid (), - mappings.get_next_hir_id (), + enum_decl.get_mappings ().get_hirid (), enum_decl.get_identifier ().as_string (), ident, TyTy::ADTType::ADTKind::ENUM, std::move (variants), std::move (substitutions)); @@ -440,7 +442,7 @@ TypeCheckItem::visit (HIR::Union &union_decl) auto *type = new TyTy::ADTType (union_decl.get_mappings ().get_hirid (), - mappings.get_next_hir_id (), + union_decl.get_mappings ().get_hirid (), union_decl.get_identifier ().as_string (), ident, TyTy::ADTType::ADTKind::UNION, std::move (variants), std::move (substitutions)); diff --git a/gcc/testsuite/rust/compile/issue-2953-1.rs b/gcc/testsuite/rust/compile/issue-2953-1.rs new file mode 100644 index 000000000000..d07059e440e0 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2953-1.rs @@ -0,0 +1,27 @@ +#[lang = "sized"] +pub trait Sized { + // Empty. +} + +#[lang = "fn_once"] +pub trait FnOnce { + /// The returned type after the call operator is used. + #[lang = "fn_once_output"] + type Output; + + /// Performs the call operation. + extern "rust-call" fn call_once(self, args: Args) -> Self::Output; +} + +pub enum Ordering { + /// An ordering where a compared value is less than another. + Less = -1, + /// An ordering where a compared value is equal to another. + Equal = 0, + /// An ordering where a compared value is greater than another. + Greater = 1, +} + +pub fn f Ordering>(g: F) -> Ordering { + g(1) +} diff --git a/gcc/testsuite/rust/compile/issue-2953-2.rs b/gcc/testsuite/rust/compile/issue-2953-2.rs new file mode 100644 index 000000000000..59276246a1c2 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2953-2.rs @@ -0,0 +1,37 @@ +#[lang = "sized"] +pub trait Sized { + // Empty. +} + +#[lang = "fn_once"] +pub trait FnOnce { + /// The returned type after the call operator is used. + #[lang = "fn_once_output"] + type Output; + + /// Performs the call operation. + extern "rust-call" fn call_once(self, args: Args) -> Self::Output; +} + +pub enum Ordering { + /// An ordering where a compared value is less than another. + Less = -1, + /// An ordering where a compared value is equal to another. + Equal = 0, + /// An ordering where a compared value is greater than another. + Greater = 1, +} + +pub fn max_by Ordering>(v1: T, v2: T, compare: F) -> T { + match compare(&v1, &v2) { + Ordering::Less | Ordering::Equal => v2, + Ordering::Greater => v1, + } +} + +pub fn min_by Ordering>(v1: T, v2: T, compare: F) -> T { + match compare(&v1, &v2) { + Ordering::Less | Ordering::Equal => v1, + Ordering::Greater => v2, + } +} diff --git a/gcc/testsuite/rust/compile/nr2/exclude b/gcc/testsuite/rust/compile/nr2/exclude index eaa2a1e0d0bc..92fa81517da8 100644 --- a/gcc/testsuite/rust/compile/nr2/exclude +++ b/gcc/testsuite/rust/compile/nr2/exclude @@ -223,4 +223,6 @@ iflet.rs issue-3033.rs issue-3009.rs issue-2323.rs +issue-2953-1.rs +issue-2953-2.rs # please don't delete the trailing newline