llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Aaron Ballman (AaronBallman) <details> <summary>Changes</summary> Incompatible pointer to integer conversion diagnostic checks would trigger an assertion when the designated initializer is for an array of unknown bounds. Fixes #<!-- -->154046 --- Full diff: https://github.com/llvm/llvm-project/pull/154120.diff 4 Files Affected: - (modified) clang/docs/ReleaseNotes.rst (+2) - (modified) clang/lib/Sema/SemaInit.cpp (+6-4) - (modified) clang/test/Sema/designated-initializers.c (+7) - (modified) clang/test/SemaObjC/exprs.m (+7) ``````````diff diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 604b4c3f714b7..09cb73c4f9140 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 differed 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]; +} `````````` </details> https://github.com/llvm/llvm-project/pull/154120 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits