aaron.ballman added a comment.

In D143524#4150289 <https://reviews.llvm.org/D143524#4150289>, @v.g.vassilev 
wrote:

> In D143524#4150286 <https://reviews.llvm.org/D143524#4150286>, @aaron.ballman 
> wrote:
>
>> In D143524#4148024 <https://reviews.llvm.org/D143524#4148024>, @v.g.vassilev 
>> wrote:
>>
>>> Indeed the warning is noisy but it will potentially fix broken code which 
>>> were unable to diagnose before. Especially that in some cases where static 
>>> templates in header files are used as an idiom. In theory this approach can 
>>> extend to cases described in https://wg21.link/p2691 where our inability to 
>>> diagnose/fix these cases leads to some design decisions which may not be 
>>> optimal.
>>
>> We need to ensure the diagnostic is not so noisy that people disable it, 
>> though. That means a low false positive rate and a straight-forward way to 
>> silence the diagnostic on a case-by-case basis.
>
> I agree, so far I have not seen false positives. All issues (except for 
> `-Wctad-maybe-unsupported` as mentioned above) seemed real. Do you have a 
> particular example in mind?

The concrete example I have is the one under discussion from the test cases, 
but I was also speaking about the libc++ work that's going on as well. In 
general, it's best to try the diagnostic on some large-scale C++ projects to 
see what kind of results you get (compiling projects like LLVM, Qt, Kokkos, 
Chromium, etc). That usually helps spot other situations like 
`-Wctad-maybe-unused` etc.



================
Comment at: clang/test/SemaCXX/warn-func-not-needed.cpp:13
 namespace test1_template {
-template <typename T> static void f() {}
+template <typename T> static void f() {} // expected-warning {{unused function 
template}}
 template <> void f<int>() {} // expected-warning {{function 'f<int>' is not 
needed and will not be emitted}}
----------------
v.g.vassilev wrote:
> aaron.ballman wrote:
> > v.g.vassilev wrote:
> > > aaron.ballman wrote:
> > > > Why is this unused? `f<long>()` in `foo()` should cause this to be 
> > > > used, right?
> > > > 
> > > > How should a user silence this diagnostic without disabling it entirely?
> > > Nobody uses `foo`.
> > Ah, good point on `foo` not being used, but the question still stands -- 
> > how does the user silence this diagnostic? It's not at all uncommon to have 
> > a primary template with specializations where the TU only uses either the 
> > primary or a specialization, but not both (and certainly not all 
> > specializations).
> @philnik used `[[maybe_unused]]` which seemed reasonable to me for silencing 
> the diagnostic. Maybe take a look at the changes done here: 
> https://reviews.llvm.org/D144667
That's reasonable if the interface is one the user controls, such as one within 
a .cpp file. But the situation I'm worried about is where the primary template 
and specializations live in a header file that's shared between multiple TUs. I 
don't think it's reasonable to expect users to put `[[maybe_unused]]` on the 
primary template and all specializations in that situation.


Repository:
  rC Clang

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

https://reviews.llvm.org/D143524

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

Reply via email to