ayzhao created this revision. ayzhao added a reviewer: aaron.ballman. Herald added a project: All. ayzhao requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
In C++20, if Clang fails to perform constructor overload on a RecordType, then Clang will try to perform parentesized aggregate initialization. If that fails and the initialization was attempted as part of a cast, then we should get the diagnostics from the failed constructor overload attempt. However, we don't attempt constructor overloading for arrays, so previously, if we try to diagnose an overloaded cast for a parenthesized aggregate initialization of an array, we crash. To fix this, we now exit tryDiagnoseOverloadedCast(...) for failed parentesized list initialization if the destination type is an array. Fixes #63758 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D155523 Files: clang/docs/ReleaseNotes.rst clang/lib/Sema/SemaCast.cpp clang/test/SemaCXX/paren-list-agg-init.cpp Index: clang/test/SemaCXX/paren-list-agg-init.cpp =================================================================== --- clang/test/SemaCXX/paren-list-agg-init.cpp +++ clang/test/SemaCXX/paren-list-agg-init.cpp @@ -294,3 +294,8 @@ } } + +namespace gh63758 { + struct S {} s; + auto words = (char[])s; // expected-error {{C-style cast from 'struct S' to 'char[]' is not allowed}} +}; Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -454,9 +454,18 @@ switch (sequence.getFailureKind()) { default: return false; + case InitializationSequence::FK_ParenthesizedListInitFailed: + // In C++20, if the underlying destination type is a RecordType, then we + // attempt to perform parentesized aggregate initialization if constructor + // overload fails. If that fails, then we'll generate the diagnostics from + // the failed overload result from the previous constructor overload. Array + // initialization, however, is not done after attempting constructor + // overloading, so we bail out as there won't be a failed overload result. + if (destType->isArrayType()) + return false; + break; case InitializationSequence::FK_ConstructorOverloadFailed: case InitializationSequence::FK_UserConversionOverloadFailed: - case InitializationSequence::FK_ParenthesizedListInitFailed: break; } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -634,6 +634,8 @@ that construct (`#62133 <https://github.com/llvm/llvm-project/issues/38717>_`). - Fix crash caused by PseudoObjectExprBitfields: NumSubExprs overflow. (`#63169 <https://github.com/llvm/llvm-project/issues/63169>_`) +- Fix crash when casting an object to an array type. + (`#63758 <https://github.com/llvm/llvm-project/issues/63758>_`) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Index: clang/test/SemaCXX/paren-list-agg-init.cpp =================================================================== --- clang/test/SemaCXX/paren-list-agg-init.cpp +++ clang/test/SemaCXX/paren-list-agg-init.cpp @@ -294,3 +294,8 @@ } } + +namespace gh63758 { + struct S {} s; + auto words = (char[])s; // expected-error {{C-style cast from 'struct S' to 'char[]' is not allowed}} +}; Index: clang/lib/Sema/SemaCast.cpp =================================================================== --- clang/lib/Sema/SemaCast.cpp +++ clang/lib/Sema/SemaCast.cpp @@ -454,9 +454,18 @@ switch (sequence.getFailureKind()) { default: return false; + case InitializationSequence::FK_ParenthesizedListInitFailed: + // In C++20, if the underlying destination type is a RecordType, then we + // attempt to perform parentesized aggregate initialization if constructor + // overload fails. If that fails, then we'll generate the diagnostics from + // the failed overload result from the previous constructor overload. Array + // initialization, however, is not done after attempting constructor + // overloading, so we bail out as there won't be a failed overload result. + if (destType->isArrayType()) + return false; + break; case InitializationSequence::FK_ConstructorOverloadFailed: case InitializationSequence::FK_UserConversionOverloadFailed: - case InitializationSequence::FK_ParenthesizedListInitFailed: break; } Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -634,6 +634,8 @@ that construct (`#62133 <https://github.com/llvm/llvm-project/issues/38717>_`). - Fix crash caused by PseudoObjectExprBitfields: NumSubExprs overflow. (`#63169 <https://github.com/llvm/llvm-project/issues/63169>_`) +- Fix crash when casting an object to an array type. + (`#63758 <https://github.com/llvm/llvm-project/issues/63758>_`) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits