| /* { dg-do compile { target { aarch64-*-* } } } */ |
| /* { dg-skip-if "incorrect syntax for c++98" { *-*-* } { "-std=c++98" } { "" } } */ |
| /* { dg-additional-options "-w -O3 -march=armv8.3-a -fdump-tree-vect-all" } */ |
| /* { dg-require-effective-target le } */ |
| |
| typedef struct { |
| float b; |
| float c; |
| } d; |
| namespace { |
| typedef int e; |
| template <typename, typename> struct f; |
| template <template <typename> class g, typename h, typename k, typename... l> |
| struct f<g<k, l...>, h> { |
| using m = g<h>; |
| }; |
| } // namespace |
| namespace aa { |
| template <typename k> class o { |
| public: |
| typedef k p; |
| }; |
| } // namespace aa |
| namespace ab { |
| template <typename k> using r = aa::o<k>; |
| template <typename k> class ac : public r<k> {}; |
| struct s { |
| template <typename k, typename h> struct ad : f<k, h> {}; |
| }; |
| template <typename t, typename h> using ae = typename s::ad<t, h>::m; |
| template <typename t> struct af { |
| typedef typename t::p p; |
| template <typename k> using u = ae<t, k>; |
| }; |
| } // namespace ab |
| namespace aa { |
| template <typename t> struct ag { |
| typedef ab::af<t> v; |
| typedef typename v::p &ah; |
| template <typename k> struct ai { typedef typename v::u<k> aj; }; |
| }; |
| } // namespace aa |
| namespace ab { |
| template <typename k, typename t> struct w { |
| typedef typename aa::ag<t>::ai<k>::aj x; |
| struct y {}; |
| typedef t ak; |
| w(e, ak); |
| y a; |
| }; |
| template <typename k, typename t = ac<k>> class al : w<k, t> { |
| typedef w<k, t> am; |
| typedef typename am::x x; |
| typedef aa::ag<x> an; |
| |
| public: |
| typedef typename an::ah ah; |
| typedef e ao; |
| typedef t ak; |
| al(ao ap, ak aq = ak()) : am(ar(ap, aq), aq) {} |
| ah operator[](ao); |
| ao ar(ao ap, ak) { return ap; } |
| }; |
| } // namespace ab |
| void as(int n, d *a, d *q) { |
| ab::al<d> z(n); |
| d acc; |
| for (int j = 0; j < n; ++j) { |
| auto at = a[j]; |
| auto au = q[j]; |
| acc.b += at.b * au.b - at.c * au.c; |
| acc.c += at.b * au.c + at.c * au.b; |
| } |
| z[0] = acc; |
| } |
| |
| |
| /* { dg-final { scan-tree-dump-times "stmt.*COMPLEX_MUL" 1 "vect" } } */ |