187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -std=c++11 -fsyntax-only -triple x86_64-unknown-unknown -verify %s
287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct S0 {
487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int x;
587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test0 = __builtin_omp_required_simd_align(x); // expected-error {{invalid application of '__builtin_omp_required_simd_align' to an expression, only type is allowed}}
687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test1 = __builtin_omp_required_simd_align(decltype(S0::x));
787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto test2() -> char(&)[__builtin_omp_required_simd_align(decltype(x))];
887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct S1; // expected-note 6 {{forward declaration}}
1187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarextern S1 s1;
1287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarconst int test3 = __builtin_omp_required_simd_align(decltype(s1)); // expected-error {{invalid application of '__builtin_omp_required_simd_align' to an incomplete type 'decltype(s1)' (aka 'S1')}}
1387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct S2 {
1587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  S2();
1687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  S1 &s;
1787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int x;
1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int test4 = __builtin_omp_required_simd_align(decltype(x)); // ok
2087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int test5 = __builtin_omp_required_simd_align(decltype(s)); // expected-error {{invalid application of '__builtin_omp_required_simd_align' to an incomplete type 'S1'}}
2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarconst int test6 = __builtin_omp_required_simd_align(decltype(S2::x));
2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarconst int test7 = __builtin_omp_required_simd_align(decltype(S2::s)); // expected-error {{invalid application of '__builtin_omp_required_simd_align' to an incomplete type 'S1'}}
2587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Arguably, these should fail like the S1 cases do: the alignment of
2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// 's2.x' should depend on the alignment of both x-within-S2 and
2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// s2-within-S3 and thus require 'S3' to be complete.  If we start
2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// doing the appropriate recursive walk to do that, we should make
3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// sure that these cases don't explode.
3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct S3 {
3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  S2 s2;
3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test8 = __builtin_omp_required_simd_align(decltype(s2.x));
3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test9 = __builtin_omp_required_simd_align(decltype(s2.s)); // expected-error {{invalid application of '__builtin_omp_required_simd_align' to an incomplete type 'S1'}}
3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto test10() -> char(&)[__builtin_omp_required_simd_align(decltype(s2.x))];
3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test11 = __builtin_omp_required_simd_align(decltype(S3::s2.x));
3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test12 = __builtin_omp_required_simd_align(decltype(S3::s2.s)); // expected-error {{invalid application of '__builtin_omp_required_simd_align' to an incomplete type 'S1'}}
3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto test13() -> char(&)[__builtin_omp_required_simd_align(decltype(s2.x))];
4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Same reasoning as S3.
4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct S4 {
4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  union {
4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      int x;
4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    };
4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test0 = __builtin_omp_required_simd_align(decltype(x));
4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static const int test1 = __builtin_omp_required_simd_align(decltype(S0::x));
4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  auto test2() -> char(&)[__builtin_omp_required_simd_align(decltype(x))];
5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// Regression test for asking for the alignment of a field within an invalid
5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// record.
5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstruct S5 {
5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  S1 s;  // expected-error {{incomplete type}}
5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int x;
5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar};
5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarconst int test8 = __builtin_omp_required_simd_align(decltype(S5::x));
5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarlong long int test14[2];
6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic_assert(__builtin_omp_required_simd_align(decltype(test14)) == 16, "foo");
6387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarstatic_assert(__builtin_omp_required_simd_align(int[2]) == __builtin_omp_required_simd_align(int), ""); // ok
6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainarnamespace __builtin_omp_required_simd_align_array_expr {
6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  alignas(32) extern int n[2];
6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static_assert(__builtin_omp_required_simd_align(decltype(n)) == 16, "");
6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<int> struct S {
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      static int a[];
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    };
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  template<int N> int S<N>::a[N];
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static_assert(__builtin_omp_required_simd_align(decltype(S<1>::a)) == __builtin_omp_required_simd_align(int), "");
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static_assert(__builtin_omp_required_simd_align(decltype(S<1128>::a)) == __builtin_omp_required_simd_align(int), "");
7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate <typename T> void n(T) {
7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  alignas(T) int T1;
8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  char k[__builtin_omp_required_simd_align(decltype(T1))];
8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static_assert(sizeof(k) == __builtin_omp_required_simd_align(long long), "");
8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar}
8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainartemplate void n(long long);
84