https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/117763
Wondering if we should have a `toString()` version that does this automatically, or maybe the `operator<<` for diagnostics for AP(S)Int could even do this? Wouldn't be opt-in anymore though. >From 57caaa63c585b71d58c16ba592d1bac3d70d4256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbae...@redhat.com> Date: Tue, 26 Nov 2024 19:26:32 +0100 Subject: [PATCH] [clang] Format bitfield width diagnostics with thousands-separators --- .../clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/lib/Sema/SemaDecl.cpp | 27 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 6ff24c2bc8faad..5ab0885c8414fd 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6400,7 +6400,7 @@ def err_incorrect_number_of_vector_initializers : Error< // Used by C++ which allows bit-fields that are wider than the type. def warn_bitfield_width_exceeds_type_width: Warning< "width of bit-field %0 (%1 bits) exceeds the width of its type; value will " - "be truncated to %2 bit%s2">, InGroup<BitFieldWidth>; + "be truncated to %2 bits">, InGroup<BitFieldWidth>; def err_bitfield_too_wide : Error< "%select{bit-field %1|anonymous bit-field}0 is too wide (%2 bits)">; def warn_bitfield_too_small_for_enum : Warning< diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 74b0e5ad23bd48..7378edc1c5cecb 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -18307,16 +18307,22 @@ ExprResult Sema::VerifyBitField(SourceLocation FieldLoc, if (Value.isSigned() && Value.isNegative()) { if (FieldName) return Diag(FieldLoc, diag::err_bitfield_has_negative_width) - << FieldName << toString(Value, 10); + << FieldName + << toString(Value, 10, Value.isSigned(), + /*formatAsCLiteral=*/false, /*UpperCase=*/true, + /*InsertSeparators=*/true); return Diag(FieldLoc, diag::err_anon_bitfield_has_negative_width) - << toString(Value, 10); + << toString(Value, 10, Value.isSigned(), /*formatAsCLiteral=*/false, + /*UpperCase=*/true, /*InsertSeparators=*/true); } // The size of the bit-field must not exceed our maximum permitted object // size. if (Value.getActiveBits() > ConstantArrayType::getMaxSizeBits(Context)) { return Diag(FieldLoc, diag::err_bitfield_too_wide) - << !FieldName << FieldName << toString(Value, 10); + << !FieldName << FieldName + << toString(Value, 10, Value.isSigned(), /*formatAsCLiteral=*/false, + /*UpperCase=*/true, /*InsertSeparators=*/true); } if (!FieldTy->isDependentType()) { @@ -18335,7 +18341,10 @@ ExprResult Sema::VerifyBitField(SourceLocation FieldLoc, unsigned DiagWidth = CStdConstraintViolation ? TypeWidth : TypeStorageSize; return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width) - << (bool)FieldName << FieldName << toString(Value, 10) + << (bool)FieldName << FieldName + << toString(Value, 10, Value.isSigned(), + /*formatAsCLiteral=*/false, /*UpperCase=*/true, + /*InsertSeparators=*/true) << !CStdConstraintViolation << DiagWidth; } @@ -18343,9 +18352,15 @@ ExprResult Sema::VerifyBitField(SourceLocation FieldLoc, // specified bits as value bits: that's all integral types other than // 'bool'. if (BitfieldIsOverwide && !FieldTy->isBooleanType() && FieldName) { + llvm::APInt TypeWidthAP(sizeof(TypeWidth) * 8, TypeWidth, + /*IsSigned=*/false); Diag(FieldLoc, diag::warn_bitfield_width_exceeds_type_width) - << FieldName << toString(Value, 10) - << (unsigned)TypeWidth; + << FieldName + << toString(Value, 10, Value.isSigned(), /*formatAsCLiteral=*/false, + /*UpperCase=*/true, /*InsertSeparators=*/true) + << toString(TypeWidthAP, 10, /*Signed=*/false, + /*formatAsCLiteral=*/false, /*UpperCase=*/true, + /*InsertSeparators=*/true); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits