//===- unittests/Analysis/FlowSensitive/CFGMatchSwitchTest.cpp ------------===// // // 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 // //===----------------------------------------------------------------------===// #include "clang/Analysis/FlowSensitive/CFGMatchSwitch.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/Stmt.h" #include "clang/Analysis/CFG.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/StringRef.h" #include "gtest/gtest.h" usingnamespaceclang; usingnamespacedataflow; usingnamespaceast_matchers; namespace { // State for tracking the number of matches on each kind of CFGElement by the // CFGMatchSwitch. Currently only tracks CFGStmt and CFGInitializer. struct CFGElementMatches { … }; // Returns a match switch that counts the number of local variables // (singly-declared) and fields initialized to the integer literal 42. auto buildCFGMatchSwitch() { … } // Runs the match switch `MS` on the control flow graph generated from `Code`, // tracking information in state `S`. For simplicity, this test utility is // restricted to CFGs with a single control flow block (excluding entry and // exit blocks) - generated by `Code` with sequential flow (i.e. no branching). // // Requirements: // // `Code` must contain a function named `f`, the body of this function will be // used to generate the CFG. template <typename State> void applySwitchToCode(CFGMatchSwitch<State> &MS, State &S, llvm::StringRef Code) { … } TEST(CFGMatchSwitchTest, NoInitializationTo42) { … } TEST(CFGMatchSwitchTest, SingleLocalVarInitializationTo42) { … } TEST(CFGMatchSwitchTest, SingleFieldInitializationTo42) { … } TEST(CFGMatchSwitchTest, LocalVarAndFieldInitializationTo42) { … } } // namespace