c++: consteval and explicit instantiation [PR96905]
Normally, an explicit instantiation means we want to write out the instantiation. But not for a consteval function. gcc/cp/ChangeLog: PR c++/96905 * pt.c (mark_decl_instantiated): Exit early if consteval. gcc/testsuite/ChangeLog: PR c++/96905 * g++.dg/cpp2a/consteval-expinst1.C: New test.
This commit is contained in:
parent
bdbca69e07
commit
57d705da0b
2 changed files with 25 additions and 0 deletions
|
@ -24154,6 +24154,11 @@ mark_decl_instantiated (tree result, int extern_p)
|
|||
if (TREE_ASM_WRITTEN (result))
|
||||
return;
|
||||
|
||||
/* consteval functions are never emitted. */
|
||||
if (TREE_CODE (result) == FUNCTION_DECL
|
||||
&& DECL_IMMEDIATE_FUNCTION_P (result))
|
||||
return;
|
||||
|
||||
/* For anonymous namespace we don't need to do anything. */
|
||||
if (decl_anon_ns_mem_p (result))
|
||||
{
|
||||
|
|
20
gcc/testsuite/g++.dg/cpp2a/consteval-expinst1.C
Normal file
20
gcc/testsuite/g++.dg/cpp2a/consteval-expinst1.C
Normal file
|
@ -0,0 +1,20 @@
|
|||
// PR c++/96905
|
||||
// { dg-do compile { target c++20 } }
|
||||
|
||||
template<typename Rep>
|
||||
struct duration
|
||||
{
|
||||
static consteval int
|
||||
gcd(int m, int n) noexcept
|
||||
{
|
||||
while (m != 0 && n != 0)
|
||||
{
|
||||
int rem = m % n;
|
||||
m = n;
|
||||
n = rem;
|
||||
}
|
||||
return m + n;
|
||||
}
|
||||
};
|
||||
|
||||
template class duration<int>;
|
Loading…
Add table
Reference in a new issue