shafik added a comment.
During the parsing of the assignment in `main` for the `constexpr` case we end
up in `Sema::MarkFunctionReferenced` in particular this code:
else if (Func->isConstexpr())
// Do not defer instantiations of constexpr functions, to avoid the
// expression evaluator needing to call back into Sema if it sees a
// call to such a function.
InstantiateFunctionDefinition(PointOfInstantiation, Func);
And so I experimented with modifying `Sema::InstantiateFunctionDefinition` in
particular:
else if (TSK == TSK_ExplicitInstantiationDefinition) {
And modified in this way:
else if (TSK == TSK_ExplicitInstantiationDefinition ||
(Function->isConstexpr() && !Recursive)) {
This seems more targeted, reflects what I think is the intent and passes
`check-clang` as well.
I also looked at the non-constexpr case:
template <typename T>
T foo(T a);
int main() {
int k = foo<int>(5);
}
template <typename T>
T foo(T a) {
return a;
}
And in this case we hit `Sema::InstantiateFunctionDefinition` from
`Sema::PerformPendingInstantiations` which is called by
`Sema::ActOnEndOfTranslationUnitFragment` and so by this time we have seen the
definition already.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D128119/new/
https://reviews.llvm.org/D128119
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits