vsavchenko added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Core/BasicValueFactory.cpp:226
+        llvm::make_range(BaseList.begin(), BaseList.end()),
+        [](const auto &I) -> bool { return I.second; });
+
----------------
RedDocMD wrote:
> vsavchenko wrote:
> > I think it's all a bit too complicated now.
> > 
> > Right now you have two nested loops:
> >   1. over `PathRange`
> >   2. over `BaseList` (in `find_if`)
> > 
> > It won't be a problem to put them in another order, so when you make a 
> > `filter_range`, you can have `llvm::find_if` which will iterate over 
> > `PathRange` and captures the given `BaseList` element. So, yes nested 
> > lambdas.
> > 
> > Here is a sketch of the solution:
> > ```
> > auto BaseListFilteredRange = llvm::make_filter_range(
> >     BaseList, // you don't need to make_range here, BaseList IS a range
> >     [&PathRange](const CXXBaseSpecifier *Base) {
> >       return llvm::find_if(PathRange, [Base](const auto &It) {
> >         return Base->getType() == It.first->getType();
> >       }) == PathRange.end();
> >     });
> > ```
> > 
> > Aaaand while I was writing that, it got me thinking that we don't need 
> > `BaseList` in the first place:
> > ```
> > for (const CXXBaseSpecifier *Base : PathList)
> >   if (llvm::none_of(PathRange,
> >                     [Base](const auto &It) { return Base->getType() == 
> > It.first->getType(); })
> >       PathList = CXXBaseListFactory.add(Base, PathList);
> > ```
> Hmm, I really should brush up on my functional programming and think more in 
> terms of STL/LLVM algorithms. Thank you for pointing out this solution, 
> @vsavchenko!
> 
> One thing I noticed though, the shortened logic that you suggested removes 
> all matching instances from PathList, while my intention was to remove only 
> the first one of every kind. If there are no repetitions, it is the same. 
> And, normally, repetitions should not be present in the PathList retrieved 
> from PTM. It is a bug elsewhere if that happens. So should I add an assert 
> for that here?
Yes, that's true.
Assertions will usually make intensions of the original author more clear for 
future readers.
Plus, I think it can be also good to add a comment (something similar to your 
summary for this change) to describe what is going on here and WHY it is done.


================
Comment at: clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp:531-532
+              svalBuilder.makePointerToMember(getBasicVals().accumCXXBase(
                   llvm::make_range<CastExpr::path_const_iterator>(
-                      CastE->path_begin(), CastE->path_end()), *PTMSV));
+                      CastE->path_begin(), CastE->path_end()),
+                  *PTMSV, CastE->getCastKind()));
----------------
BTW, it looks like this can be replaced by `CastE->path()`


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D95877

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

Reply via email to