https://gcc.gnu.org/g:8ad4296118148eecf28ade7c6fc537771bdfca06

commit r15-8857-g8ad4296118148eecf28ade7c6fc537771bdfca06
Author: Ryutaro Okada <1015ry...@gmail.com>
Date:   Fri Mar 14 21:25:03 2025 +0900

    gccrs: emit an error for type or const parameters on foreign items
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-hir-type-check-implitem.cc 
(TypeCheckTopLevelExternItem::visit):
                    emit an error for type or const parameters on foreign items
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/extern_generics.rs: New test.
    
    Signed-off-by: Ryutaro Okada <1015ry...@gmail.com>

Diff:
---
 gcc/rust/typecheck/rust-hir-type-check-implitem.cc | 11 +++++++++++
 gcc/testsuite/rust/compile/extern_generics.rs      |  8 ++++++++
 2 files changed, 19 insertions(+)

diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc 
b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
index 7d31d3653ce1..a5ae54bf4930 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
@@ -86,9 +86,20 @@ TypeCheckTopLevelExternItem::visit 
(HIR::ExternalFunctionItem &function)
            case HIR::GenericParam::GenericKind::CONST:
              // FIXME: Skipping Lifetime and Const completely until better
              // handling.
+             if (parent.get_abi () != Rust::ABI::INTRINSIC)
+               {
+                 rust_error_at (function.get_locus (), ErrorCode::E0044,
+                                "foreign items may not have const parameters");
+               }
              break;
 
              case HIR::GenericParam::GenericKind::TYPE: {
+               if (parent.get_abi () != Rust::ABI::INTRINSIC)
+                 {
+                   rust_error_at (
+                     function.get_locus (), ErrorCode::E0044,
+                     "foreign items may not have type parameters");
+                 }
                auto param_type
                  = TypeResolveGenericParam::Resolve (*generic_param);
                context->insert_type (generic_param->get_mappings (),
diff --git a/gcc/testsuite/rust/compile/extern_generics.rs 
b/gcc/testsuite/rust/compile/extern_generics.rs
new file mode 100644
index 000000000000..26f97a64ff5d
--- /dev/null
+++ b/gcc/testsuite/rust/compile/extern_generics.rs
@@ -0,0 +1,8 @@
+#[lang="sized"]
+trait Sized {}
+
+
+// E0044
+fn main() {
+extern "C" { fn some_func<T>(x: T); } // { dg-error "foreign items may not 
have type parameters .E0044." }
+}
\ No newline at end of file

Reply via email to