1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 %s -fsyntax-only -verify
27380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner
37380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner#define _AS1 __attribute__((address_space(1)))
47380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner#define _AS2 __attribute__((address_space(2)))
57380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner#define _AS3 __attribute__((address_space(3)))
67380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner
727a84d01614609c094029a49f7a86f0f7f8fe7f1Tanya Lattnervoid bar(_AS2 int a); // expected-error {{parameter may not be qualified with an address space}}
827a84d01614609c094029a49f7a86f0f7f8fe7f1Tanya Lattner
934b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenaultvoid foo(_AS3 float *a,
1027a84d01614609c094029a49f7a86f0f7f8fe7f1Tanya Lattner         _AS1 float b) // expected-error {{parameter may not be qualified with an address space}}
1127a84d01614609c094029a49f7a86f0f7f8fe7f1Tanya Lattner{
1235d276f443462249b436951c1c663820569e1768Chris Lattner  _AS2 *x;// expected-warning {{type specifier missing, defaults to 'int'}}
137380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner  _AS1 float * _AS2 *B;
147380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner
15c8e89a8ce5057750c338854085dca26f8d3136acNate Begeman  int _AS1 _AS2 *Y;   // expected-error {{multiple address spaces specified for type}}
167380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner  int *_AS1 _AS2 *Z;  // expected-error {{multiple address spaces specified for type}}
177380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner
18c8e89a8ce5057750c338854085dca26f8d3136acNate Begeman  _AS1 int local;     // expected-error {{automatic variable qualified with an address space}}
198e7dafec4b70303dfaff95151cd06bfc5532720cNate Begeman  _AS1 int array[5];  // expected-error {{automatic variable qualified with an address space}}
208e7dafec4b70303dfaff95151cd06bfc5532720cNate Begeman  _AS1 int arrarr[5][5]; // expected-error {{automatic variable qualified with an address space}}
215af27e02917089dd107c58c1cfdb064544010773Nate Begeman
22efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  __attribute__((address_space(-1))) int *_boundsA; // expected-error {{address space is negative}}
23efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  __attribute__((address_space(0xFFFFFF))) int *_boundsB;
24efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  __attribute__((address_space(0x1000000))) int *_boundsC; // expected-error {{address space is larger than the maximum supported}}
25efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  // chosen specifically to overflow 32 bits and come out reasonable
26efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall  __attribute__((address_space(4294967500))) int *_boundsD; // expected-error {{address space is larger than the maximum supported}}
27efadb7768e7c7418185f5a4010ecd8b21ca9731bJohn McCall
2827a84d01614609c094029a49f7a86f0f7f8fe7f1Tanya Lattner  *a = 5.0f + b;
297380466f2e9a5c835344454444cd3ad89ccca6e6Chris Lattner}
30863ea9aa73c0e7f19694ab7d618debbcde3e4157Chris Lattner
31863ea9aa73c0e7f19694ab7d618debbcde3e4157Chris Lattnerstruct _st {
32863ea9aa73c0e7f19694ab7d618debbcde3e4157Chris Lattner int x, y;
33863ea9aa73c0e7f19694ab7d618debbcde3e4157Chris Lattner} s __attribute ((address_space(1))) = {1, 1};
34863ea9aa73c0e7f19694ab7d618debbcde3e4157Chris Lattner
35ecca7536488e425417dcb005c39cc15ae1947aabChris Lattner
36ecca7536488e425417dcb005c39cc15ae1947aabChris Lattner// rdar://6774906
37ecca7536488e425417dcb005c39cc15ae1947aabChris Lattner__attribute__((address_space(256))) void * * const base = 0;
38ecca7536488e425417dcb005c39cc15ae1947aabChris Lattnervoid * get_0(void) {
3986c05f3f28bcf07c97dfb1881686fc43be2f47c2John McCall  return base[0];  // expected-error {{returning '__attribute__((address_space(256))) void *' from a function with result type 'void *' changes address space of pointer}}
40ecca7536488e425417dcb005c39cc15ae1947aabChris Lattner}
41ecca7536488e425417dcb005c39cc15ae1947aabChris Lattner
4240249e7487c3314f185c63302aaad9edde6dfd53John McCall__attribute__((address_space(1))) char test3_array[10];
4340249e7487c3314f185c63302aaad9edde6dfd53John McCallvoid test3(void) {
4440249e7487c3314f185c63302aaad9edde6dfd53John McCall  extern void test3_helper(char *p); // expected-note {{passing argument to parameter 'p' here}}
4540249e7487c3314f185c63302aaad9edde6dfd53John McCall  test3_helper(test3_array); // expected-error {{changes address space of pointer}}
4640249e7487c3314f185c63302aaad9edde6dfd53John McCall}
47020972d5d6dc1f3c49839cfbadcccf4cbefb2f4dPeter Collingbourne
48020972d5d6dc1f3c49839cfbadcccf4cbefb2f4dPeter Collingbournetypedef void ft(void);
49020972d5d6dc1f3c49839cfbadcccf4cbefb2f4dPeter Collingbourne_AS1 ft qf; // expected-error {{function type may not be qualified with an address space}}
50020972d5d6dc1f3c49839cfbadcccf4cbefb2f4dPeter Collingbournetypedef _AS1 ft qft; // expected-error {{function type may not be qualified with an address space}}
5134b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault
5234b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault
5334b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenaulttypedef _AS2 int AS2Int;
5434b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault
5534b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenaultstruct HasASFields
5634b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault{
5734b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault  _AS2 int as_field; // expected-error {{field may not be qualified with an address space}}
5834b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault   AS2Int typedef_as_field; // expected-error {{field may not be qualified with an address space}}
5934b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault};
6034b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault
6134b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault// Assertion failure was when the field was accessed
6234b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenaultvoid access_as_field()
6334b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault{
6434b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault    struct HasASFields x;
6534b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault    (void) bar.as_field;
6634b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault}
6734b0adb52f1528fb03313bdd5fd73632c11fc678Matt Arsenault
68d29e24f24e9a130431eafefa42c36be8e7a597deRichard Smithtypedef int PR4997 __attribute__((address_space(Foobar))); // expected-error {{use of undeclared identifier 'Foobar'}}
699f939f75c64770c746d78579f75a49f9c657e426Aaron Ballman__attribute__((address_space("12"))) int *i; // expected-error {{'address_space' attribute requires an integer constant}}
70