1 // RUN: %clang_cc1 -std=c++11 -verify %s
3 alignas(4) extern int n1
; // expected-note {{previous declaration}}
4 alignas(8) int n1
; // expected-error {{redeclaration has different alignment requirement (8 vs 4)}}
6 alignas(8) int n2
; // expected-note {{previous declaration}}
7 alignas(4) extern int n2
; // expected-error {{different alignment requirement (4 vs 8)}}
9 alignas(8) extern int n3
; // expected-note {{previous declaration}}
10 alignas(4) extern int n3
; // expected-error {{different alignment requirement (4 vs 8)}}
13 alignas(8) extern int n4
;
15 alignas(8) extern int n5
;
18 int n6
; // expected-error {{'alignas' must be specified on definition if it is specified on any declaration}}
19 alignas(8) extern int n6
; // expected-note {{declared with 'alignas' attribute here}}
24 alignas(8) extern int n8
; // expected-note {{declared with 'alignas' attribute here}}
25 int n8
; // expected-error {{'alignas' must be specified on definition if it is specified on any declaration}}
27 int n9
; // expected-error {{'alignas' must be specified on definition if it is specified on any declaration}}
28 alignas(4) extern int n9
; // expected-note {{declared with 'alignas' attribute here}}
31 struct alignas(16) S
; // expected-note {{declared with 'alignas' attribute here}}
33 struct S
{ int n
; }; // expected-error {{'alignas' must be specified on definition if it is specified on any declaration}}
36 struct alignas(2) T
{ char c
; }; // expected-note {{previous declaration is here}}
38 struct alignas(4) T
; // expected-error {{redeclaration has different alignment requirement (4 vs 2)}}
41 struct alignas(2) U
{};
43 struct V
{}; // expected-error {{'alignas' must be specified on definition if it is specified on any declaration}}
44 struct alignas(1) V
; // expected-note {{declared with 'alignas' attribute here}}
46 template<int M
, int N
> struct alignas(M
) W
;
47 template<int M
, int N
> struct alignas(N
) W
{};
49 // FIXME: We should reject this.
51 static_assert(alignof(W
<4,4>) == 4, "");
53 template<int M
, int N
, int O
, int P
> struct X
{
54 alignas(M
) alignas(N
) static char Buffer
[32]; // expected-note {{previous declaration is here}}
56 template<int M
, int N
, int O
, int P
>
57 alignas(O
) alignas(P
) char X
<M
, N
, O
, P
>::Buffer
[32]; // expected-error {{redeclaration has different alignment requirement (8 vs 2)}}
58 char *x1848
= X
<1,8,4,8>::Buffer
; // ok
59 char *x1248
= X
<1,2,4,8>::Buffer
; // expected-note {{in instantiation of}}
62 alignas(4) struct Incomplete incomplete
; // expected-error {{incomplete type}} expected-note {{forward declaration}}