https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109175
--- Comment #5 from Mathieu Malaterre <malat at debian dot org> ---
c-reduce(d) ugly version:
% cat demo3.cc
struct d {
using b = float &;
};
template <typename> using c = d::b;
struct e {
using b = c<float>;
};
template <long, typename> struct j;
template <long f, typename g> using h = typename j<f, g>::b;
template <long, typename...> struct p;
template <typename k, typename... l> struct p<0, k, l...> { using b = k; };
template <typename...> class m;
template <typename n> struct aa {
aa(n t) : o(t) {}
static n ab(aa t) { return t.o; }
n o;
};
template <long, typename...> struct q;
template <long r, typename n, typename... s>
struct q<r, n, s...> : q<1, s...>, aa<n> {
q(n t, s... ac) : q<1, s...>(ac...), aa<n>(t) {}
};
template <long r, typename n> struct q<r, n> : aa<n> {
q(n t) : aa<n>(t) {}
};
template <typename ad, typename ae> class m<ad, ae> : public q<0, ad, ae> {
public:
m(ad t, ae ac) : q<0, ad, ae>(t, ac) {}
};
template <long f, typename... af> struct j<f, m<af...>> {
using b = typename p<f, af...>::b;
};
template <long f, typename n, typename... s> n ag(q<f, n, s...> t) {
return q<f, n>::ab(t);
}
template <int f, typename... ah> h<f, m<ah...>> ai(m<ah...> t) { return ag(t);
}
class u {
struct aj {
using b = float *;
};
public:
using ak = aj::b;
u(ak t, int) : al(t, long()) {}
ak w() { return ai<0>(al); }
m<ak, int> al;
};
struct x : u {
using u::u;
};
class y {
x al;
public:
using ak = u::ak;
using am = int;
template <typename an> y(an t, am ac) : al(t, ac) {}
e::b operator[](long t) { return z()[t]; }
ak z() { return al.w(); }
};
void *ao();
template <typename ap> ap *aq(long t) {
if (t)
return nullptr;
return static_cast<ap *>(ao());
}
template <typename> using ar = y;
template <typename ap> ar<ap> as(long t, void *) {
return ar<ap>(aq<ap>(t), int());
}
template <typename ap> ar<ap> as(long t) { return as<ap>(t, nullptr); }
float v;
void at(long t) {
long a = sizeof(0), i = 0;
auto b = as<float>(t);
for (; i < a; ++i)
b[i] = v;
for (; i < t; ++i)
b[i] = 0.0f;
}
% /usr/lib/gcc-snapshot/bin/g++ -Wall -O2 -o t.o -c demo3.cc
demo3.cc: In function 'void at(long int)':
demo3.cc:79:10: warning: 'void* __builtin_memset(void*, int, long unsigned
int)' writing 4 or more bytes into a region of size 0 overflows the destination
[-Wstringop-overflow=]
79 | b[i] = 0.0f;
cc1plus: note: destination object is likely at address zero