36 const auto *CopyCtor = Result.Nodes.getNodeAs<CXXConstructorDecl>(
"ctor");
37 const auto *Initializer =
38 Result.Nodes.getNodeAs<CXXCtorInitializer>(
"move-init");
42 QualType QT = Initializer->getInit()->getType();
43 if (QT.isTriviallyCopyableType(*Result.Context))
46 if (QT.isConstQualified())
49 const auto *RD = QT->getAsCXXRecordDecl();
50 if (RD && RD->isTriviallyCopyable())
55 const CXXConstructorDecl *Candidate =
nullptr;
56 for (
const auto *Ctor : CopyCtor->getParent()->ctors()) {
57 if (Ctor->isMoveConstructor() && Ctor->getAccess() <= AS_protected &&
73 diag(Initializer->getSourceLocation(),
74 "move constructor initializes %select{class member|base class}0 by "
75 "calling a copy constructor")
76 << Initializer->isBaseInitializer();
77 diag(CopyCtor->getLocation(),
"copy constructor being called",
79 diag(Candidate->getLocation(),
"candidate move constructor here",
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.