1//== DynamicTypeInfo.h - Runtime type information ----------------*- C++ -*--=// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#ifndef LLVM_CLANG_SA_CORE_DYNAMICTYPEINFO_H 10#define LLVM_CLANG_SA_CORE_DYNAMICTYPEINFO_H 11 12#include "clang/AST/Type.h" 13 14namespace clang { 15namespace ento { 16 17/// \brief Stores the currently inferred strictest bound on the runtime type 18/// of a region in a given state along the analysis path. 19class DynamicTypeInfo { 20private: 21 QualType T; 22 bool CanBeASubClass; 23 24public: 25 26 DynamicTypeInfo() : T(QualType()) {} 27 DynamicTypeInfo(QualType WithType, bool CanBeSub = true) 28 : T(WithType), CanBeASubClass(CanBeSub) {} 29 30 /// \brief Return false if no dynamic type info is available. 31 bool isValid() const { return !T.isNull(); } 32 33 /// \brief Returns the currently inferred upper bound on the runtime type. 34 QualType getType() const { return T; } 35 36 /// \brief Returns false if the type information is precise (the type T is 37 /// the only type in the lattice), true otherwise. 38 bool canBeASubClass() const { return CanBeASubClass; } 39 40 void Profile(llvm::FoldingSetNodeID &ID) const { 41 ID.Add(T); 42 ID.AddInteger((unsigned)CanBeASubClass); 43 } 44 bool operator==(const DynamicTypeInfo &X) const { 45 return T == X.T && CanBeASubClass == X.CanBeASubClass; 46 } 47}; 48 49} // end ento 50} // end clang 51 52#endif 53