On Tue, 20 Aug 2024 at 10:26, Gregor Mückl via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
On Sunday, 18 August 2024 at 09:42:16 UTC, Nicholas Wilson wrote:
> On Sunday, 18 August 2024 at 04:43:34 UTC, Manu wrote:
>> I just tried using ImportC for the first time ever, but I was
>> surprised
>> when I immediately received a sea of errors calling the C
>> symbols from
>> `nothrow @nogc` functions.
>> My entire program is `nothrow @nogc`... I assumed ImportC
>> would be
>> supremely suitable in this context, but apparently not...
>>
>> Is there something I've missed? Is there a plan for this?
>> I found just one single very short forum thread...
>>
>> This is classic D experience; so much work has been done on
>> this, and then the moment I try and use something I encounter
>> a showstopping oversight >_<
>
> Well, C may call C++ which may throw. It is very unlikely to
> call the GC however.
>
> I don't think it would be hard to add a switch that
> "`extern(C)` functions being called from import C are `@nogc`".

Here's what I'm thinking:

The C function interface has no notion of C++ exceptions (AFAIK
it's following C specs, not C++), so C++ exceptions should not
even be a consideration at that point. I do not think that
throwing a C++ exception up a stack that contains extern(C)
functions is even properly defined behavior on the C++ side. In
other words, all ImportC declarations should be implicitly
@nothrow.

Any usage of the D GC from a C interface could only come in two
flavors: D code exported through a C interface or a C interface
implemented in another language that uses the D GC through a
library interface. I believe that both cases should be treated as
if the use of the D GC is an implementation detail and an
implicit @nogc is warranted.

Exactly... these points are my precise assumption going in here.
Also, considering the possibility that D code is called from C code via a function pointer; you have to wonder how the C code received a function pointer in the first place? If the C code is nothrow @nogc, then it would be impossible to supply a function pointer that was not also nothrow @nogc to the C code in the first place.