[clang] d89d3a6 - [Sema] add cast from IncompleteArrayType to ConstantArrayType in TryReferenceListInitialization (#65918)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 29 14:50:43 PDT 2023
Author: Congcong Cai
Date: 2023-09-30T05:50:38+08:00
New Revision: d89d3a6a0eb3e5f9ad35cd8b64a7237ed227f10b
URL: https://github.com/llvm/llvm-project/commit/d89d3a6a0eb3e5f9ad35cd8b64a7237ed227f10b
DIFF: https://github.com/llvm/llvm-project/commit/d89d3a6a0eb3e5f9ad35cd8b64a7237ed227f10b.diff
LOG: [Sema] add cast from IncompleteArrayType to ConstantArrayType in TryReferenceListInitialization (#65918)
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/include/clang/AST/OperationKinds.def
clang/lib/Sema/SemaInit.cpp
clang/test/CodeGenCXX/cxx20-p0388-unbound-ary.cpp
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 829ec2e334a068d..8f5a67e14c9aba3 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -264,6 +264,9 @@ Bug Fixes in This Version
(`#66047 <https://github.com/llvm/llvm-project/issues/66047>`_)
- Fix parser crash when dealing with ill-formed objective C++ header code. Fixes
(`#64836 <https://github.com/llvm/llvm-project/issues/64836>`_)
+- Fix crash in implicit conversions from initialize list to arrays of unknown
+ bound for C++20. Fixes
+ (`#62945 <https://github.com/llvm/llvm-project/issues/62945>`_)
- Clang now allows an ``_Atomic`` qualified integer in a switch statement. Fixes
(`#65557 <https://github.com/llvm/llvm-project/issues/65557>`_)
- Fixes crash when trying to obtain the common sugared type of
diff --git a/clang/include/clang/AST/OperationKinds.def b/clang/include/clang/AST/OperationKinds.def
index 96b5a4db55e0ce0..8dd98730dff7426 100644
--- a/clang/include/clang/AST/OperationKinds.def
+++ b/clang/include/clang/AST/OperationKinds.def
@@ -80,6 +80,7 @@ CAST_OPERATION(LValueToRValue)
/// (possibly) adding qualifiers or removing noexcept.
/// int -> int
/// char** -> const char * const *
+/// int[1] -> int[]
/// void () noexcept -> void ()
CAST_OPERATION(NoOp)
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index cb57a2d1a555caa..de576cc52c42e79 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -18,6 +18,7 @@
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/CharInfo.h"
#include "clang/Basic/SourceManager.h"
+#include "clang/Basic/Specifiers.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Sema/Designator.h"
#include "clang/Sema/EnterExpressionEvaluationContext.h"
@@ -4528,6 +4529,17 @@ static void TryReferenceListInitialization(Sema &S,
if (Sequence) {
if (DestType->isRValueReferenceType() ||
(T1Quals.hasConst() && !T1Quals.hasVolatile())) {
+ if (S.getLangOpts().CPlusPlus20 &&
+ isa<IncompleteArrayType>(T1->getUnqualifiedDesugaredType()) &&
+ DestType->isRValueReferenceType()) {
+ // C++20 [dcl.init.list]p3.10:
+ // List-initialization of an object or reference of type T is defined as
+ // follows:
+ // ..., unless T is “reference to array of unknown bound of U”, in which
+ // case the type of the prvalue is the type of x in the declaration U
+ // x[] H, where H is the initializer list.
+ Sequence.AddQualificationConversionStep(cv1T1, clang::VK_PRValue);
+ }
Sequence.AddReferenceBindingStep(cv1T1IgnoreAS,
/*BindingTemporary=*/true);
if (T1Quals.hasAddressSpace())
diff --git a/clang/test/CodeGenCXX/cxx20-p0388-unbound-ary.cpp b/clang/test/CodeGenCXX/cxx20-p0388-unbound-ary.cpp
index 78f35a024a54014..a29f4d720c1de4e 100644
--- a/clang/test/CodeGenCXX/cxx20-p0388-unbound-ary.cpp
+++ b/clang/test/CodeGenCXX/cxx20-p0388-unbound-ary.cpp
@@ -23,4 +23,13 @@ auto &frob2(int (&arp)[1]) {
return r2;
}
+
+// CHECK-LABEL: @_ZN3One3fooEi
+// CHECK-NEXT: entry:
+// CHECK-NEXT: ret void
+void foo(int a) {
+ auto f = [](int(&&)[]) {};
+ f({a});
+}
+
} // namespace One
More information about the cfe-commits
mailing list