[clang] [Clang] SemaFunctionEffects: When verifying a function, ignore any conditional noexcept expression. (PR #115342)
Doug Wyatt via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 8 08:50:32 PST 2024
================
@@ -986,9 +987,22 @@ class Analyzer {
if (auto *Dtor = dyn_cast<CXXDestructorDecl>(CurrentCaller.CDecl))
followDestructor(dyn_cast<CXXRecordDecl>(Dtor->getParent()), Dtor);
- if (auto *FD = dyn_cast<FunctionDecl>(CurrentCaller.CDecl))
+ if (auto *FD = dyn_cast<FunctionDecl>(CurrentCaller.CDecl)) {
TrailingRequiresClause = FD->getTrailingRequiresClause();
+ // Note that FD->getType->getAs<FunctionProtoType>() can yield a
+ // noexcept Expr which has been boiled down to a constant expression.
+ // Going through the TypeSourceInfo obtains the actual expression which
+ // will be traversed as part of the function -- unless we capture it
+ // here and have TraverseStmt skip it.
+ if (TypeSourceInfo *TSI = FD->getTypeSourceInfo()) {
+ FunctionProtoTypeLoc TL =
+ TSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
+ if (const FunctionProtoType *FPT = TL.getTypePtr())
+ NoexceptExpr = FPT->getNoexceptExpr();
+ }
+ }
+
// Do an AST traversal of the function/block body
TraverseDecl(const_cast<Decl *>(CurrentCaller.CDecl));
----------------
dougsonos wrote:
That's a good thought. Looking at `TraverseFunctionHelper`:
- the template arguments should be ignorable.
- need to traverse the function's type because it contains the parameters -- e.g. I caught someone passing a vector by value instead of by reference and that showed up first as a call to the vector's destructor, located in the parameter list.
- but the function's type is where the noexcept expression comes from.
- can skip the trailing return clause.
- need to traverse the constructor initializers.
- need to traverse the body of course.
I'm not excited to tear this apart at the moment but maybe the next bug that comes up in this area can drive an improvement.
https://github.com/llvm/llvm-project/pull/115342
More information about the cfe-commits
mailing list