JonasToth added inline comments.

================
Comment at: test/clang-tidy/readability-function-size.cpp:207-212
+void variables_8() {
+  int a, b;
+  struct A {
+    A(int c, int d);
+  };
+}
----------------
lebedev.ri wrote:
> aaron.ballman wrote:
> > lebedev.ri wrote:
> > > aaron.ballman wrote:
> > > > lebedev.ri wrote:
> > > > > aaron.ballman wrote:
> > > > > > lebedev.ri wrote:
> > > > > > > aaron.ballman wrote:
> > > > > > > > I think the current behavior here is correct and the previous 
> > > > > > > > behavior was incorrect. However, it brings up an interesting 
> > > > > > > > question about what to do here:
> > > > > > > > ```
> > > > > > > > void f() {
> > > > > > > >   struct S {
> > > > > > > >     void bar() {
> > > > > > > >       int a, b;
> > > > > > > >     }
> > > > > > > >   };
> > > > > > > > }
> > > > > > > > ```
> > > > > > > > Does `f()` contain zero variables or two? I would contend that 
> > > > > > > > it has no variables because S::bar() is a different scope than 
> > > > > > > > f(). But I can see a case being made about the complexity of 
> > > > > > > > f() being increased by the presence of the local class 
> > > > > > > > definition. Perhaps this is a different facet of the test about 
> > > > > > > > number of types?
> > > > > > > As previously briefly discussed in IRC, i **strongly** believe 
> > > > > > > that the current behavior is correct, and 
> > > > > > > `readability-function-size`
> > > > > > > should analyze/diagnose the function as a whole, including all 
> > > > > > > sub-classes/sub-functions.
> > > > > > Do you know of any coding standards related to this check that 
> > > > > > weigh in on this?
> > > > > > 
> > > > > > What do you think about this:
> > > > > > ```
> > > > > > #define SWAP(x, y) ({__typeof__(x) temp = x; x = y; y = x;})
> > > > > > 
> > > > > > void f() {
> > > > > >   int a = 10, b = 12;
> > > > > >   SWAP(a, b);
> > > > > > }
> > > > > > ```
> > > > > > Does f() have two variables or three? Should presence of the `SWAP` 
> > > > > > macro cause this code to be more complex due to having too many 
> > > > > > variables?
> > > > > Datapoint: the doc 
> > > > > (`docs/clang-tidy/checks/readability-function-size.rst`) actually 
> > > > > already states that macros *are* counted.
> > > > > 
> > > > > ```
> > > > > .. option:: StatementThreshold
> > > > > 
> > > > >    Flag functions exceeding this number of statements. This may differ
> > > > >    significantly from the number of lines for macro-heavy code. The 
> > > > > default is
> > > > >    `800`.
> > > > > ```
> > > > > ```
> > > > > .. option:: NestingThreshold
> > > > > 
> > > > >     Flag compound statements which create next nesting level after
> > > > >     `NestingThreshold`. This may differ significantly from the 
> > > > > expected value
> > > > >     for macro-heavy code. The default is `-1` (ignore the nesting 
> > > > > level).
> > > > > ```
> > > > My concerns relate to what's considered a "variable declared in the 
> > > > body" (per the documentation) in relation to function complexity. To 
> > > > me, if the variable is not accessible lexically within the body of the 
> > > > function, it's not adding to the function's complexity *for local 
> > > > variables*. It may certainly be adding other complexity, of course.
> > > > 
> > > > I would have a very hard time explaining to a user that variables they 
> > > > cannot see or change (assuming the macro is in a header file out of 
> > > > their control) contribute to their function's complexity. Similarly, I 
> > > > would have difficulty explaining that variables in an locally declared 
> > > > class member function contribute to the number of variables in the 
> > > > outer function body, but the class data members somehow do not.
> > > > 
> > > > (per the documentation) 
> > > 
> > > Please note that the word `complexity` is not used in the 
> > > **documentation**, only `size` is.
> > > 
> > > There also is the other side of the coin:
> > > 
> > > ```
> > > #define simple_macro_please_ignore \
> > >   the; \
> > >   actual; \
> > >   content; \
> > >   of; \
> > >   the; \
> > >   foo();
> > > 
> > > // Very simple function, nothing to see.
> > > void foo() {
> > >   simple_macro_please_ignore();
> > > }
> > > 
> > > #undef simple_macro_please_ignore
> > > ```
> > > 
> > > In other words, if we ignore macros, it would be possible to abuse them 
> > > to artificially reduce complexity, by hiding it in the macros.
> > > I agree that it's total abuse of macros, but macros are in general not 
> > > nice, and it would not be good to give such things a pass.
> > > 
> > > 
> > > > My concerns relate to what's considered a "variable declared in the 
> > > > body" (per the documentation) in relation to function complexity.
> > > 
> > > Could you please clarify, at this point, your concerns are only about 
> > > this new part of the check (variables), or for the entire check?
> > > In other words, if we ignore macros, it would be possible to abuse them 
> > > to artificially reduce complexity, by hiding it in the macros.
> > 
> > I don't disagree, that's why I'm trying to explore the boundaries. Your 
> > example does artificially reduce complexity. My example using swap does not 
> > -- it's an idiomatic swap macro where the inner variable declaration adds 
> > no complexity to the calling function as it's not exposed to the calling 
> > function.
> > 
> > > Could you please clarify, at this point, your concerns are only about 
> > > this new part of the check (variables), or for the entire check?
> > 
> > Only the new part of the check involving variables.
> > > Could you please clarify, at this point, your concerns are only about 
> > > this new part of the check (variables), or for the entire check?
> 
> > Only the new part of the check involving variables.
> 
> OK.
> 
> This should be split into two boundaries:
> * macros
> * the nested functions/classes/methods in classes.
> 
> I *think* it may make sense to give the latter a pass, no strong opinion here.
> But not macros.
> (Also, i think it would be good to treat macros consistently within the 
> check.)
> 
> Does anyone else has an opinion on how that should be handled?
what is the current behaviour for aarons nested function?
i checked cppcoreguidelines and hicpp and they did not mention such a case and 
i do not recall any rule that might relate to it.

I think aaron has a good point with:
> I would have a very hard time explaining to a user that variables they cannot 
> see or change (assuming the macro is in a header file out of their control) 
> contribute to their function's complexity. Similarly, I would have difficulty 
> explaining that variables in an locally declared class member function 
> contribute to the number of variables in the outer function body, but the 
> class data members somehow do not.

But I see no way to distinguish between "good" and "bad" macros, so macro 
expansions should add to the variable count, even though your swap macro is a 
valid counter example.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D44602



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

Reply via email to