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