view gcc/testsuite/g++.dg/ext/vector29.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
line wrap: on
line source

// PR c++/69022 - attribute vector_size ignored with dependent bytes
// { dg-do compile }

template <int N>
struct A { static const int X = N; };

#if __cplusplus >= 201202L
#  define ASSERT(e) static_assert (e, #e)
#else
#  define ASSERT(e)   \
  do { struct S { bool: !!(e); } asrt; (void)&asrt; } while (0)
#endif

template <class T, int N>
struct B: A<N>
{
#if __cplusplus >= 201202L
  using A<N>::X;
#  define VecSize X
#else
#  define VecSize A<N>::X
#endif

    static void foo ()
    {
        char a __attribute__ ((vector_size (N)));
        ASSERT (sizeof a == N);

        T b __attribute__ ((vector_size (N)));
        ASSERT (sizeof b == N);
    }

    static void bar ()
    {
        char c1 __attribute__ ((vector_size (VecSize)));
        ASSERT (sizeof c1 == VecSize);

        char c2 __attribute__ ((vector_size (A<N>::X)));
        ASSERT (sizeof c2 == A<N>::X);

        T d1 __attribute__ ((vector_size (VecSize)));
        ASSERT (sizeof d1 == VecSize);

        T d2 __attribute__ ((vector_size (A<N>::X)));
        ASSERT (sizeof d2 == A<N>::X);
    }
};

void bar ()
{
    B<int, 16>::foo ();
    B<int, 16>::bar ();
}