[PATCH] D155523: [clang] Fix a crash when casting to an array type
Alan Zhao via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 17 15:57:05 PDT 2023
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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155523.541262.patch
Type: text/x-patch
Size: 2056 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230717/9ddd726e/attachment.bin>
More information about the cfe-commits
mailing list