@@ -769,6 +769,15 @@ static void HandleSelectModifier(const Diagnostic &DInfo, unsigned ValNo,
769
769
DInfo.FormatDiagnostic (Argument, EndPtr, OutStr);
770
770
}
771
771
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
+
772
781
// / HandleIntegerSModifier - Handle the integer 's' modifier. This adds the
773
782
// / letter 's' to the string if the value is not 1. This is used in cases like
774
783
// / this: "you idiot, you have %4 parameter%s4!".
@@ -1160,6 +1169,10 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
1160
1169
HandleOrdinalModifier ((unsigned )Val, OutStr);
1161
1170
} else if (ModifierIs (Modifier, ModifierLen, " human" )) {
1162
1171
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);
1163
1176
} else {
1164
1177
assert (ModifierLen == 0 && " Unknown integer modifier" );
1165
1178
llvm::raw_svector_ostream (OutStr) << Val;
@@ -1180,12 +1193,28 @@ FormatDiagnostic(const char *DiagStr, const char *DiagEnd,
1180
1193
HandleOrdinalModifier (Val, OutStr);
1181
1194
} else if (ModifierIs (Modifier, ModifierLen, " human" )) {
1182
1195
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);
1183
1200
} else {
1184
1201
assert (ModifierLen == 0 && " Unknown integer modifier" );
1185
1202
llvm::raw_svector_ostream (OutStr) << Val;
1186
1203
}
1187
1204
break ;
1188
1205
}
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
+ }
1189
1218
// ---- TOKEN SPELLINGS ----
1190
1219
case DiagnosticsEngine::ak_tokenkind: {
1191
1220
tok::TokenKind Kind = static_cast <tok::TokenKind>(getRawArg (ArgNo));
0 commit comments