Skip to content

Commit ac5cbe3

Browse files
authored
Fix #590 (Incorrect expansion of functional macros) (#646)
1 parent 4044f8f commit ac5cbe3

3 files changed

Lines changed: 16 additions & 0 deletions

File tree

simplecpp.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2204,6 +2204,8 @@ namespace simplecpp {
22042204
}
22052205

22062206
output.push_back(newMacroToken(tok->str(), loc, true, tok));
2207+
if (it != macros.end())
2208+
output.back()->markExpandedFrom(&it->second);
22072209
return tok->next;
22082210
}
22092211

simplecpp.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ namespace simplecpp {
213213
bool isExpandedFrom(const Macro* m) const {
214214
return mExpandedFrom.find(m) != mExpandedFrom.end();
215215
}
216+
void markExpandedFrom(const Macro* m) {
217+
mExpandedFrom.insert(m);
218+
}
216219

217220
void printAll() const;
218221
void printOut() const;

test.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,16 @@ static void define_define_23() // #403 crash (infinite recursion)
946946
ASSERT_EQUALS("\n\n\n\nYdieZ ( void ) ;", preprocess(code));
947947
}
948948

949+
static void define_define_24() // #590
950+
{
951+
const char code[] = "#define B A\n"
952+
"#define A x(B)\n"
953+
"#define C(s) s\n"
954+
"#define D(s) C(s)\n"
955+
"D(A)\n";
956+
ASSERT_EQUALS("\n\n\n\nx ( A )", preprocess(code));
957+
}
958+
949959
static void define_va_args_1()
950960
{
951961
const char code[] = "#define A(fmt...) dostuff(fmt)\n"
@@ -3671,6 +3681,7 @@ int main(int argc, char **argv)
36713681
TEST_CASE(define_define_21);
36723682
TEST_CASE(define_define_22); // #400
36733683
TEST_CASE(define_define_23); // #403 - crash, infinite recursion
3684+
TEST_CASE(define_define_24); // #590
36743685
TEST_CASE(define_va_args_1);
36753686
TEST_CASE(define_va_args_2);
36763687
TEST_CASE(define_va_args_3);

0 commit comments

Comments
 (0)