/* This testcase is part of GDB, the GNU debugger.

   Copyright 2010-2012 Free Software Foundation, Inc.

   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/>.

   Contributed by Ken Werner <ken.werner@de.ibm.com>  */

typedef int __attribute__ ((vector_size (4 * sizeof(int)))) int4;
typedef unsigned int __attribute__ ((vector_size (4 * sizeof(unsigned int)))) uint4;
typedef char __attribute__ ((vector_size (4 * sizeof(char)))) char4;
typedef float __attribute__ ((vector_size (4 * sizeof(float)))) float4;

typedef int __attribute__ ((vector_size (2 * sizeof(int)))) int2;
typedef long long __attribute__ ((vector_size (2 * sizeof(long long)))) longlong2;
typedef float __attribute__ ((vector_size (2 * sizeof(float)))) float2;
typedef double __attribute__ ((vector_size (2 * sizeof(double)))) double2;

int ia = 2;
int ib = 1;
float fa = 2;
float fb = 1;
char4 c4 = {1, 2, 3, 4};
int4 i4a = {2, 4, 8, 16};
int4 i4b = {1, 2, 8, 4};
float4 f4a = {2, 4, 8, 16};
float4 f4b = {1, 2, 8, 4};
uint4 ui4 = {2, 4, 8, 16};
int2 i2 = {1, 2};
longlong2 ll2 = {1, 2};
float2 f2 = {1, 2};
double2 d2 = {1, 2};

int
main ()
{
  return 0;
}
