[clang] b63b010 - [Clang] enhance diagnostic message for __builtin_bit_cast size mismatch (#115940)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 13 06:11:40 PST 2024
Author: Oleksandr T.
Date: 2024-11-13T09:11:36-05:00
New Revision: b63b0101ca47b8ba1589283cd34cc80cdb68b902
URL: https://github.com/llvm/llvm-project/commit/b63b0101ca47b8ba1589283cd34cc80cdb68b902
DIFF: https://github.com/llvm/llvm-project/commit/b63b0101ca47b8ba1589283cd34cc80cdb68b902.diff
LOG: [Clang] enhance diagnostic message for __builtin_bit_cast size mismatch (#115940)
Fixes #115870
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaCast.cpp
clang/test/AST/ByteCode/builtin-bit-cast.cpp
clang/test/SemaCXX/builtin-bit-cast.cpp
clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index f67609c33a464c..3fc275b528d215 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -531,6 +531,8 @@ Improvements to Clang's diagnostics
- Clang now diagnoses ``[[deprecated]]`` attribute usage on local variables (#GH90073).
+- Improved diagnostic message for ``__builtin_bit_cast`` size mismatch (#GH115870).
+
Improvements to Clang's time-trace
----------------------------------
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 2f5d672e2f0035..36c89c8fdc9ece 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -12368,7 +12368,7 @@ def err_preserve_enum_value_not_const: Error<
def err_bit_cast_non_trivially_copyable : Error<
"__builtin_bit_cast %select{source|destination}0 type must be trivially copyable">;
def err_bit_cast_type_size_mismatch : Error<
- "__builtin_bit_cast source size does not equal destination size (%0 vs %1)">;
+ "size of '__builtin_bit_cast' source type %0 does not match destination type %1 (%2 vs %3 bytes)">;
// SYCL-specific diagnostics
def warn_sycl_kernel_num_of_template_params : Warning<
diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp
index 6ac6201843476b..3eb013e3612d1c 100644
--- a/clang/lib/Sema/SemaCast.cpp
+++ b/clang/lib/Sema/SemaCast.cpp
@@ -3283,7 +3283,8 @@ void CastOperation::CheckBuiltinBitCast() {
CharUnits SourceSize = Self.Context.getTypeSizeInChars(SrcType);
if (DestSize != SourceSize) {
Self.Diag(OpRange.getBegin(), diag::err_bit_cast_type_size_mismatch)
- << (int)SourceSize.getQuantity() << (int)DestSize.getQuantity();
+ << SrcType << DestType << (int)SourceSize.getQuantity()
+ << (int)DestSize.getQuantity();
SrcExpr = ExprError();
return;
}
diff --git a/clang/test/AST/ByteCode/builtin-bit-cast.cpp b/clang/test/AST/ByteCode/builtin-bit-cast.cpp
index 7d1fcbda10965f..60e8c3a615c5e6 100644
--- a/clang/test/AST/ByteCode/builtin-bit-cast.cpp
+++ b/clang/test/AST/ByteCode/builtin-bit-cast.cpp
@@ -496,7 +496,7 @@ typedef bool bool32 __attribute__((ext_vector_type(32)));
typedef bool bool128 __attribute__((ext_vector_type(128)));
static_assert(bit_cast<unsigned char>(bool8{1,0,1,0,1,0,1,0}) == (LITTLE_END ? 0x55 : 0xAA), "");
-constexpr bool8 b8 = __builtin_bit_cast(bool8, 0x55); // both-error {{__builtin_bit_cast source size does not equal destination size (4 vs 1)}}
+constexpr bool8 b8 = __builtin_bit_cast(bool8, 0x55); // both-error {{'__builtin_bit_cast' source type 'int' does not match destination type 'bool8' (vector of 8 'bool' values) (4 vs 1 bytes)}}
#if 0
static_assert(check_round_trip<bool8>(static_cast<unsigned char>(0)), "");
static_assert(check_round_trip<bool8>(static_cast<unsigned char>(1)), "");
@@ -535,5 +535,5 @@ namespace test_complex {
static_assert(TF.A == 1.0f && TF.B == 2.0f);
constexpr double D = __builtin_bit_cast(double, test_float_complex);
- constexpr int M = __builtin_bit_cast(int, test_int_complex); // both-error {{__builtin_bit_cast source size does not equal destination size}}
+ constexpr int M = __builtin_bit_cast(int, test_int_complex); // both-error {{size of '__builtin_bit_cast' source type 'const _Complex unsigned int' does not match destination type 'int' (8 vs 4 bytes)}}
}
diff --git a/clang/test/SemaCXX/builtin-bit-cast.cpp b/clang/test/SemaCXX/builtin-bit-cast.cpp
index 87919d9d9d2865..d7f24c7939b558 100644
--- a/clang/test/SemaCXX/builtin-bit-cast.cpp
+++ b/clang/test/SemaCXX/builtin-bit-cast.cpp
@@ -24,7 +24,7 @@ void test1() {
void test2() {
constexpr int i = 0;
- // expected-error at +1{{__builtin_bit_cast source size does not equal destination size (4 vs 1)}}
+ // expected-error at +1{{size of '__builtin_bit_cast' source type 'const int' does not match destination type 'char' (4 vs 1 bytes)}}
constexpr char c = __builtin_bit_cast(char, i);
}
diff --git a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
index 5ddb77b35ff145..425447c5e604e9 100644
--- a/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
+++ b/clang/test/SemaCXX/constexpr-builtin-bit-cast.cpp
@@ -525,5 +525,5 @@ namespace test_complex {
static_assert(TF.A == 1.0f && TF.B == 2.0f);
constexpr double D = __builtin_bit_cast(double, test_float_complex);
- constexpr int M = __builtin_bit_cast(int, test_int_complex); // expected-error {{__builtin_bit_cast source size does not equal destination size}}
+ constexpr int M = __builtin_bit_cast(int, test_int_complex); // expected-error {{size of '__builtin_bit_cast' source type 'const _Complex unsigned int' does not match destination type 'int' (8 vs 4 bytes)}}
}
More information about the cfe-commits
mailing list