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);
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::CXXSpecialMemberKind::DefaultConstructor && CXXMD->getNumParams() == 0) ||
112 ((SpecMemKind == clang::CXXSpecialMemberKind::CopyConstructor || SpecMemKind == clang::CXXSpecialMemberKind::MoveConstructor) &&
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().getArgument());
176 }
else if (
auto NTTP = dyn_cast<NonTypeTemplateParmDecl>(templateParm)) {
177 if (!NTTP->hasDefaultArgument())
179 defaultTemplateArgs.emplace_back(NTTP->getDefaultArgument().getArgument());
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 auto *FTD =
const_cast<clang::FunctionTemplateDecl *
>(llvm::dyn_cast<clang::FunctionTemplateDecl>(TD));
201 Sema::InstantiatingTemplate Inst(
202 S,
Info.getLocation(), FTD,
203 defaultTemplateArgs, Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution,
Info);
207 MultiLevelTemplateArgumentList MLTAL{FTD, defaultTemplateArgs,
false};
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());
245 clang::Decl *D =
const_cast<clang::Decl *
>(ci->
GetDecl());
246 auto *DC = llvm::dyn_cast<clang::DeclContext>(D);
248 llvm::SmallVector<clang::CXXMethodDecl*, 8> SpecFuncs;
250 if (
auto *CXXRD = llvm::dyn_cast<CXXRecordDecl>(DC)) {
255 cling::Interpreter::PushTransactionRAII RAII(interp);
257 auto &SemaRef = interp->getSema();
258 SemaRef.ForceDeclarationOfImplicitMembers(CXXRD);
262 for (clang::NamedDecl *ctor : SemaRef.LookupConstructors(CXXRD)) {
264 if (
auto *CXXCD = llvm::dyn_cast<clang::CXXConstructorDecl>(ctor))
265 SpecFuncs.emplace_back(CXXCD);
267 SpecFuncs.emplace_back(SemaRef.LookupCopyingAssignment(CXXRD, 0,
false, 0 ));
268 SpecFuncs.emplace_back(SemaRef.LookupMovingAssignment(CXXRD, 0,
false, 0 ));
269 SpecFuncs.emplace_back(SemaRef.LookupDestructor(CXXRD));
447 const Decl *declAccess =
GetDecl();
448 if (llvm::isa<UsingShadowDecl>(declAccess))
453 clang::AccessSpecifier Access = clang::AS_public;
454 if (!declAccess->getDeclContext()->isNamespace())
455 Access = declAccess->getAccess();
459 if ((property &
kIsUsing) && llvm::isa<CXXConstructorDecl>(fd)) {
460 Access = clang::AS_public;
461 clang::CXXRecordDecl *typeCXXRD = llvm::cast<RecordType>(
Type()->GetQualType())->getAsCXXRecordDecl();
462 clang::CXXBasePaths basePaths;
463 if (typeCXXRD->isDerivedFrom(llvm::dyn_cast<CXXRecordDecl>(fd->getDeclContext()), basePaths)) {
467 for (
auto el: basePaths) {
468 if (el.Access > Access)
472 Error(
"Property()",
"UsingDecl of ctor not shadowing a base ctor!");
476 if (fd->getAccess() > Access)
477 Access = fd->getAccess();
480 case clang::AS_public:
483 case clang::AS_protected:
486 case clang::AS_private:
490 if (declAccess->getDeclContext()->isNamespace())
495 assert(
false &&
"Unexpected value for the access property value in Clang");
504 if (fd->isConstexpr())
506 if (fd->getStorageClass() == clang::SC_Static) {
509 clang::QualType qt = fd->getReturnType().getCanonicalType();
513 if (
const clang::CXXMethodDecl *md =
514 llvm::dyn_cast<clang::CXXMethodDecl>(fd)) {
515 if (md->getMethodQualifiers().hasConst()) {
518 if (md->isVirtual()) {
521 if (md->isPureVirtual()) {
524 if (
const clang::CXXConstructorDecl *cd =
525 llvm::dyn_cast<clang::CXXConstructorDecl>(md)) {
526 if (cd->isExplicit()) {
530 else if (
const clang::CXXConversionDecl *cd =
531 llvm::dyn_cast<clang::CXXConversionDecl>(md)) {
532 if (cd->isExplicit()) {
598 std::string mangled_name;
599 mangled_name.clear();
604 cling::Interpreter::PushTransactionRAII RAII(
fInterp);
606 if (
const CXXConstructorDecl* Ctor = dyn_cast<CXXConstructorDecl>(D))
607 GD = GlobalDecl(Ctor, Ctor_Complete);
608 else if (
const CXXDestructorDecl* Dtor = dyn_cast<CXXDestructorDecl>(D))
609 GD = GlobalDecl(Dtor, Dtor_Deleting);
613 cling::utils::Analyze::maybeMangleDeclName(GD, mangled_name);
622 TTHREAD_TLS_DECL( std::string, buf );
633 if (
const clang::TypeDecl *td = llvm::dyn_cast<clang::TypeDecl>(
GetDecl()->getDeclContext())) {
635 clang::QualType qualType(td->getTypeForDecl(),0);
639 }
else if (
const clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(FD->getDeclContext())) {
641 clang::PrintingPolicy policy(FD->getASTContext().getPrintingPolicy());
642 llvm::raw_string_ostream stream(
name);
643 nd->getNameForDiagnostic(stream, policy,
true);
654 if (
const clang::CXXMethodDecl *md =
655 llvm::dyn_cast<clang::CXXMethodDecl>(FD)) {
656 if (md->getMethodQualifiers().hasConst()) {