// RUN: %clang_cc1 %s -fsyntax-only -verify

#define _AS1 __attribute__((address_space(1)))
#define _AS2 __attribute__((address_space(2)))
#define _AS3 __attribute__((address_space(3)))

void bar(_AS2 int a); // expected-error {{parameter may not be qualified with an address space}}

void foo(_AS3 float *a,
         _AS1 float b) // expected-error {{parameter may not be qualified with an address space}}
{
  _AS2 *x;// expected-warning {{type specifier missing, defaults to 'int'}}
  _AS1 float * _AS2 *B;

  int _AS1 _AS2 *Y;   // expected-error {{multiple address spaces specified for type}}
  int *_AS1 _AS2 *Z;  // expected-error {{multiple address spaces specified for type}}

  _AS1 int local;     // expected-error {{automatic variable qualified with an address space}}
  _AS1 int array[5];  // expected-error {{automatic variable qualified with an address space}}
  _AS1 int arrarr[5][5]; // expected-error {{automatic variable qualified with an address space}}

  __attribute__((address_space(-1))) int *_boundsA; // expected-error {{address space is negative}}
  __attribute__((address_space(0x7FFFFF))) int *_boundsB;
  __attribute__((address_space(0x1000000))) int *_boundsC; // expected-error {{address space is larger than the maximum supported}}
  // chosen specifically to overflow 32 bits and come out reasonable
  __attribute__((address_space(4294967500))) int *_boundsD; // expected-error {{address space is larger than the maximum supported}}

  *a = 5.0f + b;
}

struct _st {
 int x, y;
} s __attribute ((address_space(1))) = {1, 1};


// rdar://6774906
__attribute__((address_space(256))) void * * const base = 0;
void * get_0(void) {
  return base[0];  // expected-error {{returning '__attribute__((address_space(256))) void *' from a function with result type 'void *' changes address space of pointer}}
}

__attribute__((address_space(1))) char test3_array[10];
void test3(void) {
  extern void test3_helper(char *p); // expected-note {{passing argument to parameter 'p' here}}
  test3_helper(test3_array); // expected-error {{changes address space of pointer}}
}

typedef void ft(void);
_AS1 ft qf; // expected-error {{function type may not be qualified with an address space}}
typedef _AS1 ft qft; // expected-error {{function type may not be qualified with an address space}}


typedef _AS2 int AS2Int;

struct HasASFields
{
  _AS2 int as_field; // expected-error {{field may not be qualified with an address space}}
   AS2Int typedef_as_field; // expected-error {{field may not be qualified with an address space}}
};

// Assertion failure was when the field was accessed
void access_as_field()
{
    struct HasASFields x;
    (void) bar.as_field;
}

typedef int PR4997 __attribute__((address_space(Foobar))); // expected-error {{use of undeclared identifier 'Foobar'}}
__attribute__((address_space("12"))) int *i; // expected-error {{'address_space' attribute requires an integer constant}}

// Clang extension doesn't forbid operations on pointers to different address spaces.
char* cmp(_AS1 char *x,  _AS2 char *y) {
  return x < y ? x : y; // expected-warning {{pointer type mismatch ('__attribute__((address_space(1))) char *' and '__attribute__((address_space(2))) char *')}}
}
