https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69958
Bug ID: 69958
Summary: sizeof... computes wrong size
Product: gcc
Version: 5.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: CoachHagins at gmail dot com
Target Milestone: ---
When sizeof...() is used in a wrapped context, it computes the incorrect size.
This is evident when using std::index_sequence_for, but I think it's a language
problem and not a library problem because I can reproduce the same mal-behavior
without involving the standard library.
I get the same behavior in 5.2 and 5.3; -std=c++14
See the following code example.
template <typename...Ts>
struct list { };
template <std::size_t N>
struct size { };
template <typename...Ts>
using size_for = size<sizeof...(Ts)>;
template <typename T, typename...Ts>
using plain = size_for<T, Ts...>;
// This assertion passes
static_assert(std::is_same<
size<5>,
plain<float, int, double, char, unsigned>>::value, "");
template <typename T, typename...Ts>
using plain2 = size_for<Ts..., T>;
// This assertion passes
static_assert(std::is_same<
size<5>,
plain2<float, int, double, char, unsigned>>::value, "");
template <typename T, typename...Ts>
using wrapped = list<T, size_for<T, Ts...>>;
// This assertion fails (produces size<4>)
static_assert(std::is_same<
list<float, size<5>>,
wrapped<float, int, double, char, unsigned>>::value, "");
template <typename T, typename...Ts>
using wrapped2 = list<T, size_for<Ts..., T>>;
// This assertion fails (produces size<2>)
static_assert(std::is_same<
list<float, size<5>>,
wrapped2<float, int, double, char, unsigned>>::value, "");