3333#include " clang/Basic/Specifiers.h"
3434#include " clang/Basic/Version.h"
3535#include " clang/Frontend/CompilerInstance.h"
36+ #include " clang/Interpreter/Interpreter.h"
3637#include " clang/Sema/Lookup.h"
3738#include " clang/Sema/Overload.h"
3839#include " clang/Sema/Ownership.h"
@@ -222,6 +223,15 @@ void EnableDebugOutput(bool value /* =true*/) { llvm::DebugFlag = value; }
222223
223224bool IsDebugOutputEnabled () { return llvm::DebugFlag; }
224225
226+ static void InstantiateFunctionDefinition (Decl* D) {
227+ compat::PushTransactionRAII RAII (&getInterp ());
228+ if (auto * FD = llvm::dyn_cast_or_null<FunctionDecl>(D)) {
229+ getSema ().InstantiateFunctionDefinition (SourceLocation (), FD,
230+ /* Recursive=*/ true ,
231+ /* DefinitionRequired=*/ true );
232+ }
233+ }
234+
225235bool IsAggregate (TCppScope_t scope) {
226236 Decl* D = static_cast <Decl*>(scope);
227237
@@ -923,11 +933,7 @@ TCppType_t GetFunctionReturnType(TCppFunction_t func) {
923933 }
924934
925935 if (needInstantiation) {
926- #ifdef CPPINTEROP_USE_CLING
927- cling::Interpreter::PushTransactionRAII RAII (&getInterp ());
928- #endif
929- getSema ().InstantiateFunctionDefinition (SourceLocation (), FD, true ,
930- true );
936+ InstantiateFunctionDefinition (FD);
931937 }
932938 Type = FD->getReturnType ();
933939 }
@@ -2482,23 +2488,7 @@ int get_wrapper_code(compat::Interpreter& I, const FunctionDecl* FD,
24822488 }
24832489 if (needInstantiation) {
24842490 clang::FunctionDecl* FDmod = const_cast <clang::FunctionDecl*>(FD);
2485- clang::Sema& S = I.getCI ()->getSema ();
2486- // Could trigger deserialization of decls.
2487- #ifdef CPPINTEROP_USE_CLING
2488- cling::Interpreter::PushTransactionRAII RAII (&I);
2489- #endif
2490- S.InstantiateFunctionDefinition (SourceLocation (), FDmod,
2491- /* Recursive=*/ true ,
2492- /* DefinitionRequired=*/ true );
2493- #ifndef CPPINTEROP_USE_CLING
2494- // TODO: Will need to replace this with a RAII for clang-repl too
2495- auto GeneratedPTU = I.Parse (" " );
2496- if (!GeneratedPTU)
2497- llvm::logAllUnhandledErrors (
2498- GeneratedPTU.takeError (), llvm::errs (),
2499- " [MakeFunctionCallable -> InstantiateFunctionDefinition] Failed to "
2500- " generate PTU:" );
2501- #endif
2491+ InstantiateFunctionDefinition (FDmod);
25022492
25032493 if (!FD->isDefined (Definition)) {
25042494 llvm::errs () << " TClingCallFunc::make_wrapper"
@@ -3304,7 +3294,8 @@ std::string ObjToString(const char* type, void* obj) {
33043294}
33053295
33063296static Decl* InstantiateTemplate (TemplateDecl* TemplateD,
3307- TemplateArgumentListInfo& TLI, Sema& S) {
3297+ TemplateArgumentListInfo& TLI, Sema& S,
3298+ bool instantiate_body) {
33083299 // This is not right but we don't have a lot of options to choose from as a
33093300 // template instantiation requires a valid source location.
33103301 SourceLocation fakeLoc = GetValidSLoc (S);
@@ -3318,6 +3309,8 @@ static Decl* InstantiateTemplate(TemplateDecl* TemplateD,
33183309 // FIXME: Diagnose what happened.
33193310 (void )Result;
33203311 }
3312+ if (instantiate_body)
3313+ InstantiateFunctionDefinition (Specialization);
33213314 return Specialization;
33223315 }
33233316
@@ -3349,19 +3342,21 @@ static Decl* InstantiateTemplate(TemplateDecl* TemplateD,
33493342}
33503343
33513344Decl* InstantiateTemplate (TemplateDecl* TemplateD,
3352- ArrayRef<TemplateArgument> TemplateArgs, Sema& S) {
3345+ ArrayRef<TemplateArgument> TemplateArgs, Sema& S,
3346+ bool instantiate_body) {
33533347 // Create a list of template arguments.
33543348 TemplateArgumentListInfo TLI{};
33553349 for (auto TA : TemplateArgs)
33563350 TLI.addArgument (
33573351 S.getTrivialTemplateArgumentLoc (TA, QualType (), SourceLocation ()));
33583352
3359- return InstantiateTemplate (TemplateD, TLI, S);
3353+ return InstantiateTemplate (TemplateD, TLI, S, instantiate_body );
33603354}
33613355
33623356TCppScope_t InstantiateTemplate (compat::Interpreter& I, TCppScope_t tmpl,
33633357 const TemplateArgInfo* template_args,
3364- size_t template_args_size) {
3358+ size_t template_args_size,
3359+ bool instantiate_body) {
33653360 auto & S = I.getSema ();
33663361 auto & C = S.getASTContext ();
33673362
@@ -3386,14 +3381,15 @@ TCppScope_t InstantiateTemplate(compat::Interpreter& I, TCppScope_t tmpl,
33863381#ifdef CPPINTEROP_USE_CLING
33873382 cling::Interpreter::PushTransactionRAII RAII (&I);
33883383#endif
3389- return InstantiateTemplate (TmplD, TemplateArgs, S);
3384+ return InstantiateTemplate (TmplD, TemplateArgs, S, instantiate_body );
33903385}
33913386
33923387TCppScope_t InstantiateTemplate (TCppScope_t tmpl,
33933388 const TemplateArgInfo* template_args,
3394- size_t template_args_size) {
3389+ size_t template_args_size,
3390+ bool instantiate_body) {
33953391 return InstantiateTemplate (getInterp (), tmpl, template_args,
3396- template_args_size);
3392+ template_args_size, instantiate_body );
33973393}
33983394
33993395void GetClassTemplateInstantiationArgs (TCppScope_t templ_instance,
0 commit comments