@@ -2310,12 +2310,43 @@ namespace simplecpp {
23102310 return false ;
23112311 if (variadic && argnr + 1U >= parametertokens.size ()) // empty variadic parameter
23122312 return true ;
2313- for (const Token *partok = parametertokens[argnr]->next ; partok != parametertokens[argnr + 1U ];) {
2313+ const Token * const argEnd = parametertokens[argnr + 1U ];
2314+ for (const Token *partok = parametertokens[argnr]->next ; partok != argEnd;) {
23142315 const MacroMap::const_iterator it = macros.find (partok->str ());
23152316 if (it != macros.end () && !partok->isExpandedFrom (&it->second ) && (partok->str () == name () || expandedmacros.find (partok->str ()) == expandedmacros.end ())) {
23162317 std::set<TokenString> expandedmacros2 (expandedmacros); // temporary amnesia to allow reexpansion of currently expanding macros during argument evaluation
23172318 expandedmacros2.erase (name ());
2318- partok = it->second .expand (output, loc, partok, macros, std::move (expandedmacros2));
2319+ TokenList temp (files);
2320+ partok = it->second .expand (temp, loc, partok, macros, expandedmacros2);
2321+ // Expand while the expansion result ends with the name of a
2322+ // function-like macro whose arguments are supplied by the
2323+ // remaining argument tokens
2324+ while (partok && partok->previous ) {
2325+ const Macro * const calledMacro = rescanMacro (temp, partok->previous , macros, expandedmacros2);
2326+ if (!calledMacro)
2327+ break ;
2328+ TokenList temp2 (files);
2329+ temp2.push_back (new Token (temp.cback ()->str (), partok->location ));
2330+ unsigned int par = 0 ;
2331+ const Token *tok2 = partok;
2332+ for (; tok2 && tok2 != argEnd; tok2 = tok2->next ) {
2333+ temp2.push_back (new Token (*tok2));
2334+ if (tok2->op == ' (' )
2335+ ++par;
2336+ else if (tok2->op == ' )' ) {
2337+ --par;
2338+ if (par == 0U )
2339+ break ;
2340+ }
2341+ }
2342+ if (!tok2 || tok2 == argEnd)
2343+ break ;
2344+ output.takeTokens (temp);
2345+ output.deleteToken (output.back ());
2346+ calledMacro->expand (temp, loc, temp2.cfront (), macros, expandedmacros2);
2347+ partok = tok2->next ;
2348+ }
2349+ output.takeTokens (temp);
23192350 } else {
23202351 output.push_back (newMacroToken (partok->str (), loc, isReplaced (expandedmacros), partok));
23212352 output.back ()->macro = partok->macro ;
0 commit comments