@@ -3994,10 +3994,41 @@ void ASTMangler::appendMacroExpansionOperator(
39943994 }
39953995}
39963996
3997+ static StringRef getPrivateDiscriminatorIfNecessary (
3998+ const MacroExpansionExpr *expansion) {
3999+ auto dc = MacroDiscriminatorContext::getInnermostMacroContext (
4000+ expansion->getDeclContext ());
4001+ auto decl = dc->getAsDecl ();
4002+ if (decl && !decl->isOutermostPrivateOrFilePrivateScope ())
4003+ return StringRef ();
4004+
4005+ // Mangle non-local private declarations with a textual discriminator
4006+ // based on their enclosing file.
4007+ auto topLevelSubcontext = dc->getModuleScopeContext ();
4008+ SourceFile *sf = dyn_cast<SourceFile>(topLevelSubcontext);
4009+ if (!sf)
4010+ return StringRef ();
4011+
4012+ Identifier discriminator =
4013+ sf->getPrivateDiscriminator (/* createIfMissing=*/ true );
4014+ assert (!discriminator.empty ());
4015+ assert (!isNonAscii (discriminator.str ()) &&
4016+ " discriminator contains non-ASCII characters" );
4017+ (void )&isNonAscii;
4018+ assert (!clang::isDigit (discriminator.str ().front ()) &&
4019+ " not a valid identifier" );
4020+ return discriminator.str ();
4021+ }
4022+
39974023std::string ASTMangler::mangleMacroExpansion (
39984024 const MacroExpansionExpr *expansion) {
39994025 beginMangling ();
40004026 appendMacroExpansionContext (expansion->getLoc (), expansion->getDeclContext ());
4027+ auto privateDiscriminator = getPrivateDiscriminatorIfNecessary (expansion);
4028+ if (!privateDiscriminator.empty ()) {
4029+ appendIdentifier (privateDiscriminator);
4030+ appendOperator (" Ll" );
4031+ }
40014032 appendMacroExpansionOperator (
40024033 expansion->getMacroName ().getBaseName ().userFacingName (),
40034034 MacroRole::Expression,
0 commit comments