// Test parsing of #pragma omp declare variant
// { dg-do compile }

int fn0 (int) { return 0; }
int fn20 (int) { return 0; }

#pragma omp declare variant (fn0) match (user={condition(0)})
extern "C"		// { dg-error "not immediately followed by function declaration or definition" }
{
  int fn5 (int a) { return 0; }
}

#pragma omp declare variant (fn0) match (user={condition(0)}) // { dg-error "not immediately followed by function declaration or definition" }
namespace N1
{
  int fn6 (int a) { return 0; }
}

#pragma omp declare variant (fn0) match (user={condition(0)})
struct A
{			// { dg-error "not immediately followed by function declaration or definition" }
  int fn7 (int a) { return 0; }
};

#pragma omp declare variant (fn0) match (user={condition(0)})
template <typename T>
struct B
{			// { dg-error "not immediately followed by function declaration or definition" }
  int fn8 (int a) { return 0; }
};

struct C
{
#pragma omp declare variant (fn0) match (user={condition(0)}) // { dg-error "not immediately followed by function declaration or definition" }
  public:		 // { dg-error "expected unqualified-id before" }
    int fn9 (int a) { return 0; }
};

int t;

#pragma omp declare variant (fn0) match (user={condition(0)})
#pragma omp declare variant (fn20) match (implementation={vendor(unknown)})
#pragma omp threadprivate(t)	// { dg-error "not immediately followed by function declaration or definition" }
int fn10 (int a) { return 0; }

struct D
{
  int d;
  int fn11 (int a) { return 0; }
  #pragma omp declare variant (fn11) match (user={condition(sizeof (e) == sizeof (this->e))}) // { dg-error "has no member named" }
  template <int N>	// { dg-error "was not declared" "" { target *-*-* } .-1 }
  int fn12 (int a) { return 0; }
  int e;
};

#pragma omp declare variant (1 + 2) match (user={condition(0)}) // { dg-error "before numeric constant" }
int fn13 (int) { return 0; }

#pragma omp declare variant (t) match (user={condition(0)})	// { dg-error "'t' cannot be used as a function" }
int fn14 (int) { return 0; }

long fn15 (char, short) { return 0; }

#pragma omp declare variant (fn15) match (implementation={vendor(unknown)})      // { dg-error "variant 'long int fn15\\\(char, short int\\\)' and base 'int fn16\\\(int, long long int\\\)' have incompatible types" }
int fn16 (int, long long) { return 0; }

#pragma omp declare variant (memcpy) match (implementation={vendor(llvm)})      // { dg-error "'memcpy' was not declared in this scope" }
void *fn17 (void *, const void *, __SIZE_TYPE__) { return (void *) 0; }

#pragma omp declare variant (__builtin_memmove) match (implementation={vendor(gnu)})    // { dg-error "variant '\[^'\n\r]*' is a built-in" }
void *fn18 (void *, const void *, __SIZE_TYPE__) { return (void *) 0; }

struct E { int e; };

void fn19 (E, int) {}

#pragma omp declare variant (fn19)match(user={condition(0)})	// { dg-error "could not convert '0' from 'int' to 'E'" }
void fn20 (int, E) {}

struct F { operator int () const { return 42; } int f; };
void fn21 (int, F) {}

#pragma omp declare variant ( fn21 ) match (user = { condition ( 1 - 1 ) } )	// { dg-error "variant 'void fn21\\\(int, F\\\)' and base 'void fn22\\\(F, F\\\)' have incompatible types" }
void fn22 (F, F) {}

#pragma omp declare variant (fn19) match (user={condition(0)})		// { dg-error "could not convert '<anonymous>' from 'F' to 'E'" }
void fn23 (F, int) {}

void fn24 (int);
struct U { int u; };
struct T
{
  void fn25 (int) {}
  int t;
};
struct S : public U, T
{
  #pragma omp declare variant (fn25) match (user={condition(true)})	// { dg-error "variant 'void T::fn25\\\(int\\\)' and base 'void S::fn26\\\(int\\\)' have incompatible types" }
  void fn26 (int) {}
  #pragma omp declare variant (fn24) match (user={condition(true)})	// { dg-error "variant 'void fn24\\\(int\\\)' and base 'void S::fn27\\\(int\\\)' have incompatible types" }
  void fn27 (int) {}
  void fn28 (int);
  struct s;
};
#pragma omp declare variant (fn25) match (user={condition(true)})	// { dg-error "variant 'void T::fn25\\\(int\\\)' and base 'void S::fn28\\\(int\\\)' have incompatible types" }
void S::fn28 (int)
{
}

void fn30 (int) throw () {}
#pragma omp declare variant (fn30) match (user={condition(true)})	// { dg-error "variant 'void fn30\\\(int\\\)' and base 'void fn31\\\(int\\\)' have incompatible types" "" { target c++17 } }
void fn31 (int) {}

struct W
{
  int fn32 (int) const { return 0; }
  #pragma omp declare variant (fn32) match (user={condition(true)})	// { dg-error "variant 'int W::fn32\\\(int\\\) const' and base 'int W::fn33\\\(int\\\)' have incompatible types" }
  int fn33 (int) { return 0; }
  int fn34 (int) volatile { return 0; }
  #pragma omp declare variant (fn34) match (user={condition(true)})	// { dg-error "variant 'int W::fn34\\\(int\\\) volatile' and base 'int W::fn35\\\(int\\\) const volatile' have incompatible types" }
  int fn35 (int) const volatile { return 0; }				// { dg-error "passing 'const volatile W' as 'this' argument discards qualifiers" "" { target *-*-* } .-1 }
  int fn36 (int) { return 0; }
  #pragma omp declare variant (fn36) match (user={condition(true)})	// { dg-error "variant 'int W::fn36\\\(int\\\)' and base 'int W::fn37\\\(int\\\) volatile' have incompatible types" }
  int fn37 (int) volatile { return 0; }					// { dg-error "passing 'volatile W' as 'this' argument discards qualifiers" "" { target *-*-* } .-1 }
  int fn38 (int) throw () { return 0; }
  #pragma omp declare variant (fn38) match (user={condition(true)})	// { dg-error "variant 'int W::fn38\\\(int\\\)' and base 'int W::fn39\\\(int\\\)' have incompatible types" "" { target c++17 } }
  int fn39 (int) { return 0; }
  int fn40 (int) { return 0; }
  #pragma omp declare variant (fn40) match (user={condition(true)})	// { dg-error "variant 'int W::fn40\\\(int\\\)' and base 'int W::fn41\\\(int\\\)' have incompatible types" "" { target c++17 } }
  int fn41 (int) throw () { return 0; }
};
