While d_type is a non-standard extension to struct dirent, only glibc signals its presence with another macro _DIRENT_HAVE_D_TYPE. However, any platform with d_type also includes a way to convert to mode_t values using the macro DTTOIF, so we can check for that alone and still be confident that the d_type member exists.
(If this turns out to be wrong, I'll go back and set up an actual CMake check.)
I couldn't think of how to write a test for this, because I couldn't think of how to test that a stat call doesn't happen without controlling the filesystem or intercepting stat, and there's no good cross-platform way to do that that I know of.
Follow-up (almost a year later) to D51918.
rdar://problem/50592673