Skip to content

Commit d35944b

Browse files
committed
fix the case of non copyable subobjects
1 parent 7b8c4b7 commit d35944b

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

clang/lib/Sema/SemaTypeTraits.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,16 +1167,22 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT,
11671167
return true;
11681168
if (!(RD->hasTrivialDestructor() && (!Dtor || !Dtor->isDeleted())))
11691169
return false;
1170+
if (RD->hasTrivialDefaultConstructor())
1171+
return true;
11701172
bool FoundCopyCtr = false;
11711173
bool FoundMoveCtr = false;
1174+
bool FoundDefaultCtr = false;
11721175
for (CXXConstructorDecl *Ctr : RD->ctors()) {
1173-
FoundCopyCtr = Ctr->isCopyConstructor();
1174-
FoundMoveCtr = Ctr->isMoveConstructor();
11751176
if (Ctr->isIneligibleOrNotSelected() || Ctr->isDeleted())
11761177
continue;
11771178
if (Ctr->isTrivial())
11781179
return true;
1180+
FoundCopyCtr = Ctr->isCopyConstructor();
1181+
FoundMoveCtr = Ctr->isMoveConstructor();
1182+
FoundDefaultCtr = Ctr->isDefaultConstructor();
11791183
}
1184+
if (!FoundDefaultCtr && RD->hasTrivialDefaultConstructor())
1185+
return true;
11801186
if (!FoundCopyCtr && RD->hasTrivialCopyConstructor() &&
11811187
!RD->defaultedCopyConstructorIsDeleted())
11821188
return true;

clang/test/SemaCXX/type-traits.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2075,7 +2075,17 @@ struct Ctr2 {
20752075
NoEligibleTrivialContructor inner;
20762076
};
20772077

2078+
struct NonCopyable{
2079+
NonCopyable() = default;
2080+
NonCopyable(const NonCopyable&) = delete;
2081+
};
2082+
2083+
class C {
2084+
NonCopyable nc;
2085+
};
2086+
20782087
static_assert(__builtin_is_implicit_lifetime(Ctr));
2088+
static_assert(__builtin_is_implicit_lifetime(C));
20792089
static_assert(!__builtin_is_implicit_lifetime(NoEligibleTrivialContructor));
20802090
static_assert(__builtin_is_implicit_lifetime(NonAggregate));
20812091
static_assert(!__builtin_is_implicit_lifetime(DataMemberInitializer));

0 commit comments

Comments
 (0)