[clang] [clang] Format bitfield width diagnostics with thousands-separators (PR #117763)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 26 10:30:35 PST 2024
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?= <tbaeder at 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);
}
}
More information about the cfe-commits
mailing list