Skip to content

Commit a30ad8a

Browse files
committed
inverted the relationship between expanded macros and tokens
1 parent d1db554 commit a30ad8a

File tree

3 files changed

+23
-12
lines changed

3 files changed

+23
-12
lines changed

simplecpp.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1700,14 +1700,19 @@ namespace simplecpp {
17001700
return invalidHashHash(loc, macroName, "Combining '\\"+ tokenA->str()+ "' and '"+ strAB.substr(tokenA->str().size()) + "' yields universal character '\\" + strAB + "'. This is undefined behavior according to C standard chapter 5.1.1.2, paragraph 4.");
17011701
}
17021702
};
1703+
1704+
bool expandsTok(const Token *tok) const
1705+
{
1706+
return expandedToks.find(tok) != expandedToks.end();
1707+
}
17031708
private:
17041709
/** Create new token where Token::macro is set for replaced tokens */
17051710
Token *newMacroToken(const TokenString &str, const Location &loc, bool replaced, const Token *expandedFromToken=nullptr) const {
17061711
Token *tok = new Token(str,loc);
17071712
if (replaced)
17081713
tok->macro = nameTokDef->str();
17091714
if (expandedFromToken)
1710-
tok->setExpandedFrom(expandedFromToken, this);
1715+
const_cast<Macro*>(this)->addExpandedTok(tok);
17111716
return tok;
17121717
}
17131718

@@ -2199,7 +2204,7 @@ namespace simplecpp {
21992204
return true;
22002205
for (const Token *partok = parametertokens[argnr]->next; partok != parametertokens[argnr + 1U];) {
22012206
const MacroMap::const_iterator it = macros.find(partok->str());
2202-
if (it != macros.end() && !partok->isExpandedFrom(&it->second) && (partok->str() == name() || expandedmacros.find(partok->str()) == expandedmacros.end())) {
2207+
if (it != macros.end() && !it->second.expandsTok(partok) && (partok->str() == name() || expandedmacros.find(partok->str()) == expandedmacros.end())) {
22032208
std::set<TokenString> expandedmacros2(expandedmacros); // temporary amnesia to allow reexpansion of currently expanding macros during argument evaluation
22042209
expandedmacros2.erase(name());
22052210
partok = it->second.expand(output, loc, partok, macros, std::move(expandedmacros2));
@@ -2370,6 +2375,11 @@ namespace simplecpp {
23702375
return (it != expandedmacros.end());
23712376
}
23722377

2378+
void addExpandedTok(const Token *tok)
2379+
{
2380+
expandedToks.insert(tok);
2381+
}
2382+
23732383
/** name token in definition */
23742384
const Token *nameTokDef;
23752385

@@ -2403,6 +2413,8 @@ namespace simplecpp {
24032413

24042414
/** was the value of this macro actually defined in the code? */
24052415
bool valueDefinedInCode_;
2416+
2417+
std::set<const Token*> expandedToks;
24062418
};
24072419
}
24082420

simplecpp.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -172,16 +172,6 @@ namespace simplecpp {
172172
return tok;
173173
}
174174

175-
void setExpandedFrom(const Token *tok, const Macro* m) {
176-
mExpandedFrom = tok->mExpandedFrom;
177-
mExpandedFrom.insert(m);
178-
if (tok->whitespaceahead)
179-
whitespaceahead = true;
180-
}
181-
bool isExpandedFrom(const Macro* m) const {
182-
return mExpandedFrom.find(m) != mExpandedFrom.end();
183-
}
184-
185175
void printAll() const;
186176
void printOut() const;
187177
private:

test.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,14 @@ static void define_define_23() // #403 crash (infinite recursion)
892892
ASSERT_EQUALS("\n\n\n\nYdieZ ( void ) ;", preprocess(code));
893893
}
894894

895+
static void define_define_24()
896+
{
897+
const char code[] = "#define A0(a, b) ((a) + (b))\n"
898+
"#define A1(a, b) ((a) > (b)) ? A0((a) - (b), (b)) : A0((b) - (a), (a))\n"
899+
" A1(a, b);";
900+
ASSERT_EQUALS("\n\n( ( a ) > ( b ) ) ? ( ( ( a ) - ( b ) ) + ( ( b ) ) ) : ( ( ( b ) - ( a ) ) + ( ( a ) ) ) ;", preprocess(code));
901+
}
902+
895903
static void define_va_args_1()
896904
{
897905
const char code[] = "#define A(fmt...) dostuff(fmt)\n"
@@ -3382,6 +3390,7 @@ int main(int argc, char **argv)
33823390
TEST_CASE(define_define_21);
33833391
TEST_CASE(define_define_22); // #400
33843392
TEST_CASE(define_define_23); // #403 - crash, infinite recursion
3393+
TEST_CASE(define_define_24);
33853394
TEST_CASE(define_va_args_1);
33863395
TEST_CASE(define_va_args_2);
33873396
TEST_CASE(define_va_args_3);

0 commit comments

Comments
 (0)