[Bug c++/85461] New: A simple recursive TMP static const initializer defeats gcc
zhonghao at pku dot org.cn
gcc-bugzilla@gcc.gnu.org
Thu Apr 19 02:12:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85461
Bug ID: 85461
Summary: A simple recursive TMP static const initializer
defeats gcc
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: zhonghao at pku dot org.cn
Target Milestone: ---
The test case is as follow:
template<unsigned int v>
class bitWidthHolding {
public:
/** width is the number of bits occupied by the template parameter v
*/
static const
unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width + 1);
};
clang++ compiles the code, but gcc produces errors:
../1Testprogramtoillustratetheproblembuiltwithclang-ctestit.cpp: In
instantiation of ‘const unsigned int bitWidthHolding<0>::width’:
../1Testprogramtoillustratetheproblembuiltwithclang-ctestit.cpp:7:73:
recursively required from ‘const unsigned int bitWidthHolding<127>::width’
../1Testprogramtoillustratetheproblembuiltwithclang-ctestit.cpp:7:73:
required from ‘const unsigned int bitWidthHolding<255>::width’
../1Testprogramtoillustratetheproblembuiltwithclang-ctestit.cpp:10:46:
required from here
../1Testprogramtoillustratetheproblembuiltwithclang-ctestit.cpp:7:73: fatal
error: template instantiation depth exceeds maximum of 900 (use
-ftemplate-depth= to increase the maximum)
unsigned int width = (v == 0 ? 0 : bitWidthHolding<(v >> 1)>::width +
1);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
A bug report from clang (https://bugs.llvm.org/show_bug.cgi?id=9999) explains
some details.
More information about the Gcc-bugs
mailing list