On Tuesday, 27 August 2024 at 22:22:12 UTC, Walter Bright wrote:
> On 8/26/2024 10:26 AM, Steven Schveighoffer wrote:
> I don't think you understand the problem here.
printf
doesn't use the GC. It doesn't throw. This is not conjecture or philosophy, it objectively, explicitly does not do this.
I know everything there is to know about printf. I've implemented a Standard compliant one :-)
If you are arguing it can possibly use the GC or throw an exception, then I'd like to hear more about how the standard allows that!
> I've also proposed an exemption to make printf usable from @safe code.
printf
is already usable from @safe
code through interpolation overloads.
> > This must be fixed. There is no other option. If this is not fixed, you cannot use importC to actually import C.
I remember when you were adamantly against C code defaulting to @trusted.
I still am.
> Assuming nothrow and @nogc is in the same category.
It's not. C doesn't have a GC nor does it have an ability to throw D exceptions, whereas it can possibly have a safe interface.
But this isn't even close to the same problem anyway -- what we were talking about with "make C prototypes safe by default" were extern(C)
prototypes written in D. That is, these weren't in the C language, which has no concept of marking for any D attributes. It is a bad default, and probably just kills D as a memory safe language, but it could at least be worked around if you cared enough.
The problem here isn't the default, the problem is the inability to mark because the language doesn't support it.
While making the default @nogc nothrow
is at least consistent with C (as is making C functions @system
), a problem with that approach is that unlike @system
, there is no attribute to cancel @nogc
or nothrow
. So if we made the default attributes for importC code nothrow @nogc
, then there would be no way to cancel that default.
> I agree this is a problem.
Yes, it is causing problems with people who want to write correct attributes in their D code. As I linked to in my project, I have to leave my D code that does not throw or use the GC unmarked, because of printf
from importC. This makes importC unusable unless you just don't care about any attributes.
-Steve