Fix bugzilla issue 24517: druntime tests crash on FreeBSD 14 #16405
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
FreeBSD 14 changed the signature of qsort_r to be POSIX-compliant with POSIX, making it so that our binding for it no longer matches, resulting in a crash when it's used.
This implements a fix similar to what the FreeBSD headers do to avoid breaking code (they provide a static inline extern(C++) overload for the old signature). This provides a deprecated extern(D) overload for the old signature. The extern(C) overload now matches the new signature. The changes have been versioned so that they only affect FreeBSD 14 and newer.
Technically, if someone used Cmp when declaring their function for qsort_r, this would still break them (though with a compilation error that should be easy to fix rather than silent breakage or a crash), but I don't really see a way around that, and Cmp is not part of the POSIX API, so no one would have a clue that it was a thing without digging through the bindings. Arguably, we should make it private, since it's not part of POSIX, but I haven't done anything with that in this commit. My guess is that in reality, no D programs are both written to use qsort_r and run on FreeBSD (outside of the druntime tests), but this way, they won't break unless they use Cmp to declare their comparator function. They'll just get a deprecation message that they should update their code.
Regardless, we have to change the signature for FreeBSD 14 for it to work, and this does that.