]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: fix typechecking of Fn trait calls using ADT types
authorPhilip Herron <herron.philip@googlemail.com>
Tue, 5 Nov 2024 17:41:44 +0000 (17:41 +0000)
committerArthur Cohen <arthur.cohen@embecosm.com>
Fri, 21 Mar 2025 11:32:56 +0000 (12:32 +0100)
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 <herron.philip@googlemail.com>
gcc/rust/typecheck/rust-hir-type-check-item.cc
gcc/testsuite/rust/compile/issue-2953-1.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/issue-2953-2.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/nr2/exclude

index 81e2f25f73d05d81294e8d43e9319ed106e18dc1..28368d4730a4e947dfa66c823b0e54800c55f6fe 100644 (file)
@@ -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 (file)
index 0000000..d07059e
--- /dev/null
@@ -0,0 +1,27 @@
+#[lang = "sized"]
+pub trait Sized {
+    // Empty.
+}
+
+#[lang = "fn_once"]
+pub trait FnOnce<Args> {
+    /// 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<F: FnOnce(i32) -> 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 (file)
index 0000000..5927624
--- /dev/null
@@ -0,0 +1,37 @@
+#[lang = "sized"]
+pub trait Sized {
+    // Empty.
+}
+
+#[lang = "fn_once"]
+pub trait FnOnce<Args> {
+    /// 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<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
+    match compare(&v1, &v2) {
+        Ordering::Less | Ordering::Equal => v2,
+        Ordering::Greater => v1,
+    }
+}
+
+pub fn min_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
+    match compare(&v1, &v2) {
+        Ordering::Less | Ordering::Equal => v1,
+        Ordering::Greater => v2,
+    }
+}
index eaa2a1e0d0bc2c5d743a5cd01f4b9258947ade9d..92fa81517da8115b03f6d7cfb06b88e2047aa324 100644 (file)
@@ -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