alexfh added a comment.

Thank you for the patch!

In https://reviews.llvm.org/D24349#537500, @aaron.ballman wrote:

> In https://reviews.llvm.org/D24349#537350, @Eugene.Zelenko wrote:
>
> > Probably check should have options to extend list of containers and also to 
> > assume all classes with integer type size() const and bool empty() const as 
> > containers. It may be not trivial to find out all custom containers and 
> > last option will be helpful to assemble such list.
>
>
> I think this should actually have two options: one is a list of 
> default-checked containers (default is the list of 
>  STL containers we previously had), and the other is a Boolean option for 
> guessing at what might be a 
>  container based on function signature (default is true). This gives people a 
> way to silence the diagnostic 
>  while still being useful.


While I understand your concerns, I would suggest to wait for actual bug 
reports before introducing more options. The duck typing approach worked really 
well for readability-redundant-smartptr-get and I expect it to work equally 
well here. The constraints checked here are pretty strict and should make the 
check safe.

> I would document what function signatures we use as our heuristic, but note 
> that the function signatures we care about may change (for instance, we may 
> decide that const-qualification is unimportant, or that we want to require 
> begin()/end() functions, etc). I think `<standard integer type> size() const` 
> and `bool empty() const` are a reasonable heuristic for a first pass.


Yep, documentation should be updated accordingly.


================
Comment at: clang-tidy/readability/ContainerSizeEmptyCheck.cpp:33
@@ +32,3 @@
+  const auto validContainer = namedDecl(
+      has(functionDecl(
+          isPublic(), hasName("size"), returns(isInteger()),
----------------
aaron.ballman wrote:
> omtcyfz wrote:
> > Thank you!
> > 
> > Blacklisted these types.
> > 
> > Actually, I believe if someone has `bool size()` in their codebase there's 
> > still a problem...
> > Blacklisted these types.
> 
> I'm still not certain this is correct. For instance, if someone wants to do 
> `uint8_t size() const;`, we shouldn't punish them because `uint8_t` happens 
> to be `unsigned char` for their platform. But you are correct that we don't 
> want this to work with char32_t, for instance.
> 
> I think the best approach is to make a local matcher for the type predicate. 
> We want isInteger() unless it's char (that's not explicitly qualified with 
> signed or unsigned), bool, wchar_t, char16_t, char32_t, or an enumeration 
> type.
> 
> > Actually, I believe if someone has bool size() in their codebase there's 
> > still a problem...
> 
> Agreed, though not as part of this check. ;-)
Same here, let's wait for a real user asking to support his real container 
class that defines `uint8_t size() const;`.

================
Comment at: clang-tidy/readability/ContainerSizeEmptyCheck.cpp:145
@@ -144,3 +144,3 @@
   }
   diag(MemberCall->getLocStart(), "the 'empty' method should be used to check "
                                   "for emptiness instead of 'size'")
----------------
Since we're expanding the set of supported classes, it makes sense to include 
the name of the class to the diagnostic message.


Repository:
  rL LLVM

https://reviews.llvm.org/D24349



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

Reply via email to