33
33
#include " clang/Basic/Specifiers.h"
34
34
#include " clang/Basic/Version.h"
35
35
#include " clang/Frontend/CompilerInstance.h"
36
+ #include " clang/Interpreter/Interpreter.h"
36
37
#include " clang/Sema/Lookup.h"
37
38
#include " clang/Sema/Overload.h"
38
39
#include " clang/Sema/Ownership.h"
@@ -222,6 +223,16 @@ void EnableDebugOutput(bool value /* =true*/) { llvm::DebugFlag = value; }
222
223
223
224
bool IsDebugOutputEnabled () { return llvm::DebugFlag; }
224
225
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
+ (void )Cpp::Interpreter::CompilationResult ();
233
+ }
234
+ }
235
+
225
236
bool IsAggregate (TCppScope_t scope) {
226
237
Decl* D = static_cast <Decl*>(scope);
227
238
@@ -923,11 +934,7 @@ TCppType_t GetFunctionReturnType(TCppFunction_t func) {
923
934
}
924
935
925
936
if (needInstantiation) {
926
- #ifdef CPPINTEROP_USE_CLING
927
- cling::Interpreter::PushTransactionRAII RAII (&getInterp ());
928
- #endif
929
- getSema ().InstantiateFunctionDefinition (SourceLocation (), FD, true ,
930
- true );
937
+ InstantiateFunctionDefinition (FD);
931
938
}
932
939
Type = FD->getReturnType ();
933
940
}
@@ -2482,23 +2489,7 @@ int get_wrapper_code(compat::Interpreter& I, const FunctionDecl* FD,
2482
2489
}
2483
2490
if (needInstantiation) {
2484
2491
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
2492
+ InstantiateFunctionDefinition (FDmod);
2502
2493
2503
2494
if (!FD->isDefined (Definition)) {
2504
2495
llvm::errs () << " TClingCallFunc::make_wrapper"
@@ -3304,7 +3295,8 @@ std::string ObjToString(const char* type, void* obj) {
3304
3295
}
3305
3296
3306
3297
static Decl* InstantiateTemplate (TemplateDecl* TemplateD,
3307
- TemplateArgumentListInfo& TLI, Sema& S) {
3298
+ TemplateArgumentListInfo& TLI, Sema& S,
3299
+ bool instantiate_body) {
3308
3300
// This is not right but we don't have a lot of options to choose from as a
3309
3301
// template instantiation requires a valid source location.
3310
3302
SourceLocation fakeLoc = GetValidSLoc (S);
@@ -3318,6 +3310,8 @@ static Decl* InstantiateTemplate(TemplateDecl* TemplateD,
3318
3310
// FIXME: Diagnose what happened.
3319
3311
(void )Result;
3320
3312
}
3313
+ if (instantiate_body)
3314
+ InstantiateFunctionDefinition (Specialization);
3321
3315
return Specialization;
3322
3316
}
3323
3317
@@ -3349,19 +3343,21 @@ static Decl* InstantiateTemplate(TemplateDecl* TemplateD,
3349
3343
}
3350
3344
3351
3345
Decl* InstantiateTemplate (TemplateDecl* TemplateD,
3352
- ArrayRef<TemplateArgument> TemplateArgs, Sema& S) {
3346
+ ArrayRef<TemplateArgument> TemplateArgs, Sema& S,
3347
+ bool instantiate_body) {
3353
3348
// Create a list of template arguments.
3354
3349
TemplateArgumentListInfo TLI{};
3355
3350
for (auto TA : TemplateArgs)
3356
3351
TLI.addArgument (
3357
3352
S.getTrivialTemplateArgumentLoc (TA, QualType (), SourceLocation ()));
3358
3353
3359
- return InstantiateTemplate (TemplateD, TLI, S);
3354
+ return InstantiateTemplate (TemplateD, TLI, S, instantiate_body );
3360
3355
}
3361
3356
3362
3357
TCppScope_t InstantiateTemplate (compat::Interpreter& I, TCppScope_t tmpl,
3363
3358
const TemplateArgInfo* template_args,
3364
- size_t template_args_size) {
3359
+ size_t template_args_size,
3360
+ bool instantiate_body) {
3365
3361
auto & S = I.getSema ();
3366
3362
auto & C = S.getASTContext ();
3367
3363
@@ -3386,14 +3382,15 @@ TCppScope_t InstantiateTemplate(compat::Interpreter& I, TCppScope_t tmpl,
3386
3382
#ifdef CPPINTEROP_USE_CLING
3387
3383
cling::Interpreter::PushTransactionRAII RAII (&I);
3388
3384
#endif
3389
- return InstantiateTemplate (TmplD, TemplateArgs, S);
3385
+ return InstantiateTemplate (TmplD, TemplateArgs, S, instantiate_body );
3390
3386
}
3391
3387
3392
3388
TCppScope_t InstantiateTemplate (TCppScope_t tmpl,
3393
3389
const TemplateArgInfo* template_args,
3394
- size_t template_args_size) {
3390
+ size_t template_args_size,
3391
+ bool instantiate_body) {
3395
3392
return InstantiateTemplate (getInterp (), tmpl, template_args,
3396
- template_args_size);
3393
+ template_args_size, instantiate_body );
3397
3394
}
3398
3395
3399
3396
void GetClassTemplateInstantiationArgs (TCppScope_t templ_instance,
0 commit comments