1//===- DynamicTypeInfo.h - Runtime type information -------------*- C++ -*-===//
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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_DYNAMICTYPEINFO_H
10#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_DYNAMICTYPEINFO_H
11
12#include "clang/AST/Type.h"
13
14namespace clang {
15namespace ento {
16
17/// Stores the currently inferred strictest bound on the runtime type
18/// of a region in a given state along the analysis path.
19class DynamicTypeInfo {
20public:
21 DynamicTypeInfo() : DynTy(QualType()) {}
22
23 DynamicTypeInfo(QualType Ty, bool CanBeSub = true)
24 : DynTy(Ty), CanBeASubClass(CanBeSub) {}
25
26 /// Returns false if the type information is precise (the type 'DynTy' is
27 /// the only type in the lattice), true otherwise.
28 bool canBeASubClass() const { return CanBeASubClass; }
29
30 /// Returns true if the dynamic type info is available.
31 bool isValid() const { return !DynTy.isNull(); }
32
33 /// Returns the currently inferred upper bound on the runtime type.
34 QualType getType() const { return DynTy; }
35
36 operator bool() const { return isValid(); }
37
38 bool operator==(const DynamicTypeInfo &RHS) const {
39 return DynTy == RHS.DynTy && CanBeASubClass == RHS.CanBeASubClass;
40 }
41
42 void Profile(llvm::FoldingSetNodeID &ID) const {
43 ID.Add(DynTy);
44 ID.AddBoolean(CanBeASubClass);
45 }
46
47private:
48 QualType DynTy;
49 bool CanBeASubClass;
50};
51
52} // namespace ento
53} // namespace clang
54
55#endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_DYNAMICTYPEINFO_H
56