From 94bb6be185aba4450aedd45b53d08d04732b5bc6 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 3 Nov 2025 10:43:39 +0100 Subject: [PATCH] C++ Interop: Make `CppVoidType` always-incomplete (#6302) Part of https://github.com/carbon-language/carbon-lang/issues/6280. --- .../interop/cpp/function/void_pointer.carbon | 9 +++++++-- toolchain/check/type_completion.cpp | 14 ++++++++++++-- toolchain/diagnostics/diagnostic_kind.def | 1 + 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/function/void_pointer.carbon b/toolchain/check/testdata/interop/cpp/function/void_pointer.carbon index 58b995ecb993..c6791bdcb235 100644 --- a/toolchain/check/testdata/interop/cpp/function/void_pointer.carbon +++ b/toolchain/check/testdata/interop/cpp/function/void_pointer.carbon @@ -84,13 +84,18 @@ fn F() { //@dump-sem-ir-end } -// --- todo_fail_void.carbon +// --- fail_void.carbon library "[[@TEST_NAME]]"; import Cpp inline ""; -fn F(x: Cpp.void); +// CHECK:STDERR: fail_void.carbon:[[@LINE+5]]:6: error: parameter has incomplete type `Cpp.void` in function definition [IncompleteTypeInFunctionParam] +// CHECK:STDERR: fn F(x: Cpp.void) {} +// CHECK:STDERR: ^~~~~~~~~~~ +// CHECK:STDERR: fail_void.carbon: note: `Cpp.void` is always-incomplete [CppVoidIncomplete] +// CHECK:STDERR: +fn F(x: Cpp.void) {} // --- non_nullable_pointer.carbon diff --git a/toolchain/check/type_completion.cpp b/toolchain/check/type_completion.cpp index 8d0c89f23fa7..ecd0de7207f7 100644 --- a/toolchain/check/type_completion.cpp +++ b/toolchain/check/type_completion.cpp @@ -195,8 +195,7 @@ class TypeCompleter { auto BuildInfoForInst(SemIR::TypeId /*type_id*/, SemIR::CppVoidType /*inst*/) const -> SemIR::CompleteTypeInfo { - // TODO: `CppVoidType` should be always-incomplete. - return {.value_repr = MakeEmptyValueRepr()}; + CARBON_FATAL("`CppVoidType` is always-incomplete"); } auto BuildInfoForInst(SemIR::TypeId type_id, @@ -372,6 +371,17 @@ auto TypeCompleter::AddNestedIncompleteTypes(SemIR::Inst type_inst) -> bool { Push(context_->types().GetTypeIdForTypeInstId(inst.inner_id)); break; } + case SemIR::CppVoidType::Kind: { + // TODO: Consider checking `VoidTy` for completeness and checking whether + // this extra check triggers an error. For that, reuse the code in + // https://github.com/carbon-language/carbon-lang/blob/ca3f95faa610fdb9412c9e58ece524abf30c7a9e/toolchain/check/cpp/import.cpp#L2317-L2325. + if (diagnoser_) { + CARBON_DIAGNOSTIC(CppVoidIncomplete, Note, + "`Cpp.void` is always-incomplete"); + diagnoser_().Note(SemIR::LocId::None, CppVoidIncomplete).Emit(); + } + return false; + } case CARBON_KIND(SemIR::CustomLayoutType inst): { for (auto field : context_->struct_type_fields().Get(inst.fields_id)) { Push(context_->types().GetTypeIdForTypeInstId(field.type_inst_id)); diff --git a/toolchain/diagnostics/diagnostic_kind.def b/toolchain/diagnostics/diagnostic_kind.def index a66c4ceb3e1e..20d78a84b14b 100644 --- a/toolchain/diagnostics/diagnostic_kind.def +++ b/toolchain/diagnostics/diagnostic_kind.def @@ -289,6 +289,7 @@ CARBON_DIAGNOSTIC_KIND(ClassForwardDeclaredHere) CARBON_DIAGNOSTIC_KIND(ClassSpecificDeclOutsideClass) CARBON_DIAGNOSTIC_KIND(ClassSpecificDeclPrevious) CARBON_DIAGNOSTIC_KIND(ClassIncompleteWithinDefinition) +CARBON_DIAGNOSTIC_KIND(CppVoidIncomplete) CARBON_DIAGNOSTIC_KIND(GenericVirtual) CARBON_DIAGNOSTIC_KIND(OverrideWithoutBase) CARBON_DIAGNOSTIC_KIND(OverrideWithoutVirtualInBase)