[Bug c++/105964] New: [12/13 Regression] Return type deduction fails during NTTP use of function dependent on template parameter
enolan at alumni dot cmu.edu
gcc-bugzilla@gcc.gnu.org
Mon Jun 13 22:53:25 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105964
Bug ID: 105964
Summary: [12/13 Regression] Return type deduction fails during
NTTP use of function dependent on template parameter
Product: gcc
Version: 12.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: enolan at alumni dot cmu.edu
Target Milestone: ---
Created attachment 53132
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53132&action=edit
Proof of concept that reproduces the bug
"It seems that, in a nested template expansion context, for SFINAE purposes,
when filling in default arguments, the compiler is declining to instantiate a
function which has a deduced return type. Because it declines to instantiate
that function, it can't wind up with a function to implicitly convert to a
pointer-to-function which is a valid NTTP."
However, as can be seen in the attached expanded POC, using an ampersand to
force taking the address of the function when using it as an NTTP causes it to
work again.
Godbolt link: https://godbolt.org/z/j8e6Y5Pq9
Minimal reproduction (godbolt link and attachment contain more context):
struct token {};
struct example {};
template< typename >
struct helper
{
static constexpr auto c() { return 42; }
};
struct impostor_c
{
template< typename T, auto= helper< T >::c >
static example func();
};
example c= impostor_c::func< token >();
> the exact version of gcc
gcc version 12.1.1 20220507 (Red Hat 12.1.1-1) (GCC)
> the system type
Fedora release 37 (rawhide)
> the options given when GCC was configured/built
Configured with: ../configure --enable-bootstrap
--enable-languages=c,c++,fortran,objc,obj-c++,ada,go,d,lto --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared
--enable-threads=posix --enable-checking=release --enable-multilib
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-gnu-unique-object --enable-linker-build-id
--with-gcc-major-version-only --enable-libstdcxx-backtrace
--with-linker-hash-style=gnu --enable-plugin --enable-initfini-array
--with-isl=/builddir/build/BUILD/gcc-12.1.1-20220507/obj-x86_64-redhat-linux/isl-install
--enable-offload-targets=nvptx-none --without-cuda-driver
--enable-offload-defaulted --enable-gnu-indirect-function --enable-cet
--with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
--with-build-config=bootstrap-lto --enable-link-serialization=1
> the complete command line that triggers the bug
g++ -std=c++17 poc.cpp
> the compiler output
poc.cpp:55:37: error: no matching function for call to
‘impostor_c::func<token>()’
55 | example c= impostor_c::func< token >();
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~
poc.cpp:28:20: note: candidate: ‘template<class T, auto <anonymous> > static
example impostor_c::func()’
28 | static example func();
| ^~~~
poc.cpp:28:20: note: template argument deduction/substitution failed:
More information about the Gcc-bugs
mailing list