PiotrZSL requested changes to this revision. PiotrZSL added a comment. This revision now requires changes to proceed.
Current solution is invalid, defaulted move constructors can throw by default. There are 2 more issues for this case: https://github.com/llvm/llvm-project/issues/38081 https://github.com/llvm/llvm-project/issues/41414 ================ Comment at: clang-tools-extra/clang-tidy/performance/NoexceptMoveConstructorCheck.cpp:46 + // specifier + if (Decl->isDefaulted() && ProtoType->getExceptionSpecType() == EST_None) + return; ---------------- that's not true... ``` #include <memory> struct Field { Field() = default; Field(Field&&) { } }; struct Test { Test(Test&&) = default; Field field; }; static_assert(std::is_nothrow_move_constructible<Test>::value); ``` Is default, not noexcept... Try something like this: ``` bool cannotThrow(const FunctionDecl *Func) { const auto *FunProto = Func->getType()->getAs<FunctionProtoType>(); if (!FunProto) return false; switch (FunProto->canThrow()) { case CT_Cannot: return true; case CT_Dependent: { const Expr *NoexceptExpr = FunProto->getNoexceptExpr(); bool Result; return NoexceptExpr && !NoexceptExpr->isValueDependent() && NoexceptExpr->EvaluateAsBooleanCondition( Result, Func->getASTContext(), true) && Result; } default: return false; }; } // Source: https://reviews.llvm.org/D145865 ``` so you could do something like this: ``` if (cannotThrow(Decl)) return; ``` I don't see reason to limit this check only to default'ed. This could be improved, to simply validate also things like ```noexcept(std::is_nothrow_move_constructible<TemplateType>::value)``` Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D146922/new/ https://reviews.llvm.org/D146922 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits