[PATCH] D52795: [analyzer][PlistMacroExpansion] Part 3.: Macro arguments are expanded

Umann Kristóf via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 5 03:19:33 PST 2018


Szelethus marked 6 inline comments as done.
Szelethus added inline comments.


================
Comment at: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp:677
+/// need to expanded further when it is nested inside another macro.
+class MacroArgMap : public std::map<const IdentifierInfo *, ExpArgTokens> {
+public:
----------------
NoQ wrote:
> Szelethus wrote:
> > Szelethus wrote:
> > > george.karpenkov wrote:
> > > > Please don't do this, inheritance from standard containers is a bad thing (tm)
> > > Actually, I disagree with you on this one. For ease of use, these constructs are used all over the place in the LLVM codebase, and since I never do anything inheritance related, this shouldn't hurt much.
> > > 
> > > https://clang.llvm.org/doxygen/classclang_1_1ento_1_1PathPieces.html
> > > http://llvm.org/doxygen/classllvm_1_1PredicateBitsetImpl.html
> > > http://llvm.org/doxygen/classllvm_1_1HexagonBlockRanges_1_1RangeList.html
> > > 
> > > These are just a few.
> > > 
> > > Do you insist?
> > I mean, polymorphism, not inheritance.
> Dunno why exactly, but George really hates these :)
> 
> To me it's a reasonable thing to use in a tiny utility class - as opposed to re-implementing all vector methods in a composition every time you need just one extra method.
> 
> It should also be possible to avoid this by sacrificing object-oriented-ness by turning the newly added method into a standalone function, i.e.:
> ```
> using MacroArgMap = std::map<const IdentifierInfo *, ExpArgTokens>;
> void expandFromPrevMacro(MacroArgMap &This, const MacroArgMap &Super);
> ```
> 
> Which also seems almost free.
I personally very much prefer the current state :/ It is locally defined on a bottom of a file, I think I'll commit as is.


================
Comment at: lib/StaticAnalyzer/Core/PlistDiagnostics.cpp:965-966
+
+      It = CurrExpArgTokens.insert(
+          It, SuperExpArgTokens.begin(), SuperExpArgTokens.end());
+      std::advance(It, SuperExpArgTokens.size());
----------------
NoQ wrote:
> I think it's the first time in my life when i see a loop that (correctly) mutates the container :)
Yay ^-^


https://reviews.llvm.org/D52795





More information about the cfe-commits mailing list