/* Copyright 2019-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <string.h>

/* Vector type will align on a 16-byte boundary.  */
typedef int v4si __attribute__ ((vector_size (16)));

struct ss
{
  static v4si static_field;

  unsigned char aa;

  bool operator== (const ss &rhs)
  {
    return (memcmp (&this->static_field, &rhs.static_field,
		    sizeof (this->static_field)) == 0
            && this->aa == rhs.aa);
  }
};

v4si ss::static_field = { 1, 2, 3, 4 };

ss ref_val = { 'a' };

bool
check_val (ss v1, ss v2, ss v3, ss v4, ss v5, ss v6, ss v7, ss v8,
           ss v9, ss v10, ss v11, ss v12, ss v13, ss v14, ss v15,
           ss v16, ss v17, ss v18, ss v19, ss v20, ss v21, ss v22,
           ss v23, ss v24, ss v25, ss v26, ss v27, ss v28, ss v29,
           ss v30, ss v31, ss v32, ss v33, ss v34, ss v35, ss v36,
           ss v37, ss v38, ss v39, ss v40)
{
  return (v1 == ref_val && v2 == ref_val && v3 == ref_val && v4 == ref_val
          && v5 == ref_val && v6 == ref_val && v7 == ref_val
          && v8 == ref_val && v9 == ref_val && v10 == ref_val
          && v11 == ref_val && v12 == ref_val && v13 == ref_val
          && v14 == ref_val && v15 == ref_val && v16 == ref_val
          && v17 == ref_val && v18 == ref_val && v19 == ref_val
          && v20 == ref_val && v21 == ref_val && v22 == ref_val
          && v23 == ref_val && v24 == ref_val && v25 == ref_val
          && v26 == ref_val && v27 == ref_val && v28 == ref_val
          && v29 == ref_val && v30 == ref_val && v31 == ref_val
          && v32 == ref_val && v33 == ref_val && v34 == ref_val
          && v35 == ref_val && v36 == ref_val && v37 == ref_val
          && v38 == ref_val && v39 == ref_val && v40 == ref_val);
}

int
main ()
{
  bool flag = check_val (ref_val, ref_val, ref_val, ref_val, ref_val,
			 ref_val, ref_val, ref_val, ref_val, ref_val,
			 ref_val, ref_val, ref_val, ref_val, ref_val,
			 ref_val, ref_val, ref_val, ref_val, ref_val,
			 ref_val, ref_val, ref_val, ref_val, ref_val,
			 ref_val, ref_val, ref_val, ref_val, ref_val,
			 ref_val, ref_val, ref_val, ref_val, ref_val,
			 ref_val, ref_val, ref_val, ref_val, ref_val);
  return (flag ? 0 : 1);	/* break-here */
}
