[PATCH] D140327: [clang] Remove overly restrictive aggregate paren init logic
Alan Zhao via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 21 08:21:15 PST 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc77a91bb7ba7: [clang] Remove overly restrictive aggregate paren init logic (authored by ayzhao).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D140327/new/
https://reviews.llvm.org/D140327
Files:
clang/lib/Sema/SemaInit.cpp
clang/test/CodeGen/paren-list-agg-init.cpp
Index: clang/test/CodeGen/paren-list-agg-init.cpp
===================================================================
--- clang/test/CodeGen/paren-list-agg-init.cpp
+++ clang/test/CodeGen/paren-list-agg-init.cpp
@@ -1,9 +1,25 @@
// RUN: %clang_cc1 -std=c++20 %s -emit-llvm -triple x86_64-unknown-linux-gnu -o - | FileCheck %s
+template <typename T>
+struct IsChar {
+ constexpr operator bool() const { return false; }
+};
+
+template<>
+struct IsChar<char> {
+ constexpr operator bool() const { return true; }
+};
+
+template <typename T>
+concept SameAsChar = (bool)IsInt<T>();
+
// CHECK-DAG: [[STRUCT_A:%.*]] = type { i8, double }
struct A {
char i;
double j;
+
+ template <SameAsChar T>
+ operator T() const { return i; };
};
// CHECK-DAG: [[STRUCT_B:%.*]] = type { [[STRUCT_A]], i32 }
@@ -29,6 +45,7 @@
struct E {
int a;
const char* fn = __builtin_FUNCTION();
+ ~E() {};
};
// CHECK-DAG: [[STRUCT_F:%.*]] = type { i8 }
Index: clang/lib/Sema/SemaInit.cpp
===================================================================
--- clang/lib/Sema/SemaInit.cpp
+++ clang/lib/Sema/SemaInit.cpp
@@ -5930,25 +5930,6 @@
return false;
}
-static bool onlyHasDefaultedCtors(OverloadCandidateSet &OCS) {
- if (OCS.size() != 3)
- return false;
-
- bool HasDefaultCtor = false, HasCopyCtor = false, HasMoveCtor = false;
- for (const auto &Candidate : OCS) {
- if (auto *Ctor = dyn_cast_or_null<CXXConstructorDecl>(Candidate.Function);
- Ctor != nullptr && Ctor->isDefaulted()) {
- if (Ctor->isDefaultConstructor())
- HasDefaultCtor = true;
- else if (Ctor->isCopyConstructor())
- HasCopyCtor = true;
- else if (Ctor->isMoveConstructor())
- HasMoveCtor = true;
- }
- }
- return HasDefaultCtor && HasCopyCtor && HasMoveCtor;
-}
-
void InitializationSequence::InitializeFrom(Sema &S,
const InitializedEntity &Entity,
const InitializationKind &Kind,
@@ -6196,8 +6177,7 @@
if (const auto *RD =
dyn_cast<CXXRecordDecl>(DestType->getAs<RecordType>()->getDecl());
S.getLangOpts().CPlusPlus20 && RD && RD->isAggregate() && Failed() &&
- getFailureKind() == FK_ConstructorOverloadFailed &&
- onlyHasDefaultedCtors(getFailedCandidateSet())) {
+ getFailureKind() == FK_ConstructorOverloadFailed) {
// C++20 [dcl.init] 17.6.2.2:
// - Otherwise, if no constructor is viable, the destination type is
// an
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D140327.484589.patch
Type: text/x-patch
Size: 2555 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221221/e1e83d19/attachment-0001.bin>
More information about the cfe-commits
mailing list