Those functions receive D mangling and hence aren't easily callable via
the header file. Note that C++ does the same for members in an
`extern "C"` aggregate (=> mangle as C++ symbol).
`
Destructors not marked as `extern (C++)` aren't accessible from C++
due to the D name mangling. The header generator used to skip `extern(D)`
destructors, allowing C++ code that violated RAII guarantees.
Declaring the constructors as `private` members ensures that any
instance that would need to be destroyed on the C++ side causes a
compiler error (rather than a linker error due to missmatched mangling).
Renamed the helper function `checkVirtualFunction` because it now also
handles other types of functions.
Adds several entries regarding C(++) keywords, extensions and default
macros provided by gcc and clang. Also rejects all identifiers starting
with __ because those are reserved by C++ compilers
Doesn't "fix" the issue because the list is confined to common keywords
and not an exhaustive list of all possible extensions.
Extends the check for C++ keywords to append an underscore instead of
raising an error whenever the actual name doesn't matter for binary
compatibility.
`Type.isConst` is false for immutable symbols, so we need to check
`isImmutable`as well.
Note that `inout` is currently mangled as mutable, so we can't rely on
`!Type.isMutable`.