[PATCH] D11940: don't diagnose -Wunused-parameter in virtual method or method that overrides base class method

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 12 11:16:32 PDT 2015


On Wed, Aug 12, 2015 at 11:12 AM, Nico Weber <thakis at chromium.org> wrote:

> On Wed, Aug 12, 2015 at 11:06 AM, David Blaikie <dblaikie at gmail.com>
> wrote:
>
>>
>>
>> On Wed, Aug 12, 2015 at 10:11 AM, Nico Weber <thakis at chromium.org> wrote:
>>
>>> On Tue, Aug 11, 2015 at 10:15 PM, Daniel Marjamäki <
>>> Daniel.Marjamaki at evidente.se> wrote:
>>>
>>>>
>>>> ideally there should be no -Wunused-parameter compiler warning when the
>>>> parameter is used.
>>>>
>>>> would it feel better to move the "FP" warnings about virtual functions,
>>>> for instance to clang-tidy?
>>>>
>>>> > If you enable this warning, you probably want to know about unused
>>>> parameters, independent of if your function is virtual or not, no?
>>>>
>>>> imho there are some compiler warnings that are too noisy. I don't like
>>>> to get a warning when there is obviously no bug:
>>>>
>>>> sign compare:
>>>>   if the signed value is obviously not negative then there is no bug:
>>>>     signed x;  .. if (x>10 && x < s.size())
>>>> unused parameter:
>>>>   could check in the current translation unit if the parameter is used
>>>> in an overloaded method.
>>>>
>>>
>>> It doesn't warn about the presence of the parameter, but about the
>>> presence of the name. If you say f(int, int) instead of f(int a, int b)
>>> then the warning won't fire.
>>>
>>
>>
>>> (And if you don't like this warning, then don't enable it.)
>>>
>>
>> This isn't usually the approach we take with Clang's warnings - we try to
>> remove false positives (where "false positive" is usually defined as
>> "diagnoses something which is not a bug" (where bug is defined as "the
>> resulting program behaves in a way that the user doesn't intend/expect"))
>> where practical.
>>
>
> Sure, for warnings that are supposed to find bugs. The -Wunused warnings
> warn about stuff that's unused, not bugs.
>

Seems a reasonable analog here, though, would be that a true positive for
-Wunused is when the thing really is unused and should be removed.
Commenting out the variable name is the suppression mechanism to workaround
false positives. If there's a targetable subset of cases where the s/n is
low enough, it could be reasonable to suppress the warning in that subset,
I think.

(see improvements to -Wunreachable-code to suppress cases that are
unreachable in this build (sizeof(int) == 4 conditions, macros, etc), or
represent valid defensive programming (default in a covered enum switch) to
make the diagnostic more useful/less noisy)


>
>
>>
>> If the subset of cases where this warning fires on parameters to virtual
>> functions produces more noise (if a significant % of cases just result in
>> commenting out the parameter name rather than removing the parameter) than
>> signal, it's certainly within the realm of discussion that we have about
>> whether that subset of cases is worth keeping in the warning.
>>
>> - David
>>
>>
>>>
>>>
>>>> constructor initialization order:
>>>>   should not warn if the order obviously does not matter. for instance
>>>> initialization order of pod variables using constants.
>>>> etc
>>>>
>>>> Best regards,
>>>> Daniel Marjamäki
>>>>
>>>>
>>>> ..................................................................................................................
>>>> Daniel Marjamäki Senior Engineer
>>>> Evidente ES East AB  Warfvinges väg 34  SE-112 51 Stockholm  Sweden
>>>>
>>>> Mobile:                 +46 (0)709 12 42 62
>>>> E-mail:                 Daniel.Marjamaki at evidente.se
>>>>
>>>> www.evidente.se
>>>>
>>>> ________________________________________
>>>> Från: thakis at google.com [thakis at google.com] för Nico Weber [
>>>> thakis at chromium.org]
>>>> Skickat: den 11 augusti 2015 20:50
>>>> Till: David Blaikie
>>>> Kopia: reviews+D11940+public+578c1335b27aa98b at reviews.llvm.org; Daniel
>>>> Marjamäki; cfe-commits at lists.llvm.org
>>>> Ämne: Re: [PATCH] D11940: don't diagnose -Wunused-parameter in virtual
>>>> method or method that overrides base class method
>>>>
>>>> On Tue, Aug 11, 2015 at 11:32 AM, David Blaikie <dblaikie at gmail.com
>>>> <mailto:dblaikie at gmail.com>> wrote:
>>>>
>>>>
>>>> On Tue, Aug 11, 2015 at 8:46 AM, Nico Weber via cfe-commits <
>>>> cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>> wrote:
>>>> Can't you just change your signature to
>>>>
>>>>   virtual void a(int /* x */) {}
>>>>
>>>> in these cases?
>>>>
>>>> You could - does it add much value to do that, though?
>>>>
>>>> If you enable this warning, you probably want to know about unused
>>>> parameters, independent of if your function is virtual or not, no?
>>>>
>>>> (perhaps it does - it means you express the intent that the parameter
>>>> is not used and the compiler helps you check that (so that for the
>>>> parameters you think /should/ be used (you haven't commented out their name
>>>> but accidentally shadow or otherwise fail to reference, you still get a
>>>> warning))
>>>>
>>>> - David
>>>>
>>>>
>>>> On Tue, Aug 11, 2015 at 6:43 AM, Daniel Marjamäki <
>>>> cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>> wrote:
>>>> danielmarjamaki created this revision.
>>>> danielmarjamaki added a reviewer: krememek.
>>>> danielmarjamaki added a subscriber: cfe-commits.
>>>>
>>>> Don't diagnose -Wunused-parameter in methods that override other
>>>> methods because the overridden methods might use the parameter
>>>>
>>>> Don't diagnose -Wunused-parameter in virtual methods because these
>>>> might be overriden by other methods that use the parameter.
>>>>
>>>> Such diagnostics could be more accurately written if they are based on
>>>> whole-program-analysis that establish if such parameter is unused in all
>>>> methods.
>>>>
>>>>
>>>>
>>>> http://reviews.llvm.org/D11940
>>>>
>>>> Files:
>>>>   lib/Sema/SemaDecl.cpp
>>>>   test/SemaCXX/warn-unused-parameters.cpp
>>>>
>>>> Index: test/SemaCXX/warn-unused-parameters.cpp
>>>> ===================================================================
>>>> --- test/SemaCXX/warn-unused-parameters.cpp
>>>> +++ test/SemaCXX/warn-unused-parameters.cpp
>>>> @@ -32,3 +32,20 @@
>>>>    auto l = [&t...]() { return sizeof...(s); };
>>>>    return l();
>>>>  }
>>>> +
>>>> +// Don't diagnose virtual methods or methods that override base class
>>>> +// methods.
>>>> +class Base {
>>>> +public:
>>>> +  virtual void f(int x);
>>>> +};
>>>> +
>>>> +class Derived : public Base {
>>>> +public:
>>>> +  // Don't warn in overridden methods.
>>>> +  virtual void f(int x) {}
>>>> +
>>>> +  // Don't warn in virtual methods.
>>>> +  virtual void a(int x) {}
>>>> +};
>>>> +
>>>> Index: lib/Sema/SemaDecl.cpp
>>>> ===================================================================
>>>> --- lib/Sema/SemaDecl.cpp
>>>> +++ lib/Sema/SemaDecl.cpp
>>>> @@ -10797,8 +10797,13 @@
>>>>
>>>>      if (!FD->isInvalidDecl()) {
>>>>        // Don't diagnose unused parameters of defaulted or deleted
>>>> functions.
>>>> -      if (!FD->isDeleted() && !FD->isDefaulted())
>>>> -        DiagnoseUnusedParameters(FD->param_begin(), FD->param_end());
>>>> +      if (!FD->isDeleted() && !FD->isDefaulted()) {
>>>> +        // Don't diagnose unused parameters in virtual methods or
>>>> +        // in methods that override base class methods.
>>>> +        const auto MD = dyn_cast<CXXMethodDecl>(FD);
>>>> +        if (!MD || (MD->size_overridden_methods() == 0U &&
>>>> !MD->isVirtual()))
>>>> +          DiagnoseUnusedParameters(FD->param_begin(), FD->param_end());
>>>> +      }
>>>>        DiagnoseSizeOfParametersAndReturnValue(FD->param_begin(),
>>>> FD->param_end(),
>>>>                                               FD->getReturnType(), FD);
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> cfe-commits mailing list
>>>> cfe-commits at lists.llvm.org<mailto:cfe-commits at lists.llvm.org>
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>>
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150812/6a7352ea/attachment-0001.html>


More information about the cfe-commits mailing list