1  /* { dg-options "-msve-vector-bits=256" } */
       2  
       3  #include <arm_sve.h>
       4  
       5  typedef svint32_t vls_svint32_t __attribute__((arm_sve_vector_bits(256)));
       6  typedef svuint32_t vls_svuint32_t __attribute__((arm_sve_vector_bits(256)));
       7  
       8  typedef int32_t gnu_svint32_t __attribute__((vector_size(32)));
       9  typedef uint32_t gnu_svuint32_t __attribute__((vector_size(32)));
      10  
      11  #define X_gnu_svint32_t 1
      12  #define X_gnu_svuint32_t 2
      13  #define X_vls_svint32_t 3
      14  #define X_vls_svuint32_t 4
      15  
      16  #define CHECK(T) T: X_##T
      17  
      18  #define CHECK_TYPE(EXPR, TYPE) \
      19    do { \
      20      int x[_Generic (EXPR, \
      21  		    CHECK (gnu_svint32_t), \
      22  		    CHECK (gnu_svuint32_t), \
      23  		    CHECK (vls_svint32_t), \
      24  		    CHECK (vls_svuint32_t), \
      25  		    default : 0) == X_##TYPE ? 1 : -1]; \
      26    } while (0)
      27  
      28  void
      29  f (gnu_svint32_t sg, gnu_svuint32_t ug, vls_svint32_t sn, vls_svuint32_t un, int c)
      30  {
      31    CHECK_TYPE (sg, gnu_svint32_t);
      32    CHECK_TYPE (ug, gnu_svuint32_t);
      33    CHECK_TYPE (sn, vls_svint32_t);
      34    CHECK_TYPE (un, vls_svuint32_t);
      35  
      36    CHECK_TYPE (sg + 1, gnu_svint32_t);
      37    CHECK_TYPE (ug + 1, gnu_svuint32_t);
      38    CHECK_TYPE (sn + 1, vls_svint32_t);
      39    CHECK_TYPE (un + 1, vls_svuint32_t);
      40  
      41    CHECK_TYPE (1 + sg, gnu_svint32_t);
      42    CHECK_TYPE (1 + ug, gnu_svuint32_t);
      43    CHECK_TYPE (1 + sn, vls_svint32_t);
      44    CHECK_TYPE (1 + un, vls_svuint32_t);
      45  
      46    CHECK_TYPE (sg + sg, gnu_svint32_t);
      47    CHECK_TYPE (ug + ug, gnu_svuint32_t);
      48    CHECK_TYPE (sn + sn, vls_svint32_t);
      49    CHECK_TYPE (un + un, vls_svuint32_t);
      50  
      51    /* Traditional behavior for mixed signs is to pick the signedness of the
      52       first operand.  We don't have any Arm-specific reason for preferring that
      53       behavior.  */
      54    CHECK_TYPE (sg + ug, gnu_svint32_t);
      55    CHECK_TYPE (ug + sg, gnu_svuint32_t);
      56    CHECK_TYPE (sn + un, vls_svint32_t);
      57    CHECK_TYPE (un + sn, vls_svuint32_t);
      58  
      59    CHECK_TYPE (c ? sg + sg : sg, gnu_svint32_t);
      60    CHECK_TYPE (c ? ug + ug : ug, gnu_svuint32_t);
      61    CHECK_TYPE (c ? sn + sn : sn, vls_svint32_t);
      62    CHECK_TYPE (c ? un + un : un, vls_svuint32_t);
      63  
      64    CHECK_TYPE (c ? sg + 1 : sg, gnu_svint32_t);
      65    CHECK_TYPE (c ? ug + 1 : ug, gnu_svuint32_t);
      66    CHECK_TYPE (c ? sn + 1 : sn, vls_svint32_t);
      67    CHECK_TYPE (c ? un + 1 : un, vls_svuint32_t);
      68  
      69    CHECK_TYPE (c ? 1 + sg : sg, gnu_svint32_t);
      70    CHECK_TYPE (c ? 1 + ug : ug, gnu_svuint32_t);
      71    CHECK_TYPE (c ? 1 + sn : sn, vls_svint32_t);
      72    CHECK_TYPE (c ? 1 + un : un, vls_svuint32_t);
      73  
      74    CHECK_TYPE (c ? sg : sg + sg, gnu_svint32_t);
      75    CHECK_TYPE (c ? ug : ug + ug, gnu_svuint32_t);
      76    CHECK_TYPE (c ? sn : sn + sn, vls_svint32_t);
      77    CHECK_TYPE (c ? un : un + un, vls_svuint32_t);
      78  
      79    CHECK_TYPE (c ? sg : sg + 1, gnu_svint32_t);
      80    CHECK_TYPE (c ? ug : ug + 1, gnu_svuint32_t);
      81    CHECK_TYPE (c ? sn : sn + 1, vls_svint32_t);
      82    CHECK_TYPE (c ? un : un + 1, vls_svuint32_t);
      83  
      84    CHECK_TYPE (c ? sg : 1 + sg, gnu_svint32_t);
      85    CHECK_TYPE (c ? ug : 1 + ug, gnu_svuint32_t);
      86    CHECK_TYPE (c ? sn : 1 + sn, vls_svint32_t);
      87    CHECK_TYPE (c ? un : 1 + un, vls_svuint32_t);
      88  
      89    CHECK_TYPE (c ? sg + sg : sg + sg, gnu_svint32_t);
      90    CHECK_TYPE (c ? ug + ug : ug + ug, gnu_svuint32_t);
      91    CHECK_TYPE (c ? sn + sn : sn + sn, vls_svint32_t);
      92    CHECK_TYPE (c ? un + un : un + un, vls_svuint32_t);
      93  
      94    CHECK_TYPE (c ? sg + sg : sg + 1, gnu_svint32_t);
      95    CHECK_TYPE (c ? ug + ug : ug + 1, gnu_svuint32_t);
      96    CHECK_TYPE (c ? sn + sn : sn + 1, vls_svint32_t);
      97    CHECK_TYPE (c ? un + un : un + 1, vls_svuint32_t);
      98  
      99    CHECK_TYPE (c ? 1 + sg : sg + sg, gnu_svint32_t);
     100    CHECK_TYPE (c ? 1 + ug : ug + ug, gnu_svuint32_t);
     101    CHECK_TYPE (c ? 1 + sn : sn + sn, vls_svint32_t);
     102    CHECK_TYPE (c ? 1 + un : un + un, vls_svuint32_t);
     103  }