https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85470
Bug ID: 85470
Summary: Strange error about "call to non-constexpr function"
Product: gcc
Version: 7.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: officesamurai at gmail dot com
Target Milestone: ---
GCC 7 fails to compile the following code:
---- test.cpp ----
template <class T>
struct StaticObject
{
static T& create()
{
static T t;
return t;
}
static T & instance;
};
template <class T> T & StaticObject<T>::instance = StaticObject<T>::create();
extern template class StaticObject<int>;
void test()
{
StaticObject<int>::instance;
}
---- command line -----
$ g++-7.3.0 -v
Using built-in specs.
COLLECT_GCC=g++-7.3.0
COLLECT_LTO_WRAPPER=/home/brd/soft/gcc-7.3.0/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ./configure --prefix=/home/brd/soft/gcc-7.3.0
Thread model: posix
gcc version 7.3.0 (GCC)
$ g++-7.3.0 -c test.cpp
test.cpp: In instantiation of ‘int& StaticObject<int>::instance’:
test.cpp:19:24: required from here
test.cpp:13:75: error: call to non-constexpr function ‘static T&
StaticObject<T>::create() [with T = int]’
template <class T> T & StaticObject<T>::instance = StaticObject<T>::create();
P.S. I also tried 7.1 (same error) and 6.3 (no error)