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

Reply via email to