r301449 - PPCallbacks::MacroUndefined, change signature and add test.

Vedant Kumar via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 26 14:12:19 PDT 2017


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 at 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 at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list