[Bug c++/69009] [5/6 Regression] ICE in instantiate_decl, at cp/pt.c:21511
webrown.cpp at gmail dot com
gcc-bugzilla@gcc.gnu.org
Tue Jan 26 20:58:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69009
--- Comment #5 from W E Brown <webrown.cpp at gmail dot com> ---
I have encountered this issue several more times since my original report, and
am writing to report a pattern I recently noticed among cases that ICE vs
similar cases that compile correctly. (I'm now using MacPorts gcc6
6-20160110_0.)
The following two representative code samples are similar in structure.
However, the first (is_floating_point_v<>) does compile for me, while the
second (is_pointer_v<>) gives the reported ICE "in instantiate_decl, at
cp/pt.c:21511":
template< typename T >
constexpr bool
is_unqual_floating_point_v = false;
//
template< >
constexpr bool
is_unqual_floating_point_v<float> = true;
//
template< >
constexpr bool
is_unqual_floating_point_v<double> = true;
//
template< >
constexpr bool
is_unqual_floating_point_v<_ldbl> = true;
template< typename T >
constexpr bool
is_floating_point_v = is_unqual_floating_point_v< ::_tt::remove_cv_t<T> >;
// ----------
template< typename T >
constexpr bool
is_unqual_pointer_v = false;
//
template< typename U >
constexpr bool
is_unqual_pointer_v<U*> = true;
template< typename T >
constexpr bool
is_pointer_v = is_unqual_pointer_v< ::_tt::remove_cv_t<T> >;
^
Note that in one case, the is_unqual*<> helper employs complete specialization,
while the helper in the other case uses partial specialization.
I have found this observation to be a reliable discriminator between cases that
compile for me and those that ICE as reported; I hope it may be useful in
analyzing and resolving the issue.
More information about the Gcc-bugs
mailing list