@@ -769,6 +769,15 @@ static void HandleSelectModifier(const Diagnostic &DInfo, unsigned ValNo,
769769 DInfo.FormatDiagnostic (Argument, EndPtr, OutStr);
770770}
771771
772+ static void HandleSeparatedModifier (const Diagnostic &DInfo,
773+ const llvm::APSInt &Val,
774+ const char *Argument, unsigned ArgumentLen,
775+ SmallVectorImpl<char > &OutStr) {
776+ llvm::raw_svector_ostream Out (OutStr);
777+ Out << toString (Val, 10 , Val.isSigned (), /* formatAsCLiteral=*/ false ,
778+ /* UpperCase=*/ false , /* InsertSeparators=*/ true );
779+ }
780+
772781// / HandleIntegerSModifier - Handle the integer 's' modifier. This adds the
773782// / letter 's' to the string if the value is not 1. This is used in cases like
774783// / this: "you idiot, you have %4 parameter%s4!".
@@ -1160,6 +1169,10 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
11601169 HandleOrdinalModifier ((unsigned )Val, OutStr);
11611170 } else if (ModifierIs (Modifier, ModifierLen, " human" )) {
11621171 HandleIntegerHumanModifier (Val, OutStr);
1172+ } else if (ModifierIs (Modifier, ModifierLen, " separated" )) {
1173+ llvm::APSInt ValAP = llvm::APSInt (
1174+ llvm::APInt (64 , Val, /* IsSigned=*/ true ), /* IsUnsigned=*/ false );
1175+ HandleSeparatedModifier (*this , ValAP, Argument, ArgumentLen, OutStr);
11631176 } else {
11641177 assert (ModifierLen == 0 && " Unknown integer modifier" );
11651178 llvm::raw_svector_ostream (OutStr) << Val;
@@ -1180,12 +1193,28 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
11801193 HandleOrdinalModifier (Val, OutStr);
11811194 } else if (ModifierIs (Modifier, ModifierLen, " human" )) {
11821195 HandleIntegerHumanModifier (Val, OutStr);
1196+ } else if (ModifierIs (Modifier, ModifierLen, " separated" )) {
1197+ llvm::APSInt ValAP = llvm::APSInt (
1198+ llvm::APInt (64 , Val, /* IsSigned=*/ false ), /* IsUnsigned=*/ true );
1199+ HandleSeparatedModifier (*this , ValAP, Argument, ArgumentLen, OutStr);
11831200 } else {
11841201 assert (ModifierLen == 0 && " Unknown integer modifier" );
11851202 llvm::raw_svector_ostream (OutStr) << Val;
11861203 }
11871204 break ;
11881205 }
1206+
1207+ case DiagnosticsEngine::ak_apsint: {
1208+ const llvm::APSInt *Val = getArgAPSInt (ArgNo);
1209+ if (ModifierIs (Modifier, ModifierLen, " separated" )) {
1210+ HandleSeparatedModifier (*this , *Val, Argument, ArgumentLen, OutStr);
1211+ } else {
1212+ assert (ModifierLen == 0 && " Unknown integer modifier" );
1213+ llvm::raw_svector_ostream (OutStr) << *Val;
1214+ }
1215+ // FIXME: Support the other modifiers for APSInt as well.
1216+ break ;
1217+ }
11891218 // ---- TOKEN SPELLINGS ----
11901219 case DiagnosticsEngine::ak_tokenkind: {
11911220 tok::TokenKind Kind = static_cast <tok::TokenKind>(getRawArg (ArgNo));
0 commit comments