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