Skip to content

Commit af13d31

Browse files
committed
[Clang] Fix a regression introduced by llvm#161163.
Classes with a user provided constructor are still implicit lifetime if they have an implicit, trivial copy ctr.
1 parent 842622b commit af13d31

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

clang/lib/Sema/SemaTypeTraits.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,14 +1165,24 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT,
11651165
const CXXDestructorDecl *Dtor = RD->getDestructor();
11661166
if (UnqualT->isAggregateType() && (!Dtor || !Dtor->isUserProvided()))
11671167
return true;
1168-
if (RD->hasTrivialDestructor() && (!Dtor || !Dtor->isDeleted())) {
1169-
for (CXXConstructorDecl *Ctr : RD->ctors()) {
1170-
if (Ctr->isIneligibleOrNotSelected() || Ctr->isDeleted())
1171-
continue;
1172-
if (Ctr->isTrivial())
1173-
return true;
1174-
}
1168+
if (!(RD->hasTrivialDestructor() && (!Dtor || !Dtor->isDeleted())))
1169+
return false;
1170+
bool FoundCopyCtr = false;
1171+
bool FoundMoveCtr = false;
1172+
for (CXXConstructorDecl *Ctr : RD->ctors()) {
1173+
FoundCopyCtr = Ctr->isCopyConstructor();
1174+
FoundMoveCtr = Ctr->isMoveConstructor();
1175+
if (Ctr->isIneligibleOrNotSelected() || Ctr->isDeleted())
1176+
continue;
1177+
if (Ctr->isTrivial())
1178+
return true;
11751179
}
1180+
if (!FoundCopyCtr && RD->hasTrivialCopyConstructor() &&
1181+
!RD->defaultedCopyConstructorIsDeleted())
1182+
return true;
1183+
if (!FoundMoveCtr && RD->hasTrivialMoveConstructor() &&
1184+
!RD->defaultedMoveConstructorIsDeleted())
1185+
return true;
11761186
return false;
11771187
}
11781188
case UTT_IsIntangibleType:

clang/test/SemaCXX/type-traits.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2066,7 +2066,17 @@ class UserProvidedConstructor {
20662066
UserProvidedConstructor(const UserProvidedConstructor&) = delete;
20672067
UserProvidedConstructor& operator=(const UserProvidedConstructor&) = delete;
20682068
};
2069+
struct Ctr {
2070+
Ctr();
2071+
};
2072+
struct Ctr2 {
2073+
Ctr2();
2074+
private:
2075+
NoEligibleTrivialContructor inner;
2076+
};
20692077

2078+
static_assert(__builtin_is_implicit_lifetime(Ctr));
2079+
static_assert(!__builtin_is_implicit_lifetime(NoEligibleTrivialContructor));
20702080
static_assert(__builtin_is_implicit_lifetime(NonAggregate));
20712081
static_assert(!__builtin_is_implicit_lifetime(DataMemberInitializer));
20722082
static_assert(!__builtin_is_implicit_lifetime(UserProvidedConstructor));
@@ -2076,7 +2086,7 @@ template <typename T>
20762086
class Tpl {
20772087
Tpl() requires false = default ;
20782088
};
2079-
static_assert(!__builtin_is_implicit_lifetime(Tpl<int>));
2089+
static_assert(__builtin_is_implicit_lifetime(Tpl<int>));
20802090

20812091
#endif
20822092
}

0 commit comments

Comments
 (0)