How do you mandate initialization, handle copies, move objects, prevent double frees? What's RAII without any of that?
You pick C because you want a language that doesn't require a variable to be initialised before mutably referencing it, and you write your defer statements or "destructors" defensively, expecting that a variable could be in any state when it comes time to dispose of it.
Or if you find that unacceptable, you accept that C isn't the language you want. There's many other choices available.
Whereas it's perfectly possible to only defer a statement when you know the "object" has been properly initialized.
That's why defer makes sense in a language like C (even Go), but RAII does not.
Cause, like, that's the entire thread.
Given the compiler would already need to know that a local is of an RAII type in order to insert the drop, move, and copy glues it’s not exactly a big requirement.
Rust has RAII and does not have constructors.