ImportC and nothrow/@nogc?

Richard (Rikki) Andrew Cattermole richard at cattermole.co.nz
Tue Aug 20 00:30:46 UTC 2024


On 20/08/2024 12:24 PM, Gregor Mückl 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.

Its defined for MSVC:

https://learn.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=msvc-170

"Structured exception handling (SEH) is a Microsoft extension to C and 
C++ to handle certain exceptional code situations, such as hardware 
faults, gracefully."

I'm pretty sure for other platforms it is also defined as part of 
unwinding, although I can't be bothered to hunt for the specification. 
It's not about C, it's about languages that are not C++ (consider JIT's 
for instance).


More information about the Digitalmars-d mailing list