35#include "cling/Interpreter/Interpreter.h" 
   36#include "cling/Interpreter/LookupHelper.h" 
   37#include "cling/Utils/AST.h" 
   39#include "clang/AST/ASTContext.h" 
   40#include "clang/AST/CXXInheritance.h" 
   41#include "clang/AST/Decl.h" 
   42#include "clang/AST/DeclBase.h" 
   43#include "clang/AST/DeclCXX.h" 
   44#include "clang/AST/DeclTemplate.h" 
   45#include "clang/AST/ExprCXX.h" 
   46#include "clang/AST/GlobalDecl.h" 
   47#include "clang/AST/Mangle.h" 
   48#include "clang/AST/PrettyPrinter.h" 
   49#include "clang/AST/Type.h" 
   50#include "clang/Basic/IdentifierTable.h" 
   51#include "clang/Sema/Lookup.h" 
   52#include "clang/Sema/Sema.h" 
   53#include "clang/Sema/Template.h" 
   54#include "clang/Sema/TemplateDeduction.h" 
   56#include "llvm/Support/Casting.h" 
   57#include "llvm/Support/raw_ostream.h" 
   65                                                 llvm::SmallVectorImpl<clang::CXXMethodDecl *> &&specFuncs)
 
   67   auto *CXXRD = llvm::dyn_cast<CXXRecordDecl>(DC);
 
   72   cling::Interpreter::PushTransactionRAII RAII(interp);
 
   74   auto emplaceSpecFunIfNeeded = [&](clang::CXXMethodDecl *D) {
 
   78      if (std::find(CXXRD->decls_begin(), CXXRD->decls_end(), D) == CXXRD->decls_end()) {
 
   83   for (
auto SpecFunc : specFuncs)
 
   84      emplaceSpecFunIfNeeded(SpecFunc);
 
   89   if (
const auto *FD = llvm::dyn_cast<clang::FunctionDecl>(D)) {
 
   92      if (
const auto *RD = llvm::dyn_cast<clang::RecordDecl>(FD->getDeclContext())) {
 
   93         if (
const auto *CXXMD = llvm::dyn_cast<clang::CXXMethodDecl>(FD)) {
 
   94            if (RD->isAnonymousStructOrUnion() &&
 
   95                GetInterpreter()->getSema().getSpecialMember(CXXMD) != clang::Sema::CXXInvalid) {
 
  108   if (
auto *FD = llvm::dyn_cast<clang::FunctionDecl>(USD->getTargetDecl())) {
 
  109      if (
const auto *CXXMD = llvm::dyn_cast<clang::CXXMethodDecl>(FD)) {
 
  110         auto SpecMemKind = 
GetInterpreter()->getSema().getSpecialMember(CXXMD);
 
  111         if ((SpecMemKind == clang::Sema::CXXDefaultConstructor && CXXMD->getNumParams() == 0) ||
 
  112             ((SpecMemKind == clang::Sema::CXXCopyConstructor || SpecMemKind == clang::Sema::CXXMoveConstructor) &&
 
  113              CXXMD->getNumParams() == 1)) {
 
  134   using namespace clang;
 
  137   Sema &S = interp->getSema();
 
  138   const cling::LookupHelper &LH = interp->getLookupHelper();
 
  140   if (!isa<FunctionTemplateDecl>(TD))
 
  143   auto templateParms = TD->getTemplateParameters();
 
  144   if (templateParms->containsUnexpandedParameterPack())
 
  147   if (templateParms->getMinRequiredArguments() > 0)
 
  150   const FunctionDecl *templatedDecl = llvm::dyn_cast<FunctionDecl>(TD->getTemplatedDecl());
 
  151   const Decl *declCtxDecl = dyn_cast<Decl>(TD->getDeclContext());
 
  161   llvm::SmallVector<TemplateArgument, 8> defaultTemplateArgs;
 
  162   for (
const NamedDecl *templateParm: *templateParms) {
 
  163      if (templateParm->isTemplateParameterPack()) {
 
  172      } 
else if (
auto TTP = dyn_cast<TemplateTypeParmDecl>(templateParm)) {
 
  173         if (!TTP->hasDefaultArgument())
 
  175         defaultTemplateArgs.emplace_back(TTP->getDefaultArgument());
 
  176      } 
else if (
auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(templateParm)) {
 
  177         if (!NTTP->hasDefaultArgument())
 
  179         defaultTemplateArgs.emplace_back(NTTP->getDefaultArgument());
 
  180      } 
else if (
auto TTP = dyn_cast<TemplateTemplateParmDecl>(templateParm)) {
 
  181         if (!TTP->hasDefaultArgument())
 
  183         defaultTemplateArgs.emplace_back(TTP->getDefaultArgument().getArgument());
 
  186         assert(0 && 
"unexpected template parameter kind");
 
  191   cling::Interpreter::PushTransactionRAII RAII(interp);
 
  194   llvm::SmallVector<QualType, 8> paramTypes;
 
  197   SmallVector<DeducedTemplateArgument, 4> DeducedArgs;
 
  198   sema::TemplateDeductionInfo 
Info{SourceLocation()};
 
  200   Sema::InstantiatingTemplate Inst(
 
  201      S, 
Info.getLocation(), 
const_cast<clang::FunctionTemplateDecl *
>(llvm::dyn_cast<clang::FunctionTemplateDecl>(TD)),
 
  202      defaultTemplateArgs, Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution, 
Info);
 
  206   TemplateArgumentList templArgList(TemplateArgumentList::OnStack, defaultTemplateArgs);
 
  207   MultiLevelTemplateArgumentList MLTAL{templArgList};
 
  208   for (
const clang::ParmVarDecl *param : templatedDecl->parameters()) {
 
  209      QualType paramType = param->getOriginalType();
 
  213      if (paramType->isDependentType()) {
 
  220         paramType = S.SubstType(paramType, MLTAL, SourceLocation(), templatedDecl->getDeclName());
 
  222         if (paramType.isNull() || paramType->isDependentType()) {
 
  228      paramTypes.push_back(paramType);
 
  231   return LH.findFunctionProto(declCtxDecl, TD->getNameAsString(), paramTypes, LH.NoDiagnostics,
 
  232                               templatedDecl->getType().isConstQualified());
 
  244   clang::Decl *D = 
const_cast<clang::Decl *
>(ci->
GetDecl());
 
  245   auto *DC = llvm::dyn_cast<clang::DeclContext>(D);
 
  247   llvm::SmallVector<clang::CXXMethodDecl*, 8> SpecFuncs;
 
  249   if (
auto *CXXRD = llvm::dyn_cast<CXXRecordDecl>(DC)) {
 
  254      cling::Interpreter::PushTransactionRAII RAII(interp);
 
  256      auto &SemaRef = interp->getSema();
 
  257      SemaRef.ForceDeclarationOfImplicitMembers(CXXRD);
 
  261      for (clang::NamedDecl *ctor : SemaRef.LookupConstructors(CXXRD)) {
 
  263         if (
auto *CXXCD = llvm::dyn_cast<clang::CXXConstructorDecl>(ctor))
 
  264            SpecFuncs.emplace_back(CXXCD);
 
  266      SpecFuncs.emplace_back(SemaRef.LookupCopyingAssignment(CXXRD,  0,  
false, 0 ));
 
  267      SpecFuncs.emplace_back(SemaRef.LookupMovingAssignment(CXXRD,  0,  
false, 0 ));
 
  268      SpecFuncs.emplace_back(SemaRef.LookupDestructor(CXXRD));
 
  276                                   const clang::Decl *D)
 
  277   : 
TClingDeclInfo(D), fInterp(interp), fFirstTime(true), fTitle(
"")
 
  280      Error(
"TClingMethodInfo", 
"nullptr FunctionDecl passed!");
 
  289      return (
const clang::Decl*)(FD->getCanonicalDecl());
 
  295   return dyn_cast<FunctionDecl>(
GetDecl());
 
  300   return dyn_cast<UsingShadowDecl>(
GetDecl());
 
  307      if (
auto FD = dyn_cast<FunctionDecl>(D))
 
  309   } 
while ((D = dyn_cast<UsingShadowDecl>(D)->getTargetDecl()));
 
  330      if (arg.
Name() && strlen(arg.
Name())) {
 
  332         signature += arg.
Name();
 
  341   if (decl && decl->isVariadic())
 
  376   unsigned num_params = fd->getNumParams();
 
  378   return static_cast<int>(num_params);
 
  387   unsigned num_params = fd->getNumParams();
 
  388   unsigned min_args = fd->getMinRequiredArguments();
 
  389   unsigned defaulted_params = num_params - min_args;
 
  391   return static_cast<int>(defaulted_params);
 
  410   assert(!
fDecl && 
"This is not an iterator!");
 
  439   const Decl *declAccess = 
GetDecl();
 
  440   if (llvm::isa<UsingShadowDecl>(declAccess))
 
  444   clang::AccessSpecifier Access = clang::AS_public;
 
  445   if (!declAccess->getDeclContext()->isNamespace())
 
  446      Access = declAccess->getAccess();
 
  449      Access = clang::AS_public;
 
  450      clang::CXXRecordDecl *typeCXXRD = llvm::cast<RecordType>(
Type()->GetQualType())->getAsCXXRecordDecl();
 
  451      clang::CXXBasePaths basePaths;
 
  452      if (typeCXXRD->isDerivedFrom(llvm::dyn_cast<CXXRecordDecl>(fd->getDeclContext()), basePaths)) {
 
  456         for (
auto el: basePaths) {
 
  457            if (el.Access > Access)
 
  461         Error(
"Property()", 
"UsingDecl of ctor not shadowing a base ctor!");
 
  465      if (fd->getAccess() > Access)
 
  466         Access = fd->getAccess();
 
  469      case clang::AS_public:
 
  472      case clang::AS_protected:
 
  475      case clang::AS_private:
 
  479         if (declAccess->getDeclContext()->isNamespace())
 
  487   if (fd->isConstexpr())
 
  489   if (fd->getStorageClass() == clang::SC_Static) {
 
  492   clang::QualType qt = fd->getReturnType().getCanonicalType();
 
  496   if (
const clang::CXXMethodDecl *md =
 
  497            llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
 
  498      if (md->getMethodQualifiers().hasConst()) {
 
  501      if (md->isVirtual()) {
 
  507      if (
const clang::CXXConstructorDecl *cd =
 
  508               llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
 
  509         if (cd->isExplicit()) {
 
  513      else if (
const clang::CXXConversionDecl *cd =
 
  514                  llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
 
  515         if (cd->isExplicit()) {
 
  532   if (fd->isOverloadedOperator())
 
  534   if (llvm::isa<clang::CXXConversionDecl>(fd))
 
  536   if (llvm::isa<clang::CXXConstructorDecl>(fd))
 
  538   if (llvm::isa<clang::CXXDestructorDecl>(fd))
 
  542   if (fd->getTemplatedKind() != clang::FunctionDecl::TK_NonTemplate)
 
  551      ti.Init(clang::QualType());
 
  557      const clang::TypeDecl* ctorClass = llvm::dyn_cast_or_null<clang::TypeDecl>
 
  560         Error(
"TClingMethodInfo::Type", 
"Cannot find DeclContext for constructor!");
 
  562         clang::QualType qt(ctorClass->getTypeForDecl(), 0);
 
  577   std::string mangled_name;
 
  578   mangled_name.clear();
 
  582   cling::Interpreter::PushTransactionRAII RAII(
fInterp);
 
  584   if (
const CXXConstructorDecl* Ctor = dyn_cast<CXXConstructorDecl>(D))
 
  585     GD = GlobalDecl(Ctor, Ctor_Complete);
 
  586   else if (
const CXXDestructorDecl* Dtor = dyn_cast<CXXDestructorDecl>(D))
 
  587     GD = GlobalDecl(Dtor, Dtor_Deleting);
 
  591   cling::utils::Analyze::maybeMangleDeclName(GD, mangled_name);
 
  600   TTHREAD_TLS_DECL( std::string, buf );
 
  608   if (
const clang::TypeDecl *td = llvm::dyn_cast<clang::TypeDecl>(
GetDecl()->getDeclContext())) {
 
  610      clang::QualType qualType(td->getTypeForDecl(),0);
 
  614   } 
else if (
const clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(FD->getDeclContext())) {
 
  616      clang::PrintingPolicy policy(FD->getASTContext().getPrintingPolicy());
 
  617      llvm::raw_string_ostream stream(
name);
 
  618      nd->getNameForDiagnostic(stream, policy, 
true);
 
  629   if (
const clang::CXXMethodDecl *md =
 
  630       llvm::dyn_cast<clang::CXXMethodDecl>(FD)) {
 
  631      if (md->getMethodQualifiers().hasConst()) {
 
  678   cling::Interpreter::PushTransactionRAII RAII(
fInterp);
 
  679   if (
const FunctionDecl *AnnotFD
 
  681      if (AnnotateAttr *A = AnnotFD->getAttr<AnnotateAttr>()) {
 
  682         fTitle = A->getAnnotation().str();
 
  686   if (!FD->isFromASTFile()) {
 
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
 
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
 
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
 
R__EXTERN TInterpreter * gCling
 
#define R__LOCKGUARD(mutex)
 
Iterate over FunctionDecl and UsingShadowDecls of FunctionDecl, within a scope, recursing through "tr...
 
bool IsValid() const final
 
const clang::Decl * InstantiateTemplateWithDefaults(const clang::RedeclarableTemplateDecl *TD) const final
 
bool ShouldSkip(const clang::Decl *FD) const final
 
Emulation of the CINT CallFunc class.
 
void SetFunc(const TClingClassInfo *info, const char *method, const char *arglist, Longptr_t *poffset)
 
Emulation of the CINT ClassInfo class.
 
const clang::Decl * fDecl
 
virtual const char * Name() const
 
virtual bool IsValid() const
 
long Property(long property, clang::QualType &qt) const
 
virtual const clang::Decl * GetDecl() const
 
bool Next()
Advance to next non-skipped; return false if no next decl exists.
 
cling::Interpreter * fInterp
 
cling::Interpreter * GetInterpreter() const
 
Emulation of the CINT MethodInfo class.
 
const char * DefaultValue() const
 
const TClingTypeInfo * Type() const
 
std::string GetMangledName() const
 
const char * TypeName() const
 
const clang::FunctionDecl * GetAsFunctionDecl() const
 
const char * Name() const override
 
const clang::UsingShadowDecl * GetAsUsingShadowDecl() const
 
const clang::FunctionDecl * GetTargetFunctionDecl() const
Get the FunctionDecl, or if this represents a UsingShadowDecl, the underlying target FunctionDecl.
 
const clang::Decl * GetDecl() const override
 
TClingCXXRecMethIter fIter
 
const char * GetPrototype()
 
void Init(const clang::FunctionDecl *)
 
long ExtraProperty() const
 
const clang::Decl * GetDeclSlow() const
 
void * InterfaceMethod() const
 
TClingMethodInfo(cling::Interpreter *interp)
 
void CreateSignature(TString &signature) const
 
TDictionary::DeclId_t GetDeclId() const
 
cling::Interpreter * fInterp
 
TClingTypeInfo * Type() const
 
Emulation of the CINT TypeInfo class.
 
const char * Name() const override
 
This class defines an interface to the cling C++ interpreter.