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