================ @@ -1,44 +1,67 @@ -//=== EffectAnalysis.cpp - Sema warnings for function effects -------------===// +//=== SemaFunctionEffects.cpp - Sema handling of function effects ---------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // -// This file implements caller/callee analysis for function effects. +// This file implements Sema handling of function effects. // //===----------------------------------------------------------------------===// #include "clang/AST/Decl.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/AST/Stmt.h" #include "clang/AST/Type.h" #include "clang/Basic/SourceManager.h" #include "clang/Sema/SemaInternal.h" -#define DEBUG_TYPE "fxanalysis" +#define DEBUG_TYPE "effectanalysis" using namespace clang; namespace { enum class ViolationID : uint8_t { - None = 0, // sentinel for an empty Violation - Throws, - Catches, - CallsObjC, - AllocatesMemory, - HasStaticLocal, - AccessesThreadLocal, - - // These only apply to callees, where the analysis stops at the Decl + None = 0, // Sentinel for an empty Violation. + // These first few map to a %select{} in a diagnostic. + BaseDiagnosticIndex, + AllocatesMemory = BaseDiagnosticIndex, + ThrowsOrCatchesExceptions, + HasStaticLocalVariable, + AccessesThreadLocalVariable, + AccessesObjCMethodOrProperty, + + // These only apply to callees, where the analysis stops at the Decl. DeclDisallowsInference, + // These both apply to indirect calls. The difference is that sometimes + // we have an actual Decl (generally a variable) which is the function + // pointer being called, and sometimes, typically due to a cast, we only + // have an expression. CallsDeclWithoutEffect, CallsExprWithoutEffect, }; +// Information about the AST context in which a violation was found, so +// that diagnostics can point to the correct source. +struct ViolationSite { + enum class Kind : uint8_t { + Default = 0, // Function body. + MemberInitializer = 1, + DefaultArgExpr = 2 + }; + + Kind VKind = Kind::Default; + CXXDefaultArgExpr *DefaultArgExpr = nullptr; ---------------- Sirraide wrote:
We could make smaller by combining the kind and expr using `llvm::PointerIntPair`. Might be worth if we’re expected to have a lot of these instantiated at the same time. https://github.com/llvm/llvm-project/pull/99656 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits