So I've been working with clang as a library on Windows for a little while
now, and I'm noticed a few things that I'd like to change, but in order to
do so I need to know the "clang policy" for such things first.
There is a flag, MSVCCompat, which as you probably know already, tweaks
some things so that clang works better on Windows.
However, other flags are required, such as DelayedTemplateParsing, in
order for things to work. Now I understand that these need to be separate
flags so that users on other platforms can enable things like
DelayedTemplateParsing for other reasons, but as it stands enabling
MSVCCompat doesn't make clang compatible with Windows.
As a result, I'd like to fix this problem by making things like
DelayedTemplateParsing take effect when MSVCCompat is turned on. However,
this would make it so that the "implied" flags would essentially have no
effect, and turning off DelayedTemplateParsing would not have any effect if
MSVCCompat was turned off.
I see our MSVC compatibility story a little differently. We offer a
multitude of flags which control different aspects of compatibility with
MSVC:
-fms-extensions
-fms-compatibility
-fdelayed-template-parsing
-fms-compatibility-version/-fmsc-version
-fthreadsafe-statics
-relaxed-aliasing
/vd0, /vd1, /vd2
/vmg, /vmb, /vms, /vmv, /vmm
...
While many (all?) of these flags have some effect on language conformance,
there are perhaps two which have no discernible ABI impact (outside of,
say, SFINAE): -fms-compatibility and -fdelayed-template-parsing.
These two flags engage orthogonal pieces of our compatibility machinery and
the intent is to ask users of clang to enable the bare minimum they need in
the hopes that we would encourage authorship of code which is portable and
free of reliance on compiler quirks. -fms-compatibility is less bad than
-fdelayed-template-parsing in my eyes in that -fdelayed-template-parsing
will result in ASTs which have way worse fidelity.
I think it is reasonable for tools like clang-cl to enable both flags by
default due to it's fundamental nature but I don't think that's a decision
we'd want to make for tools at large.
At a rather fundamental level the tool really needs to know whether or not
it should run the frontend with /vd2 or /vmv, some information must be
supplied to us. I would rather see tools actively make the decision to use
-fdelayed-template-parsing instead of get opted into it.
Furthermore, I can't see the point in having both a MSCompatibility flag
and a MSVCCompat flag; surely we should have one or the other?
I can't seem to find MSCompatibility as an identifier in clang's sources.
However, I can find the similarly named MSCompatibilityVersion.
MSCompatibilityVersion is intended to be useful outside of MSVCCompat:
clang emitting MSVC-style diagnostics when targeting non-MSVC platforms is
a not-uncommon thing; some versions of VisualStudio do the wrong thing and
MSCompatibilityVersion lets us know if we should work around them (see
Frontend/TextDiagnostic.cpp).