[COMMITTED 134/141] gccrs: emit an error for type or const parameters on foreign items

arthur.cohen@embecosm.com arthur.cohen@embecosm.com
Mon Mar 24 12:45:57 GMT 2025


From: Ryutaro Okada <1015ryu88@gmail.com>

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 <1015ryu88@gmail.com>
---
 gcc/rust/typecheck/rust-hir-type-check-implitem.cc | 11 +++++++++++
 gcc/testsuite/rust/compile/extern_generics.rs      |  8 ++++++++
 2 files changed, 19 insertions(+)
 create mode 100644 gcc/testsuite/rust/compile/extern_generics.rs

diff --git a/gcc/rust/typecheck/rust-hir-type-check-implitem.cc b/gcc/rust/typecheck/rust-hir-type-check-implitem.cc
index 7d31d3653ce..a5ae54bf493 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 00000000000..26f97a64ff5
--- /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
-- 
2.45.2



More information about the Gcc-rust mailing list