DynamicTypeInfo.h revision 360784
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  bool operator==(const DynamicTypeInfo &RHS) const {
37    return DynTy == RHS.DynTy && CanBeASubClass == RHS.CanBeASubClass;
38  }
39
40  void Profile(llvm::FoldingSetNodeID &ID) const {
41    ID.Add(DynTy);
42    ID.AddBoolean(CanBeASubClass);
43  }
44
45private:
46  QualType DynTy;
47  bool CanBeASubClass;
48};
49
50} // namespace ento
51} // namespace clang
52
53#endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_DYNAMICTYPEINFO_H
54