--- /dev/null
+/* { 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" } } */