[PATCH] D54565: Introduce `-Wctad` as a subgroup of `-Wc++14-compat`
Richard Smith - zygoloid via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 21 16:26:17 PST 2018
rsmith added a comment.
>> I think there is a case to be made for warning on this specific language feature, because using CTAD on class templates that weren't designed for it is dangerous and creates source compatibility problems for future changes to that library.
> Personally I would go stronger: using CTAD on class templates that were designed for it (1) is dangerous and (2) may create source compatibility problems for future changes to that library!
I've given this a lot of thought, and while I'm very sympathetic to your desire here, I do not think that we have sufficient justification to provide a warning to allow (effectively) disabling this language features. There's an important difference here:
- using CTAD on arbitrary class templates that weren't designed for it creates a source compatibility problem that the class template author has no control over nor say in
- using CTAD on class templates that were designed for it does not create a new source compatibility problem -- the class template author created the source compatibility problem themselves when they designed how their class templates would interact with CTAD
Either way there's a source compatibility problem, but in the second case, it's the class template author's choice to extend their source compatibility contract. So:
- I still think it's a good idea to have a warning to warn on use of CTAD on a class where there is no evidence the class was designed for CTAD (this warning would be suppressed by either an explicit deduction guide or by an attribute on the class template definition indicating that the constructors are designed to support CTAD)
- it would also seem like a good idea to have warnings for CTAD cases that we have strong evidence are dangerous (eg, for `T(x...)` where `x` expands to a pack containing a single `T`, we should warn if we use the copy-deduction candidate and there's another candidate that would have been selected if the copy-deduction candidate didn't get a priority boost)
... but I don't think we can justify warning on all CTAD.
Have you considered the `clang-tidy` route? Given that it seems like your goal is to avoid accidental use of CTAD, an out-of-band (not part of regular compilations) check that you satisfy that goal would seem like it could be part of a solution.
CHANGES SINCE LAST ACTION
More information about the cfe-commits