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 14 namespace clang { 15 namespace 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. 19 class DynamicTypeInfo { 20 public: DynamicTypeInfo()21 DynamicTypeInfo() {} 22 23 DynamicTypeInfo(QualType Ty, bool CanBeSub = true) DynTy(Ty)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. canBeASubClass()28 bool canBeASubClass() const { return CanBeASubClass; } 29 30 /// Returns true if the dynamic type info is available. isValid()31 bool isValid() const { return !DynTy.isNull(); } 32 33 /// Returns the currently inferred upper bound on the runtime type. getType()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 Profile(llvm::FoldingSetNodeID & ID)42 void Profile(llvm::FoldingSetNodeID &ID) const { 43 ID.Add(DynTy); 44 ID.AddBoolean(CanBeASubClass); 45 } 46 47 private: 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