in src/TypeUtils.cpp [24:70]
bool clazy::classifyQualType(const ClazyContext *context, clang::QualType qualType, const VarDecl *varDecl, QualTypeClassification &classif, clang::Stmt *body)
{
QualType unrefQualType = clazy::unrefQualType(qualType);
const Type *paramType = unrefQualType.getTypePtrOrNull();
if (!paramType || paramType->isIncompleteType()) {
return false;
}
if (isUndeducibleAuto(paramType)) {
return false;
}
classif.size_of_T = context->astContext.getTypeSize(unrefQualType) / 8;
classif.isBig = classif.size_of_T > 16;
CXXRecordDecl *recordDecl = paramType->getAsCXXRecordDecl();
CXXMethodDecl *copyCtor = recordDecl ? Utils::copyCtor(recordDecl) : nullptr;
classif.isNonTriviallyCopyable =
recordDecl && (recordDecl->hasNonTrivialCopyConstructor() || recordDecl->hasNonTrivialDestructor() || (copyCtor && copyCtor->isDeleted()));
classif.isReference = qualType->isLValueReferenceType();
classif.isConst = unrefQualType.isConstQualified();
if (qualType->isRValueReferenceType()) { // && ref, nothing to do here
return true;
}
if (classif.isConst && !classif.isReference) {
classif.passNonTriviallyCopyableByConstRef = classif.isNonTriviallyCopyable;
if (classif.isBig) {
classif.passBigTypeByConstRef = true;
}
} else if (classif.isConst && classif.isReference && !classif.isNonTriviallyCopyable && !classif.isBig) {
classif.passSmallTrivialByValue = true;
} else if (varDecl && !classif.isConst && !classif.isReference && (classif.isBig || classif.isNonTriviallyCopyable)) {
if (body
&& (Utils::containsNonConstMemberCall(context->parentMap, body, varDecl)
|| Utils::isPassedToFunction(StmtBodyRange(body), varDecl, /*byrefonly=*/true))) {
return true;
}
classif.passNonTriviallyCopyableByConstRef = classif.isNonTriviallyCopyable;
if (classif.isBig) {
classif.passBigTypeByConstRef = true;
}
}
return true;
}