This patch adds a test case to the testsuite for PR119706. The bug was already fixed by https://gcc.gnu.org/pipermail/gcc-patches/2025-April/680573.html.
OK for mainline? Signed-off-by: Jennifer Schmitz <jschm...@nvidia.com> gcc/testsuite/ PR tree-optimization/119706 * g++.target/aarch64/sve/pr119706.C: New test. --- .../g++.target/aarch64/sve/pr119706.C | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 gcc/testsuite/g++.target/aarch64/sve/pr119706.C diff --git a/gcc/testsuite/g++.target/aarch64/sve/pr119706.C b/gcc/testsuite/g++.target/aarch64/sve/pr119706.C new file mode 100644 index 00000000000..443dc50e9d9 --- /dev/null +++ b/gcc/testsuite/g++.target/aarch64/sve/pr119706.C @@ -0,0 +1,178 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mcpu=neoverse-v2 --param=aarch64-autovec-preference=sve-only -w" } */ + +namespace a { +typedef long unsigned b; +typedef int c; +template <bool, typename d> struct e { using f = d; }; +template <bool g, typename d = void> using h = typename e<g, d>::f; +template <typename aa, typename, template <typename> class> struct i { + using f = aa; +}; +template <typename aa, template <typename> class j> using k = i<aa, void, j>; +template <typename aa, template <typename> class j> +using l = typename k<aa, j>::f; +} // namespace a +inline void *operator new(a::b, void *ab) { return ab; } +namespace a { +template <typename> class ac { +public: + typedef b m; + template <typename ad, typename... n> void ae(ad *ab, n... w) { + new (ab) ad(w...); + } +}; +template <typename d> using x = ac<d>; +template <typename d> class af : public x<d> { +public: + typedef d o; + template <typename> struct ag { typedef af ah; }; +}; +struct ai {}; +struct aj : ai {}; +struct ak : aj {}; +template <typename> struct al; +template <typename d> struct al<d *> { + typedef ak an; + typedef c ao; + typedef d ap; +}; +template <typename aq> typename aq ::an ar(aq) { return typename aq ::an(); } +template <typename as> typename as ::ao at(as au, as av, ak) { return av - au; } +template <typename aw> typename aw ::ao ax(aw au, aw av) { + return at(au, av, ar(au)); +} +template <typename> struct ay { typedef c ao; }; +} // namespace a +namespace az { +template <typename am, typename> class ba { + am bb; + typedef a::al<am> bc; + +public: + typedef typename bc::an an; + typedef typename bc::ao ao; + typedef typename bc::ap ap; + ba(am bd) : bb(bd) {} + ap operator*() { return *bb; } + ba operator++() { + ++bb; + return *this; + } + am base() { return bb; } +}; +template <typename be, typename bf, typename bg> +bool operator!=(ba<be, bg> bh, ba<bf, bg> p) { + return bh.base() != p.base(); +} +template <typename be, typename bf, typename bg> +auto operator-(ba<be, bg> bh, ba<bf, bg> p) { + return bh.base() - p.base(); +} +} // namespace az +namespace a { +struct bi { + template <typename d, typename> struct bj { + using f = typename d::ag<d>::ah; + }; + template <typename> using bk = b; + template <typename...> static constexpr bool bl = false; + template <typename, typename> static constexpr bool bm = bl<>; + template <typename d, typename... n> static constexpr bool bn = bm<d, n...>; +}; +template <typename bo, typename ad> using bp = typename bi::bj<bo, ad>::f; +template <typename bo> struct bq : bi { + typedef typename bo::o o; + using br = l<o *, bk>; + template <typename, typename bs> struct bt { using f = typename ay<bs>::ao; }; + template <typename bu, typename> struct bv { using f = typename bu::m; }; + using ao = typename bt<bo, c>::f; + using m = typename bv<bo, ao>::f; + template <typename d> using bw = bp<bo, d>; + static br allocate(bo, m); + template <typename d, typename... n> + static h<bn<bo, d>> ae(bo ci, d ab, n... w) { + ci.ae(ab, w...); + } +}; +template <typename d> struct bx { + static bool by(d &bz) try { d(bz.begin(), bz.ca(), bz.cb()); } catch (...) { + } +}; +} // namespace a +namespace az { +template <typename bo> struct cc : a::bq<bo> { + typedef a::bq<bo> q; + template <typename d> struct ag { typedef typename q::bw<d> ah; }; +}; +} // namespace az +enum cd {}; +using ce = double; +namespace a { +template <typename aw, typename cf, typename cg, typename ch> +cg cj(aw au, cf av, cg ck, ch cl) { + typedef az::cc<ch> cx; + for (; au != av; ++au, ++ck) + cx::ae(cl, ck, *au); +} +template <typename d, typename bo> struct cm { + typedef typename az::cc<bo>::ag<d>::ah cn; + typedef typename az::cc<cn>::br br; + struct co { + br db; + br cp; + }; + struct cq : cn, co { + cq(cn) {} + } typedef cr; + cn cs(); + cr cb() noexcept; + cm(cr ci) : ct(ci) {} + cq ct; + br cu(b cv) { + typedef az::cc<cn> cw; + return cv ? cw::allocate(ct, cv) : c(); + } +}; +template <typename d, typename bo = af<d>> class cy : cm<d, bo> { + typedef cm<d, bo> cz; + +public: + typedef typename cz::br br; + typedef az::ba<br, cy> da; + typedef b m; + typedef bo cr; + cz::cs; + template <typename aw> cy(aw au, aw av, cr ci) : cz(ci) { + dg(au, av, ar(au)); + } + cz::cb; + da begin() { return this->ct.db; } + da ca() { return this->ct.cp; } + void r() { s(); } + void clear() { t(this->ct.db); } + template <typename cg> void dg(cg au, cg av, ai) { y(au, av, ax(au, av)); } + template <typename am, typename cf> void y(am au, cf av, m cv) { + br z = this->cu(dc(cv, cs())); + cj(au, av, z, cs()); + } + bool s(); + m dc(m cv, cr) { return cv; } + void t(br dd) { + if (this->ct.cp - dd) + this->ct.cp = dd; + } +}; +template <typename d, typename bo> bool cy<d, bo>::s() { bx<cy>::by(*this); } +namespace basic { +class u { + using de = ce; + void v(cd, b); + cy<de> df; +}; +void u::v(cd, b) { + df.clear(); + df.r(); +} +} // namespace basic +} // namespace a \ No newline at end of file -- 2.34.1
smime.p7s
Description: S/MIME cryptographic signature