Author: Aaron Ballman Date: 2025-08-18T14:22:31Z New Revision: f5dc3021cda339f7695272ad6e02b79f193c50c4
URL: https://github.com/llvm/llvm-project/commit/f5dc3021cda339f7695272ad6e02b79f193c50c4 DIFF: https://github.com/llvm/llvm-project/commit/f5dc3021cda339f7695272ad6e02b79f193c50c4.diff LOG: [C] Fix failing assertion with designated inits (#154120) Incompatible pointer to integer conversion diagnostic checks would trigger an assertion when the designated initializer is for an array of unknown bounds. Fixes #154046 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaInit.cpp clang/test/Sema/designated-initializers.c clang/test/SemaObjC/exprs.m Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e04cc326b8a0a..9ea9fcdf889df 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -193,6 +193,8 @@ Bug Fixes in This Version targets that treat ``_Float16``/``__fp16`` as native scalar types. Previously the warning was silently lost because the operands diff ered only by an implicit cast chain. (#GH149967). +- Fixed a crash with incompatible pointer to integer conversions in designated + initializers involving string literals. (#GH154046) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index d7cca4bc65d2c..60f9d449fc037 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -3294,8 +3294,9 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, if (StringLiteral *SL = dyn_cast<StringLiteral>(SubExpr)) { // Get the length of the string. uint64_t StrLen = SL->getLength(); - if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen)) - StrLen = cast<ConstantArrayType>(AT)->getZExtSize(); + if (const auto *CAT = dyn_cast<ConstantArrayType>(AT); + CAT && CAT->getSize().ult(StrLen)) + StrLen = CAT->getZExtSize(); StructuredList->resizeInits(Context, StrLen); // Build a literal for each character in the string, and put them into @@ -3317,8 +3318,9 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity, // Get the length of the string. uint64_t StrLen = Str.size(); - if (cast<ConstantArrayType>(AT)->getSize().ult(StrLen)) - StrLen = cast<ConstantArrayType>(AT)->getZExtSize(); + if (const auto *CAT = dyn_cast<ConstantArrayType>(AT); + CAT && CAT->getSize().ult(StrLen)) + StrLen = CAT->getZExtSize(); StructuredList->resizeInits(Context, StrLen); // Build a literal for each character in the string, and put them into diff --git a/clang/test/Sema/designated-initializers.c b/clang/test/Sema/designated-initializers.c index 31a3380b5db7d..11dc3a2308dee 100644 --- a/clang/test/Sema/designated-initializers.c +++ b/clang/test/Sema/designated-initializers.c @@ -368,3 +368,10 @@ struct { .b = 0, // expected-warning {{initializer overrides prior initialization of this subobject}} }, }; + +void gh154046(void) { + (void)(const char[]) { + [0] = "", // expected-error {{incompatible pointer to integer conversion initializing 'const char' with an expression of type 'char[1]'}} + [1] = "" // expected-error {{incompatible pointer to integer conversion initializing 'const char' with an expression of type 'char[1]'}} + }[1]; +} diff --git a/clang/test/SemaObjC/exprs.m b/clang/test/SemaObjC/exprs.m index dcf46d3cdbfbc..c42d270657c10 100644 --- a/clang/test/SemaObjC/exprs.m +++ b/clang/test/SemaObjC/exprs.m @@ -36,3 +36,10 @@ void test_encode(void) { (void)@encode(Incomplete_ObjC_class*); (void)@encode(id); } + +void gh154046(void) { + (void)(const char[]) { + [0] = @encode(int), // expected-error {{incompatible pointer to integer conversion initializing 'const char' with an expression of type 'char[2]'}} + [1] = @encode(float) // expected-error {{incompatible pointer to integer conversion initializing 'const char' with an expression of type 'char[2]'}} + }[1]; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits