And I reverted my revert in r301472. See the thread re: r301470. Sorry for the noise, vedant
> On Apr 26, 2017, at 2:12 PM, Vedant Kumar via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > Hi Frederich, > > I had to revert this to unblock myself (r301469). > > best, > vedant > >> On Apr 26, 2017, at 1:51 PM, Evgenii Stepanov via cfe-commits >> <cfe-commits@lists.llvm.org> wrote: >> >> Please change the signature of all overriding definitions as well. >> >> /code/llvm/tools/clang/lib/CodeGen/MacroPPCallbacks.h:114:50: error: >> non-virtual member function marked 'override' hides virtual member >> function >> const MacroDefinition &MD) override; >> ^ >> /code/llvm/tools/clang/include/clang/Lex/PPCallbacks.h:255:16: note: >> hidden overloaded virtual function >> 'clang::PPCallbacks::MacroUndefined' declared here: different number >> of parameters (3 vs 2) >> virtual void MacroUndefined(const Token &MacroNameTok, >> >> On Wed, Apr 26, 2017 at 12:47 PM, Frederich Munch via cfe-commits >> <cfe-commits@lists.llvm.org> wrote: >>> Author: marsupial >>> Date: Wed Apr 26 14:47:31 2017 >>> New Revision: 301449 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=301449&view=rev >>> Log: >>> PPCallbacks::MacroUndefined, change signature and add test. >>> >>> Summary: >>> The PPCallbacks::MacroUndefined callback is currently insufficient for >>> clients that need to track the MacroDirectives. >>> This patch adds an additional argument to PPCallbacks::MacroUndefined that >>> is the undef MacroDirective. >>> >>> Reviewers: bruno, manmanren >>> >>> Reviewed By: bruno >>> >>> Subscribers: nemanjai, cfe-commits >>> >>> Differential Revision: https://reviews.llvm.org/D29923 >>> >>> Modified: >>> cfe/trunk/include/clang/Lex/PPCallbacks.h >>> cfe/trunk/include/clang/Lex/PreprocessingRecord.h >>> cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp >>> cfe/trunk/lib/Lex/PPDirectives.cpp >>> cfe/trunk/lib/Lex/PreprocessingRecord.cpp >>> cfe/trunk/tools/libclang/Indexing.cpp >>> cfe/trunk/unittests/Basic/SourceManagerTest.cpp >>> >>> Modified: cfe/trunk/include/clang/Lex/PPCallbacks.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/PPCallbacks.h?rev=301449&r1=301448&r2=301449&view=diff >>> ============================================================================== >>> --- cfe/trunk/include/clang/Lex/PPCallbacks.h (original) >>> +++ cfe/trunk/include/clang/Lex/PPCallbacks.h Wed Apr 26 14:47:31 2017 >>> @@ -247,10 +247,14 @@ public: >>> } >>> >>> /// \brief Hook called whenever a macro \#undef is seen. >>> + /// \param Token The active Token >>> + /// \param MD A MacroDefinition for the named macro. >>> + /// \param Undef New MacroDirective if the macro was defined, null >>> otherwise. >>> /// >>> /// MD is released immediately following this callback. >>> virtual void MacroUndefined(const Token &MacroNameTok, >>> - const MacroDefinition &MD) { >>> + const MacroDefinition &MD, >>> + const MacroDirective *Undef) { >>> } >>> >>> /// \brief Hook called whenever the 'defined' operator is seen. >>> @@ -439,15 +443,17 @@ public: >>> Second->MacroExpands(MacroNameTok, MD, Range, Args); >>> } >>> >>> - void MacroDefined(const Token &MacroNameTok, const MacroDirective *MD) >>> override { >>> + void MacroDefined(const Token &MacroNameTok, >>> + const MacroDirective *MD) override { >>> First->MacroDefined(MacroNameTok, MD); >>> Second->MacroDefined(MacroNameTok, MD); >>> } >>> >>> void MacroUndefined(const Token &MacroNameTok, >>> - const MacroDefinition &MD) override { >>> - First->MacroUndefined(MacroNameTok, MD); >>> - Second->MacroUndefined(MacroNameTok, MD); >>> + const MacroDefinition &MD, >>> + const MacroDirective *Undef) override { >>> + First->MacroUndefined(MacroNameTok, MD, Undef); >>> + Second->MacroUndefined(MacroNameTok, MD, Undef); >>> } >>> >>> void Defined(const Token &MacroNameTok, const MacroDefinition &MD, >>> >>> Modified: cfe/trunk/include/clang/Lex/PreprocessingRecord.h >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/PreprocessingRecord.h?rev=301449&r1=301448&r2=301449&view=diff >>> ============================================================================== >>> --- cfe/trunk/include/clang/Lex/PreprocessingRecord.h (original) >>> +++ cfe/trunk/include/clang/Lex/PreprocessingRecord.h Wed Apr 26 14:47:31 >>> 2017 >>> @@ -488,7 +488,8 @@ namespace clang { >>> void MacroExpands(const Token &Id, const MacroDefinition &MD, >>> SourceRange Range, const MacroArgs *Args) override; >>> void MacroDefined(const Token &Id, const MacroDirective *MD) override; >>> - void MacroUndefined(const Token &Id, const MacroDefinition &MD) >>> override; >>> + void MacroUndefined(const Token &Id, const MacroDefinition &MD, >>> + const MacroDirective *Undef) override; >>> void InclusionDirective(SourceLocation HashLoc, const Token &IncludeTok, >>> StringRef FileName, bool IsAngled, >>> CharSourceRange FilenameRange, >>> >>> Modified: cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp?rev=301449&r1=301448&r2=301449&view=diff >>> ============================================================================== >>> --- cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp (original) >>> +++ cfe/trunk/lib/Frontend/PrintPreprocessedOutput.cpp Wed Apr 26 14:47:31 >>> 2017 >>> @@ -172,7 +172,8 @@ public: >>> >>> /// MacroUndefined - This hook is called whenever a macro #undef is seen. >>> void MacroUndefined(const Token &MacroNameTok, >>> - const MacroDefinition &MD) override; >>> + const MacroDefinition &MD, >>> + const MacroDirective *Undef) override; >>> }; >>> } // end anonymous namespace >>> >>> @@ -389,7 +390,8 @@ void PrintPPOutputPPCallbacks::MacroDefi >>> } >>> >>> void PrintPPOutputPPCallbacks::MacroUndefined(const Token &MacroNameTok, >>> - const MacroDefinition &MD) { >>> + const MacroDefinition &MD, >>> + const MacroDirective *Undef) >>> { >>> // Only print out macro definitions in -dD mode. >>> if (!DumpDefines) return; >>> >>> >>> Modified: cfe/trunk/lib/Lex/PPDirectives.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=301449&r1=301448&r2=301449&view=diff >>> ============================================================================== >>> --- cfe/trunk/lib/Lex/PPDirectives.cpp (original) >>> +++ cfe/trunk/lib/Lex/PPDirectives.cpp Wed Apr 26 14:47:31 2017 >>> @@ -2592,25 +2592,26 @@ void Preprocessor::HandleUndefDirective( >>> // Okay, we have a valid identifier to undef. >>> auto *II = MacroNameTok.getIdentifierInfo(); >>> auto MD = getMacroDefinition(II); >>> + UndefMacroDirective *Undef = nullptr; >>> + >>> + // If the macro is not defined, this is a noop undef. >>> + if (const MacroInfo *MI = MD.getMacroInfo()) { >>> + if (!MI->isUsed() && MI->isWarnIfUnused()) >>> + Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used); >>> + >>> + if (MI->isWarnIfUnused()) >>> + WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); >>> + >>> + Undef = AllocateUndefMacroDirective(MacroNameTok.getLocation()); >>> + } >>> >>> // If the callbacks want to know, tell them about the macro #undef. >>> // Note: no matter if the macro was defined or not. >>> if (Callbacks) >>> - Callbacks->MacroUndefined(MacroNameTok, MD); >>> - >>> - // If the macro is not defined, this is a noop undef, just return. >>> - const MacroInfo *MI = MD.getMacroInfo(); >>> - if (!MI) >>> - return; >>> - >>> - if (!MI->isUsed() && MI->isWarnIfUnused()) >>> - Diag(MI->getDefinitionLoc(), diag::pp_macro_not_used); >>> - >>> - if (MI->isWarnIfUnused()) >>> - WarnUnusedMacroLocs.erase(MI->getDefinitionLoc()); >>> + Callbacks->MacroUndefined(MacroNameTok, MD, Undef); >>> >>> - appendMacroDirective(MacroNameTok.getIdentifierInfo(), >>> - >>> AllocateUndefMacroDirective(MacroNameTok.getLocation())); >>> + if (Undef) >>> + appendMacroDirective(II, Undef); >>> } >>> >>> //===----------------------------------------------------------------------===// >>> >>> Modified: cfe/trunk/lib/Lex/PreprocessingRecord.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PreprocessingRecord.cpp?rev=301449&r1=301448&r2=301449&view=diff >>> ============================================================================== >>> --- cfe/trunk/lib/Lex/PreprocessingRecord.cpp (original) >>> +++ cfe/trunk/lib/Lex/PreprocessingRecord.cpp Wed Apr 26 14:47:31 2017 >>> @@ -422,7 +422,8 @@ void PreprocessingRecord::MacroDefined(c >>> } >>> >>> void PreprocessingRecord::MacroUndefined(const Token &Id, >>> - const MacroDefinition &MD) { >>> + const MacroDefinition &MD, >>> + const MacroDirective *Undef) { >>> MD.forAllDefinitions([&](MacroInfo *MI) { MacroDefinitions.erase(MI); }); >>> } >>> >>> >>> Modified: cfe/trunk/tools/libclang/Indexing.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/Indexing.cpp?rev=301449&r1=301448&r2=301449&view=diff >>> ============================================================================== >>> --- cfe/trunk/tools/libclang/Indexing.cpp (original) >>> +++ cfe/trunk/tools/libclang/Indexing.cpp Wed Apr 26 14:47:31 2017 >>> @@ -262,7 +262,8 @@ public: >>> /// MacroUndefined - This hook is called whenever a macro #undef is seen. >>> /// MI is released immediately following this callback. >>> void MacroUndefined(const Token &MacroNameTok, >>> - const MacroDefinition &MD) override {} >>> + const MacroDefinition &MD, >>> + const MacroDirective *UD) override {} >>> >>> /// MacroExpands - This is called by when a macro invocation is found. >>> void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, >>> >>> Modified: cfe/trunk/unittests/Basic/SourceManagerTest.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Basic/SourceManagerTest.cpp?rev=301449&r1=301448&r2=301449&view=diff >>> ============================================================================== >>> --- cfe/trunk/unittests/Basic/SourceManagerTest.cpp (original) >>> +++ cfe/trunk/unittests/Basic/SourceManagerTest.cpp Wed Apr 26 14:47:31 2017 >>> @@ -249,12 +249,18 @@ TEST_F(SourceManagerTest, getMacroArgExp >>> namespace { >>> >>> struct MacroAction { >>> + enum Kind { kExpansion, kDefinition, kUnDefinition}; >>> + >>> SourceLocation Loc; >>> std::string Name; >>> - bool isDefinition; // if false, it is expansion. >>> - >>> - MacroAction(SourceLocation Loc, StringRef Name, bool isDefinition) >>> - : Loc(Loc), Name(Name), isDefinition(isDefinition) { } >>> + unsigned MAKind : 3; >>> + >>> + MacroAction(SourceLocation Loc, StringRef Name, unsigned K) >>> + : Loc(Loc), Name(Name), MAKind(K) { } >>> + >>> + bool isExpansion() const { return MAKind == kExpansion; } >>> + bool isDefinition() const { return MAKind & kDefinition; } >>> + bool isUnDefinition() const { return MAKind & kUnDefinition; } >>> }; >>> >>> class MacroTracker : public PPCallbacks { >>> @@ -267,13 +273,22 @@ public: >>> const MacroDirective *MD) override { >>> Macros.push_back(MacroAction(MD->getLocation(), >>> MacroNameTok.getIdentifierInfo()->getName(), >>> - true)); >>> + MacroAction::kDefinition)); >>> + } >>> + void MacroUndefined(const Token &MacroNameTok, >>> + const MacroDefinition &MD, >>> + const MacroDirective *UD) override { >>> + Macros.push_back( >>> + MacroAction(UD ? UD->getLocation() : SourceLocation(), >>> + MacroNameTok.getIdentifierInfo()->getName(), >>> + UD ? MacroAction::kDefinition | >>> MacroAction::kUnDefinition >>> + : MacroAction::kUnDefinition)); >>> } >>> void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, >>> SourceRange Range, const MacroArgs *Args) override { >>> Macros.push_back(MacroAction(MacroNameTok.getLocation(), >>> MacroNameTok.getIdentifierInfo()->getName(), >>> - false)); >>> + MacroAction::kExpansion)); >>> } >>> }; >>> >>> @@ -281,7 +296,10 @@ public: >>> >>> TEST_F(SourceManagerTest, isBeforeInTranslationUnitWithMacroInInclude) { >>> const char *header = >>> - "#define MACRO_IN_INCLUDE 0\n"; >>> + "#define MACRO_IN_INCLUDE 0\n" >>> + "#define MACRO_DEFINED\n" >>> + "#undef MACRO_DEFINED\n" >>> + "#undef MACRO_UNDEFINED\n"; >>> >>> const char *main = >>> "#define M(x) x\n" >>> @@ -327,34 +345,46 @@ TEST_F(SourceManagerTest, isBeforeInTran >>> // Make sure we got the tokens that we expected. >>> ASSERT_EQ(0U, toks.size()); >>> >>> - ASSERT_EQ(9U, Macros.size()); >>> + ASSERT_EQ(15U, Macros.size()); >>> // #define M(x) x >>> - ASSERT_TRUE(Macros[0].isDefinition); >>> + ASSERT_TRUE(Macros[0].isDefinition()); >>> ASSERT_EQ("M", Macros[0].Name); >>> // #define INC "/test-header.h" >>> - ASSERT_TRUE(Macros[1].isDefinition); >>> + ASSERT_TRUE(Macros[1].isDefinition()); >>> ASSERT_EQ("INC", Macros[1].Name); >>> // M expansion in #include M(INC) >>> - ASSERT_FALSE(Macros[2].isDefinition); >>> + ASSERT_FALSE(Macros[2].isDefinition()); >>> ASSERT_EQ("M", Macros[2].Name); >>> // INC expansion in #include M(INC) >>> - ASSERT_FALSE(Macros[3].isDefinition); >>> + ASSERT_TRUE(Macros[3].isExpansion()); >>> ASSERT_EQ("INC", Macros[3].Name); >>> // #define MACRO_IN_INCLUDE 0 >>> - ASSERT_TRUE(Macros[4].isDefinition); >>> + ASSERT_TRUE(Macros[4].isDefinition()); >>> ASSERT_EQ("MACRO_IN_INCLUDE", Macros[4].Name); >>> + // #define MACRO_DEFINED >>> + ASSERT_TRUE(Macros[5].isDefinition()); >>> + ASSERT_FALSE(Macros[5].isUnDefinition()); >>> + ASSERT_EQ("MACRO_DEFINED", Macros[5].Name); >>> + // #undef MACRO_DEFINED >>> + ASSERT_TRUE(Macros[6].isDefinition()); >>> + ASSERT_TRUE(Macros[6].isUnDefinition()); >>> + ASSERT_EQ("MACRO_DEFINED", Macros[6].Name); >>> + // #undef MACRO_UNDEFINED >>> + ASSERT_FALSE(Macros[7].isDefinition()); >>> + ASSERT_TRUE(Macros[7].isUnDefinition()); >>> + ASSERT_EQ("MACRO_UNDEFINED", Macros[7].Name); >>> // #define INC2 </test-header.h> >>> - ASSERT_TRUE(Macros[5].isDefinition); >>> - ASSERT_EQ("INC2", Macros[5].Name); >>> + ASSERT_TRUE(Macros[8].isDefinition()); >>> + ASSERT_EQ("INC2", Macros[8].Name); >>> // M expansion in #include M(INC2) >>> - ASSERT_FALSE(Macros[6].isDefinition); >>> - ASSERT_EQ("M", Macros[6].Name); >>> + ASSERT_FALSE(Macros[9].isDefinition()); >>> + ASSERT_EQ("M", Macros[9].Name); >>> // INC2 expansion in #include M(INC2) >>> - ASSERT_FALSE(Macros[7].isDefinition); >>> - ASSERT_EQ("INC2", Macros[7].Name); >>> + ASSERT_TRUE(Macros[10].isExpansion()); >>> + ASSERT_EQ("INC2", Macros[10].Name); >>> // #define MACRO_IN_INCLUDE 0 >>> - ASSERT_TRUE(Macros[8].isDefinition); >>> - ASSERT_EQ("MACRO_IN_INCLUDE", Macros[8].Name); >>> + ASSERT_TRUE(Macros[11].isDefinition()); >>> + ASSERT_EQ("MACRO_IN_INCLUDE", Macros[11].Name); >>> >>> // The INC expansion in #include M(INC) comes before the first >>> // MACRO_IN_INCLUDE definition of the included file. >>> @@ -362,7 +392,7 @@ TEST_F(SourceManagerTest, isBeforeInTran >>> >>> // The INC2 expansion in #include M(INC2) comes before the second >>> // MACRO_IN_INCLUDE definition of the included file. >>> - EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(Macros[7].Loc, >>> Macros[8].Loc)); >>> + EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(Macros[10].Loc, >>> Macros[11].Loc)); >>> } >>> >>> #endif >>> >>> >>> _______________________________________________ >>> cfe-commits mailing list >>> cfe-commits@lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits