34#include "cling/Interpreter/Interpreter.h"
36#include "clang/AST/Attr.h"
37#include "clang/AST/ASTContext.h"
38#include "clang/AST/Decl.h"
39#include "clang/AST/GlobalDecl.h"
40#include "clang/AST/Expr.h"
41#include "clang/AST/ExprCXX.h"
42#include "clang/AST/PrettyPrinter.h"
43#include "clang/AST/RecordLayout.h"
44#include "clang/AST/Type.h"
46#include "clang/Interpreter/CppInterOp.h"
48#include "llvm/Support/Casting.h"
49#include "llvm/Support/raw_ostream.h"
50#include "llvm/ADT/APSInt.h"
51#include "llvm/ADT/APFloat.h"
58 return DK == clang::Decl::Field ||
DK == clang::Decl::EnumConstant ||
DK == clang::Decl::Var;
67 if (
const auto *
ND = llvm::dyn_cast<NamedDecl>(D)) {
74 if (!
ND->getIdentifier())
89 if (
auto *
VD = llvm::dyn_cast<clang::ValueDecl>(
USD->getTargetDecl())) {
111 if (!
ci || !
ci->IsValid()) {
115 auto *
DC = llvm::dyn_cast<clang::DeclContext>(
ci->GetDecl());
122 const clang::ValueDecl *
ValD,
133 using namespace llvm;
134 const auto DC =
ValD->getDeclContext();
140 "The decl should be either VarDecl or FieldDecl or EnumConstDecl");
153 if (code == 0)
return;
168 return (
const clang::Decl*)(
VD->getCanonicalDecl());
203 clang::Decl::Kind
DK =
VD->getKind();
205 (
DK != clang::Decl::Field) &&
206 (
DK != clang::Decl::Var) &&
207 (
DK != clang::Decl::EnumConstant)
212 if (
DK == clang::Decl::EnumConstant) {
218 clang::QualType
QT =
VD->getType().getCanonicalType();
221 if (
QT->isArrayType()) {
223 QT = llvm::cast<clang::ArrayType>(
QT)->getElementType();
226 else if (
QT->isReferenceType()) {
227 QT = llvm::cast<clang::ReferenceType>(
QT)->getPointeeType();
230 else if (
QT->isPointerType()) {
231 QT = llvm::cast<clang::PointerType>(
QT)->getPointeeType();
234 else if (
QT->isMemberPointerType()) {
235 QT = llvm::cast<clang::MemberPointerType>(
QT)->getPointeeType();
250 clang::Decl::Kind
DK =
GetDecl()->getKind();
252 (
DK != clang::Decl::Field) &&
253 (
DK != clang::Decl::Var) &&
254 (
DK != clang::Decl::EnumConstant)
259 if (
DK == clang::Decl::EnumConstant) {
265 clang::QualType
QT =
VD->getType().getCanonicalType();
267 if ((dim < 0) || (dim >=
paran)) {
274 if (
QT->isArrayType()) {
276 if (
const clang::ConstantArrayType *
CAT =
277 llvm::dyn_cast<clang::ConstantArrayType>(
QT)
279 max =
static_cast<int>(
CAT->getSize().getZExtValue());
281 else if (llvm::dyn_cast<clang::IncompleteArrayType>(
QT)) {
290 QT = llvm::cast<clang::ArrayType>(
QT)->getElementType();
293 else if (
QT->isReferenceType()) {
294 QT = llvm::cast<clang::ReferenceType>(
QT)->getPointeeType();
297 else if (
QT->isPointerType()) {
298 QT = llvm::cast<clang::PointerType>(
QT)->getPointeeType();
301 else if (
QT->isMemberPointerType()) {
302 QT = llvm::cast<clang::MemberPointerType>(
QT)->getPointeeType();
312 assert(!
fDecl &&
"This is a single decl, not an iterator!");
332 using namespace clang;
344 cling::Interpreter::PushTransactionRAII
RAII(
fInterp);
345 const clang::RecordDecl *
RD =
FldD->getParent();
346 const clang::ASTRecordLayout &Layout = C.getASTRecordLayout(
RD);
347 uint64_t bits = Layout.getFieldOffset(
FldD->getFieldIndex());
348 int64_t
offset = C.toCharUnitsFromBits(bits).getQuantity();
355 cling::Interpreter::PushTransactionRAII
RAII(
fInterp);
359 if (
VD->hasInit() && (
VD->isConstexpr() ||
VD->getType().isConstQualified())) {
360 if (
const APValue* val =
VD->evaluateValue()) {
361 if (
VD->getType()->isIntegralType(C)) {
362 return reinterpret_cast<Longptr_t>(val->getInt().getRawData());
366 switch (val->getKind()) {
368 if (val->getInt().isSigned())
375 if (&val->getFloat().getSemantics()
376 == (
const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle()) {
379 }
else if (&val->getFloat().getSemantics()
380 == (
const llvm::fltSemantics*) &llvm::APFloat::IEEEdouble()) {
410 auto v =
ECD->getInitVal();
411 if (
v.getActiveBits() == 64 &&
v.isUnsigned()) {
413 fEnumValue =
static_cast<int64_t
>(
v.getZExtValue());
441 for (
const auto *Parent =
declOrParent->getDeclContext(); !llvm::isa<TranslationUnitDecl>(Parent);
443 if (!Parent->isTransparentContext()) {
444 if (
const auto *
RD = llvm::dyn_cast<clang::RecordDecl>(Parent)) {
445 if (!
RD->isAnonymousStructOrUnion()) {
469 case clang::AS_public:
472 case clang::AS_protected:
475 case clang::AS_private:
483 assert(
false &&
"Unexpected value for the access property value in Clang");
486 if (llvm::isa<clang::UsingShadowDecl>(
thisDecl))
490 if (
const clang::VarDecl *
vard = llvm::dyn_cast<clang::VarDecl>(
vd)) {
491 if (
vard->isConstexpr())
493 if (
vard->getStorageClass() == clang::SC_Static) {
500 }
else if (llvm::isa<clang::EnumConstantDecl>(
vd)) {
505 clang::QualType
qt =
vd->getType();
506 if (llvm::isa<clang::TypedefType>(
qt)) {
509 qt =
qt.getCanonicalType();
511 const clang::TagType *
tt =
qt->getAs<clang::TagType>();
514 cling::Interpreter::PushTransactionRAII
RAII(
fInterp);
515 const clang::TagDecl *
td =
tt->getDecl();
519 else if (
td->isStruct()) {
522 else if (
td->isUnion()) {
525 else if (
td->isEnum()) {
530 if (
const auto *
RD = llvm::dyn_cast<RecordDecl>(
thisDecl->getDeclContext())) {
547 clang::QualType
qt =
vd->getType();
559 clang::Decl::Kind
dk =
vd->getKind();
560 if ((
dk != clang::Decl::Field) && (
dk != clang::Decl::Var) &&
561 (
dk != clang::Decl::EnumConstant)) {
565 return Cpp::GetSizeOfType(
vd->getType().getAsOpaquePtr());
578 static std::string buf;
581 clang::QualType
vdType =
vd->getType();
584 while (
vdType->isArrayType()) {
606 static std::string buf;
617 while (buf.length() && buf[buf.length()-1] ==
']') {
618 size_t last = buf.rfind(
'[');
619 if (last != std::string::npos) {
652 for (Decl::attr_iterator
attrIt =
decl->attr_begin();
677 return llvm::StringRef();
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t property
R__EXTERN TVirtualMutex * gInterpreterMutex
#define R__LOCKGUARD(mutex)
Emulation of the CINT ClassInfo class.
const clang::Type * GetType() const
TClingClassInfo fClassInfo
const char * TypeName() const
const clang::Type * GetClassAsType() const
const clang::Decl * GetDecl() const override
const char * TypeTrueName(const ROOT::TMetaUtils::TNormalizedCtxt &normCtxt) const
void CheckForIoTypeAndName() const
union TClingDataMemberInfo::@28 fConstInitVal
const clang::UsingShadowDecl * GetAsUsingShadowDecl() const
int MaxIndex(int dim) const
TClingDataMemberInfo(cling::Interpreter *interp)
cling::Interpreter * fInterp
const clang::ValueDecl * GetTargetValueDecl() const
Get the ValueDecl, or if this represents a UsingShadowDecl, the underlying target ValueDecl.
const clang::ValueDecl * GetAsValueDecl() const
llvm::StringRef ValidArrayIndex() const
const char * Name() const override
long TypeProperty() const
TClingDataMemberIter fIter
DeclId_t GetDeclId() const
Iterate over VarDecl, FieldDecl, EnumConstantDecl, IndirectFieldDecl, and UsingShadowDecls thereof,...
TDictionary::EMemberSelection fSelection
bool ShouldSkip(const clang::Decl *FD) const final
const clang::Decl * fDecl
virtual const char * Name() const
virtual bool IsValid() const
long Property(long property, clang::QualType &qt) const
bool Next()
Advance to next non-skipped; return false if no next decl exists.
virtual bool IsValid() const
Emulation of the CINT TypeInfo class.
static bool WantsRegularMembers(EMemberSelection sel)
EMemberSelection
Kinds of members to include in lists.
static bool WantsUsingDecls(EMemberSelection sel)