Skip to content

Commit a65b25a

Browse files
committed
inverted the relationship between expanded macros and tokens
1 parent 2859981 commit a65b25a

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

simplecpp.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1685,14 +1685,19 @@ namespace simplecpp {
16851685
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.");
16861686
}
16871687
};
1688+
1689+
bool expandsTok(const Token *tok) const
1690+
{
1691+
return expandedToks.find(tok) != expandedToks.end();
1692+
}
16881693
private:
16891694
/** Create new token where Token::macro is set for replaced tokens */
16901695
Token *newMacroToken(const TokenString &str, const Location &loc, bool replaced, const Token *expandedFromToken=nullptr) const {
16911696
Token *tok = new Token(str,loc);
16921697
if (replaced)
16931698
tok->macro = nameTokDef->str();
16941699
if (expandedFromToken)
1695-
tok->setExpandedFrom(expandedFromToken, this);
1700+
const_cast<Macro*>(this)->addExpandedTok(tok);
16961701
return tok;
16971702
}
16981703

@@ -2175,11 +2180,9 @@ namespace simplecpp {
21752180
return true;
21762181
for (const Token *partok = parametertokens[argnr]->next; partok != parametertokens[argnr + 1U];) {
21772182
const MacroMap::const_iterator it = macros.find(partok->str());
2178-
if (it != macros.end() && !partok->isExpandedFrom(&it->second) && (partok->str() == name() || expandedmacros.find(partok->str()) == expandedmacros.end())) {
2179-
std::set<TokenString> expandedmacros2(expandedmacros); // temporary amnesia to allow reexpansion of currently expanding macros during argument evaluation
2180-
expandedmacros2.erase(name());
2181-
partok = it->second.expand(output, loc, partok, macros, expandedmacros2);
2182-
} else {
2183+
if (it != macros.end() && !it->second.expandsTok(partok) && (partok->str() == name() || expandedmacros.find(partok->str()) == expandedmacros.end()))
2184+
partok = it->second.expand(output, loc, partok, macros, expandedmacros);
2185+
else {
21832186
output->push_back(newMacroToken(partok->str(), loc, isReplaced(expandedmacros), partok));
21842187
output->back()->macro = partok->macro;
21852188
partok = partok->next;
@@ -2346,6 +2349,11 @@ namespace simplecpp {
23462349
return (it != expandedmacros.end());
23472350
}
23482351

2352+
void addExpandedTok(const Token *tok)
2353+
{
2354+
expandedToks.insert(tok);
2355+
}
2356+
23492357
/** name token in definition */
23502358
const Token *nameTokDef;
23512359

@@ -2379,6 +2387,8 @@ namespace simplecpp {
23792387

23802388
/** was the value of this macro actually defined in the code? */
23812389
bool valueDefinedInCode_;
2390+
2391+
std::set<const Token*> expandedToks;
23822392
};
23832393
}
23842394

simplecpp.h

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -166,16 +166,6 @@ namespace simplecpp {
166166
return tok;
167167
}
168168

169-
void setExpandedFrom(const Token *tok, const Macro* m) {
170-
mExpandedFrom = tok->mExpandedFrom;
171-
mExpandedFrom.insert(m);
172-
if (tok->whitespaceahead)
173-
whitespaceahead = true;
174-
}
175-
bool isExpandedFrom(const Macro* m) const {
176-
return mExpandedFrom.find(m) != mExpandedFrom.end();
177-
}
178-
179169
void printAll() const;
180170
void printOut() const;
181171
private:

test.cpp

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

890+
static void define_define_24()
891+
{
892+
const char code[] = "#define A0(a, b) ((a) + (b))\n"
893+
"#define A1(a, b) ((a) > (b)) ? A0((a) - (b), (b)) : A0((b) - (a), (a))\n"
894+
" A1(a, b);";
895+
ASSERT_EQUALS("\n\n( ( a ) > ( b ) ) ? ( ( ( a ) - ( b ) ) + ( ( b ) ) ) : ( ( ( b ) - ( a ) ) + ( ( a ) ) ) ;", preprocess(code));
896+
}
897+
890898
static void define_va_args_1()
891899
{
892900
const char code[] = "#define A(fmt...) dostuff(fmt)\n"
@@ -3245,6 +3253,7 @@ int main(int argc, char **argv)
32453253
TEST_CASE(define_define_21);
32463254
TEST_CASE(define_define_22); // #400
32473255
TEST_CASE(define_define_23); // #403 - crash, infinite recursion
3256+
TEST_CASE(define_define_24);
32483257
TEST_CASE(define_va_args_1);
32493258
TEST_CASE(define_va_args_2);
32503259
TEST_CASE(define_va_args_3);

0 commit comments

Comments
 (0)