[PATCH] D82728: [clang] Add -Wsuggest-override

Logan Smith via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 7 00:49:24 PDT 2020


logan-5 added a comment.

Glad this is generating some discussion. For my $0.02, I would also (obviously) love to be able to enable this warning on all the codebases I work on, and this patch was born out of a discussion on the C++ Slack with another user who had found this warning very useful in GCC and was wondering why Clang didn't have it yet.

In D82728#2134072 <https://reviews.llvm.org/D82728#2134072>, @dblaikie wrote:

> The issue is that such a warning then needs to be off by default, because we can't assume the user's intent. And Clang's historically been fairly averse to off-by-default warnings due to low user-penetration (not zero, like I said, I imagine LLVM itself would use such a warning, were it implemented) & so concerns about the cost/benefit tradeoff of the added complexity (source code and runtime) of the feature.


I agree `-Wsuggest-override` should be off by default, yet I suspect its user-penetration will be much higher than other off-by-default warnings, due to numerous instances of people on the Internet asking for <https://stackoverflow.com/a/41109550/5379590> this feature <https://stackoverflow.com/a/29154136/5379590>, as well as the precedent for it set by GCC. Moreover, since this implementation of this warning lies along the exact same code paths as the already existing `-Winconsistent-missing-override`, the added complexity from this patch is absolutely minimal.



================
Comment at: clang/lib/Sema/SemaDeclCXX.cpp:3075
+              : diag::
+                    warn_inconsistent_function_marked_not_override_overriding);
+    else
----------------
Quuxplusone wrote:
> These linebreaks are super unfortunate. Could they be improved by doing it like this?
> ```
>     auto EmitDiag = [this, MD](unsigned DiagDtor, unsigned DiagFn) {
>       unsigned DiagID = isa<CXXDestructorDecl>(MD) ? DiagDtor : DiagFn;
>       Diag(MD->getLocation(), DiagID) << MD->getDeclName();
>       const CXXMethodDecl *OMD = *MD->begin_overridden_methods();
>       Diag(OMD->getLocation(), diag::note_overridden_virtual_function);
>     };
>     if (Inconsistent)
>       EmitDiag(diag::warn_inconsistent_destructor_marked_not_override_overriding,
>                diag::warn_inconsistent_function_marked_not_override_overriding);
>     else
>       EmitDiag(diag::warn_suggest_destructor_marked_not_override_overriding
>                diag::warn_suggest_function_marked_not_override_overriding);
> ```
Agreed. Good idea on the fix--needed one more line break (the first one still hit column 81), but it looks much better now.


================
Comment at: clang/test/SemaCXX/warn-suggest-destructor-override:6
+  ~A() {}
+  void virtual run() {}
+};
----------------
Quuxplusone wrote:
> Surely this doesn't compile?!
Because of `void virtual`? It does, surprisingly, as it does in the test for warn-inconsistent-missing-destructor-override, where I pilfered this from.

Nevertheless, changed to `virtual void` for sanity's sake.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D82728





More information about the cfe-commits mailing list