================
@@ -1776,15 +1777,28 @@ bool CheckBitCast(InterpState &S, CodePtr OpPC, const
Type *TargetType,
return true;
}
-static void compileFunction(InterpState &S, const Function *Func) {
- const FunctionDecl *Definition;
- if (!Func->getDecl()->getBody(Definition))
- return;
- if (!Definition)
+static void compileFunction(InterpState &S, const Function *Func,
+ CodePtr OpPC) {
+ const FunctionDecl *Fn = Func->getDecl();
+
+ // [C++26] [temp.inst] p5
+ // [...] the function template specialization is implicitly instantiated
+ // when the specialization is referenced in a context that requires a
function
+ // definition to exist or if the existence of the definition affects the
+ // semantics of the program.
+ if (FunctionDefinitionCanBeLazilyInstantiated(Fn) && S.inConstantContext()) {
+ SemaProxy *SP = S.getSemaProxy();
+ if (!SP)
+ return;
+ SP->instantiateFunctionDefinition(S.Current->getLocation(OpPC),
+ const_cast<FunctionDecl *>(Fn));
+ }
+ Fn = Fn->getDefinition();
----------------
tbaederr wrote:
This code used `getDefinition()` before, but that wasn't enough:
2cc6b14b11010b8e537a5dfe627159ce96f5a690
https://github.com/llvm/llvm-project/pull/205557
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits