brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · b07328d Raw
103 lines · cpp
1//===- unittests/Analysis/FlowSensitive/ValueTest.cpp ---===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/Analysis/FlowSensitive/Value.h"10#include "clang/Analysis/FlowSensitive/Arena.h"11#include "clang/Analysis/FlowSensitive/StorageLocation.h"12#include "gmock/gmock.h"13#include "gtest/gtest.h"14#include <memory>15 16namespace {17 18using namespace clang;19using namespace dataflow;20 21TEST(ValueTest, EquivalenceReflexive) {22  IntegerValue V;23  EXPECT_TRUE(areEquivalentValues(V, V));24}25 26TEST(ValueTest, DifferentIntegerValuesNotEquivalent) {27  IntegerValue V1;28  IntegerValue V2;29  EXPECT_FALSE(areEquivalentValues(V1, V2));30}31 32TEST(ValueTest, AliasedPointersEquivalent) {33  auto L = ScalarStorageLocation(QualType());34  PointerValue V1(L);35  PointerValue V2(L);36  EXPECT_TRUE(areEquivalentValues(V1, V2));37  EXPECT_TRUE(areEquivalentValues(V2, V1));38}39 40TEST(ValueTest, TopsEquivalent) {41  Arena A;42  TopBoolValue V1(A.makeAtomRef(Atom(0)));43  TopBoolValue V2(A.makeAtomRef(Atom(1)));44  EXPECT_TRUE(areEquivalentValues(V1, V2));45  EXPECT_TRUE(areEquivalentValues(V2, V1));46}47 48// The framework does not (currently) consider equivalence for values with49// properties, leaving such to individual analyses.50TEST(ValueTest, ValuesWithSamePropsDifferent) {51  Arena A;52  TopBoolValue Prop(A.makeAtomRef(Atom(0)));53  TopBoolValue V1(A.makeAtomRef(Atom(2)));54  TopBoolValue V2(A.makeAtomRef(Atom(3)));55  V1.setProperty("foo", Prop);56  V2.setProperty("foo", Prop);57  EXPECT_FALSE(areEquivalentValues(V1, V2));58  EXPECT_FALSE(areEquivalentValues(V2, V1));59}60 61TEST(ValueTest, ValuesWithDifferentPropsDifferent) {62  Arena A;63  TopBoolValue Prop1(A.makeAtomRef(Atom(0)));64  TopBoolValue Prop2(A.makeAtomRef(Atom(1)));65  TopBoolValue V1(A.makeAtomRef(Atom(2)));66  TopBoolValue V2(A.makeAtomRef(Atom(3)));67  V1.setProperty("foo", Prop1);68  V2.setProperty("bar", Prop2);69  EXPECT_FALSE(areEquivalentValues(V1, V2));70  EXPECT_FALSE(areEquivalentValues(V2, V1));71}72 73TEST(ValueTest, ValuesWithDifferentNumberPropsDifferent) {74  Arena A;75  TopBoolValue Prop(A.makeAtomRef(Atom(0)));76  TopBoolValue V1(A.makeAtomRef(Atom(2)));77  TopBoolValue V2(A.makeAtomRef(Atom(3)));78  // Only set a property on `V1`.79  V1.setProperty("foo", Prop);80  EXPECT_FALSE(areEquivalentValues(V1, V2));81  EXPECT_FALSE(areEquivalentValues(V2, V1));82}83 84TEST(ValueTest, DifferentKindsNotEquivalent) {85  Arena A;86  auto L = ScalarStorageLocation(QualType());87  PointerValue V1(L);88  TopBoolValue V2(A.makeAtomRef(Atom(0)));89  EXPECT_FALSE(areEquivalentValues(V1, V2));90  EXPECT_FALSE(areEquivalentValues(V2, V1));91}92 93TEST(ValueTest, NotAliasedPointersNotEquivalent) {94  auto L1 = ScalarStorageLocation(QualType());95  PointerValue V1(L1);96  auto L2 = ScalarStorageLocation(QualType());97  PointerValue V2(L2);98  EXPECT_FALSE(areEquivalentValues(V1, V2));99  EXPECT_FALSE(areEquivalentValues(V2, V1));100}101 102} // namespace103