@@ -608,6 +608,24 @@ static void getConfigs(const simplecpp::TokenList &tokens, std::set<std::string>
608608 }
609609 }
610610
611+ // check if config already exists in the ret set, but as a more general or more specific version
612+ if (cmdtok->str () != " ifndef" )
613+ {
614+ const std::string::size_type eq = config.find (' =' );
615+ const std::string config2 = (eq != std::string::npos) ? config.substr (0 , eq) : config + " =" + config;
616+ const std::set<std::string>::iterator it2 = ret.find (config2);
617+ if (it2 != ret.end ()) {
618+ if (eq == std::string::npos) {
619+ // The instance in ret is more specific than the one in config (no =value), replace it with the one in config
620+ ret.erase (it2);
621+ } else {
622+ // The instance in ret is more general than the one in config (have =value), keep the one in ret
623+ config.erase ();
624+ continue ;
625+ }
626+ }
627+ }
628+
611629 configs_if.push_back ((cmdtok->str () == " ifndef" ) ? std::string () : config);
612630 configs_ifndef.push_back ((cmdtok->str () == " ifndef" ) ? std::move (config) : std::string ());
613631 ret.insert (cfg (configs_if,userDefines));
@@ -641,8 +659,18 @@ static void getConfigs(const simplecpp::TokenList &tokens, std::set<std::string>
641659 configs_if.push_back (std::move (config));
642660 ret.insert (cfg (configs_if, userDefines));
643661 } else if (!configs_ifndef.empty ()) {
644- configs_if.push_back (configs_ifndef.back ());
645- ret.insert (cfg (configs_if, userDefines));
662+ // Check if ifndef already existing in ret as more general/specific version
663+ const std::string &confCandidate = configs_ifndef.back ();
664+ if (ret.find (confCandidate) == ret.end ()) {
665+ // No instance of config_ifndef in ret. Check if a more specific version exists, in that case replace it
666+ const std::set<std::string>::iterator it = ret.find (confCandidate + " =" + confCandidate);
667+ if (it != ret.end ()) {
668+ // The instance in ret is more specific than the one in confCandidate (no =value), replace it with the one in confCandidate
669+ ret.erase (it);
670+ }
671+ configs_if.push_back (configs_ifndef.back ());
672+ ret.insert (cfg (configs_if, userDefines));
673+ }
646674 }
647675 } else if (cmdtok->str () == " endif" && !sameline (tok, cmdtok->next )) {
648676 if (!configs_if.empty ())
0 commit comments