summaryrefslogtreecommitdiffstats
path: root/unittests/Basic
diff options
context:
space:
mode:
authorFrederich Munch <colsebas@hotmail.com>2017-04-26 19:47:31 +0000
committerFrederich Munch <colsebas@hotmail.com>2017-04-26 19:47:31 +0000
commit9bc521065374e53923c6992332b77bed653ad22f (patch)
treec522a234c531511f726f2914c6de0f56d972a4aa /unittests/Basic
parent92c5967c32c498b4ce2cf866b12b29bd8aaf5eae (diff)
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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@301449 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/Basic')
-rw-r--r--unittests/Basic/SourceManagerTest.cpp74
1 files changed, 52 insertions, 22 deletions
diff --git a/unittests/Basic/SourceManagerTest.cpp b/unittests/Basic/SourceManagerTest.cpp
index dddc3f9866..aa15e16b85 100644
--- a/unittests/Basic/SourceManagerTest.cpp
+++ b/unittests/Basic/SourceManagerTest.cpp
@@ -249,12 +249,18 @@ TEST_F(SourceManagerTest, getMacroArgExpandedLocation) {
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, isBeforeInTranslationUnitWithMacroInInclude) {
// 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, isBeforeInTranslationUnitWithMacroInInclude) {
// 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