================
Comment at: test/SemaCXX/warn-range-loop-analysis.cpp:41
@@ +40,3 @@
+
+  for (const int x : int_ref_container) {}
+  // expected-warning@-1 {{loop variable 'x' of type 'const int' creates a 
copy from type 'int'}}
----------------
Richard Trieu wrote:
> David Blaikie wrote:
> > Richard Trieu wrote:
> > > David Blaikie wrote:
> > > > I think this is going to have a pretty high false positive rate... do 
> > > > you have some numbers?
> > > What is your idea of a false positive?
> > Users are taught to pass ints to functions by value, rather than reference, 
> > to avoid the indirection overhead. The same logic applies (to a degree) to 
> > for loops. It's not unreasonable to write "for (const int i : 
> > my_vec_of_ints)".
> > 
> > I don't think this case is likely to be a good thing to warn on and we may 
> > need a heuristic of "if a type is 'large' enough (or has a non-trivial 
> > copy), warn when a copy is made". StringRef would be a similar situation - 
> > I can imagine lots of people (I bet we've got a few in Clang/LLVM already) 
> > looping over StringRef's by value.
> > 
> > Do you have some stats on running this warning in its current form over 
> > LLVM/Clang? (and Google, for that matter, or any other substantial 
> > codebase).
> > 
> > Looking at other test cases, this wouldn't warn if the "const" was removed? 
> > Perhaps we just need a fix to disregard cv qualifiers, then?
> LLVM/Clang has a total of 5 warnings emitted for this warning.  (Where 
> changing the variable to reference type will prevent a copy.)  Two are pairs 
> from maps, one is a CXXBaseSpecifier, one is QualType, and one is a 
> ParmVarDecl pointer.  From your description, the QualType and Decl pointer 
> are both small and trivially copyable so they should be exempt from this 
> warning, so a 40% drop in cases with your suggested filter.
> 
> Applying the same filter to results from Google, the drop is closer to 70%.  
> The filter is to ignore trivially copyable types which are 2x pointer size or 
> smaller.
> 
> The const is a good indication that the variable is read-only, so we can 
> suggest using a const-reference as the cheaper option.  Without the const, we 
> don't know if the use in the loop was intended only for the loop copy or to 
> change the object in the container as well.
You mention a 70% drop in Google - but what does a random sample of the 
remaining (and omitted) cases look like?

I'm trying to understand if this warning is good or not, as-is, which means we 
need a reasonable false positive % estimate/number to decide whether it needs 
to be tweaked further to reduce false positives (that's the main thing - if 
it's got lots of false negatives that we can gain back, that can be done in 
separate patches, but going in-tree with high false positive rates is generally 
frowned upon)

Perhaps I'm missing something where you described this already.

http://reviews.llvm.org/D4169



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to