1*ae60884dSStanislav Gatev //===- unittests/Analysis/FlowSensitive/DataflowAnalysisContextTest.cpp ---===// 2*ae60884dSStanislav Gatev // 3*ae60884dSStanislav Gatev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*ae60884dSStanislav Gatev // See https://llvm.org/LICENSE.txt for license information. 5*ae60884dSStanislav Gatev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*ae60884dSStanislav Gatev // 7*ae60884dSStanislav Gatev //===----------------------------------------------------------------------===// 8*ae60884dSStanislav Gatev 9*ae60884dSStanislav Gatev #include "clang/Analysis/FlowSensitive/DataflowAnalysisContext.h" 10*ae60884dSStanislav Gatev #include "clang/Analysis/FlowSensitive/WatchedLiteralsSolver.h" 11*ae60884dSStanislav Gatev #include "gmock/gmock.h" 12*ae60884dSStanislav Gatev #include "gtest/gtest.h" 13*ae60884dSStanislav Gatev #include <memory> 14*ae60884dSStanislav Gatev 15*ae60884dSStanislav Gatev namespace { 16*ae60884dSStanislav Gatev 17*ae60884dSStanislav Gatev using namespace clang; 18*ae60884dSStanislav Gatev using namespace dataflow; 19*ae60884dSStanislav Gatev 20*ae60884dSStanislav Gatev class DataflowAnalysisContextTest : public ::testing::Test { 21*ae60884dSStanislav Gatev protected: 22*ae60884dSStanislav Gatev DataflowAnalysisContextTest() 23*ae60884dSStanislav Gatev : Context(std::make_unique<WatchedLiteralsSolver>()) {} 24*ae60884dSStanislav Gatev 25*ae60884dSStanislav Gatev DataflowAnalysisContext Context; 26*ae60884dSStanislav Gatev }; 27*ae60884dSStanislav Gatev 28*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest, 29*ae60884dSStanislav Gatev CreateAtomicBoolValueReturnsDistinctValues) { 30*ae60884dSStanislav Gatev auto &X = Context.createAtomicBoolValue(); 31*ae60884dSStanislav Gatev auto &Y = Context.createAtomicBoolValue(); 32*ae60884dSStanislav Gatev EXPECT_NE(&X, &Y); 33*ae60884dSStanislav Gatev } 34*ae60884dSStanislav Gatev 35*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest, 36*ae60884dSStanislav Gatev GetOrCreateConjunctionValueReturnsSameExprGivenSameArgs) { 37*ae60884dSStanislav Gatev auto &X = Context.createAtomicBoolValue(); 38*ae60884dSStanislav Gatev auto &XAndX = Context.getOrCreateConjunctionValue(X, X); 39*ae60884dSStanislav Gatev EXPECT_EQ(&XAndX, &X); 40*ae60884dSStanislav Gatev } 41*ae60884dSStanislav Gatev 42*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest, 43*ae60884dSStanislav Gatev GetOrCreateConjunctionValueReturnsSameExprOnSubsequentCalls) { 44*ae60884dSStanislav Gatev auto &X = Context.createAtomicBoolValue(); 45*ae60884dSStanislav Gatev auto &Y = Context.createAtomicBoolValue(); 46*ae60884dSStanislav Gatev auto &XAndY1 = Context.getOrCreateConjunctionValue(X, Y); 47*ae60884dSStanislav Gatev auto &XAndY2 = Context.getOrCreateConjunctionValue(X, Y); 48*ae60884dSStanislav Gatev EXPECT_EQ(&XAndY1, &XAndY2); 49*ae60884dSStanislav Gatev 50*ae60884dSStanislav Gatev auto &YAndX = Context.getOrCreateConjunctionValue(Y, X); 51*ae60884dSStanislav Gatev EXPECT_EQ(&XAndY1, &YAndX); 52*ae60884dSStanislav Gatev 53*ae60884dSStanislav Gatev auto &Z = Context.createAtomicBoolValue(); 54*ae60884dSStanislav Gatev auto &XAndZ = Context.getOrCreateConjunctionValue(X, Z); 55*ae60884dSStanislav Gatev EXPECT_NE(&XAndY1, &XAndZ); 56*ae60884dSStanislav Gatev } 57*ae60884dSStanislav Gatev 58*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest, 59*ae60884dSStanislav Gatev GetOrCreateDisjunctionValueReturnsSameExprGivenSameArgs) { 60*ae60884dSStanislav Gatev auto &X = Context.createAtomicBoolValue(); 61*ae60884dSStanislav Gatev auto &XOrX = Context.getOrCreateDisjunctionValue(X, X); 62*ae60884dSStanislav Gatev EXPECT_EQ(&XOrX, &X); 63*ae60884dSStanislav Gatev } 64*ae60884dSStanislav Gatev 65*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest, 66*ae60884dSStanislav Gatev GetOrCreateDisjunctionValueReturnsSameExprOnSubsequentCalls) { 67*ae60884dSStanislav Gatev auto &X = Context.createAtomicBoolValue(); 68*ae60884dSStanislav Gatev auto &Y = Context.createAtomicBoolValue(); 69*ae60884dSStanislav Gatev auto &XOrY1 = Context.getOrCreateDisjunctionValue(X, Y); 70*ae60884dSStanislav Gatev auto &XOrY2 = Context.getOrCreateDisjunctionValue(X, Y); 71*ae60884dSStanislav Gatev EXPECT_EQ(&XOrY1, &XOrY2); 72*ae60884dSStanislav Gatev 73*ae60884dSStanislav Gatev auto &YOrX = Context.getOrCreateDisjunctionValue(Y, X); 74*ae60884dSStanislav Gatev EXPECT_EQ(&XOrY1, &YOrX); 75*ae60884dSStanislav Gatev 76*ae60884dSStanislav Gatev auto &Z = Context.createAtomicBoolValue(); 77*ae60884dSStanislav Gatev auto &XOrZ = Context.getOrCreateDisjunctionValue(X, Z); 78*ae60884dSStanislav Gatev EXPECT_NE(&XOrY1, &XOrZ); 79*ae60884dSStanislav Gatev } 80*ae60884dSStanislav Gatev 81*ae60884dSStanislav Gatev TEST_F(DataflowAnalysisContextTest, 82*ae60884dSStanislav Gatev GetOrCreateNegationValueReturnsSameExprOnSubsequentCalls) { 83*ae60884dSStanislav Gatev auto &X = Context.createAtomicBoolValue(); 84*ae60884dSStanislav Gatev auto &NotX1 = Context.getOrCreateNegationValue(X); 85*ae60884dSStanislav Gatev auto &NotX2 = Context.getOrCreateNegationValue(X); 86*ae60884dSStanislav Gatev EXPECT_EQ(&NotX1, &NotX2); 87*ae60884dSStanislav Gatev 88*ae60884dSStanislav Gatev auto &Y = Context.createAtomicBoolValue(); 89*ae60884dSStanislav Gatev auto &NotY = Context.getOrCreateNegationValue(Y); 90*ae60884dSStanislav Gatev EXPECT_NE(&NotX1, &NotY); 91*ae60884dSStanislav Gatev } 92*ae60884dSStanislav Gatev 93*ae60884dSStanislav Gatev } // namespace 94