EricWF added inline comments.

================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:2129
+def warn_class_template_argument_deduction_no_user_defined_guides : Warning<
+  "using class template argument deduction for %0 that has no user-defined 
deduction guides" >,
+  InGroup<ImplicitCTADUsage>, DefaultIgnore;
----------------
rsmith wrote:
> gromer wrote:
> > EricWF wrote:
> > > rsmith wrote:
> > > > gromer wrote:
> > > > > I'd prefer a phrasing more along the lines of "using class template 
> > > > > argument deduction for %0 that might not intentionally support it". 
> > > > > That gives us more room to do things like add an attribute later if 
> > > > > necessary, and it helps the user understand why this warning 
> > > > > indicates a potential problem.
> > > > I like that approach; something like "using class template argument 
> > > > deduction for %0 that might not intend to support it" -- or perhaps 
> > > > more directly "%0 might not intend to support class template argument 
> > > > deduction" -- along with a note describing how to syntactically 
> > > > suppress the warning (w"add a deduction guide to suppress this warning" 
> > > > or "use the [[clang::ctad]] attribute to suppress this warning" or 
> > > > whatever we decide is best).
> > > This sounds like a reasonable change to me. Done.
> > > 
> > > I'm not sure an attribute is needed at this point; AFAIK there is no case 
> > > where a user defined guide can't be added. Even if it's just a dummy 
> > > guide to suppress the warning. For example:
> > > 
> > > ```
> > > 
> > > struct allow_ctad_t {
> > >   allow_ctad_t() = delete;
> > > };
> > > 
> > > template <class T>
> > > struct TestSuppression {
> > >   TestSuppression(int, T) {}
> > > };
> > > TestSuppression(allow_ctad_t) -> TestSuppression<void>;
> > > ```
> > > 
> > > Also, before we add an attribute, we want to be sure that it's not 
> > > harmful to allowing users to suppress the warning without actually 
> > > addressing the root problem (tha implicit CTAD results are often 
> > > surprising). I would like to see real world examples of types that don't 
> > > need user-defined guides to work.
> > > 
> > > I'm not sure an attribute is needed at this point
> > 
> > I agree; I just want to keep the option open in case we decide we need one 
> > later.
> `TestSuppression(allow_ctad_t) -> TestSuppression<void>;` doesn't always work:
> 
> ```
> struct X { X(); };
> template<typename T = X> struct TestSuppression {
>   TestSuppression(T);
> };
> TestSuppression(allow_ctad_t) -> TestSuppression<void>;
> TestSuppression x({}); // ok without deduction guide, ill-formed with
> ```
> 
> I think this should work reliably (note that the incomplete parameter type 
> makes the deduction guide always non-viable):
> 
> ```TestSuppression(struct AllowCTAD) -> TestSuppression<void>;```
> 
> ... and maybe we should suggest that in our note, perhaps with a fix-it hint 
> pointing immediately after the class template definition?
I'm a bit skeptical of a diagnostic pointing at white space at the end of 
classes. If we could produce a actionable fixit, then maybe, but what do we put 
on the right hand side of `->`?


================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:2132
+def note_suppress_ctad_maybe_unsupported : Note<
+  "add a user-defined deduction guide to suppress this warning">;
+
----------------
rsmith wrote:
> Drop "user-defined" here? (There's no other kind of deduction guide.)
lol. Are you saying asking the user to define a user-defined entity is 
redundant? 


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D56731/new/

https://reviews.llvm.org/D56731



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to