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

// [dcl.ambig.res]p1:
struct S { 
  S(int); 
  void bar();
}; 

int returns_an_int();

void foo(double a) 
{ 
  S w(int(a)); // expected-warning{{disambiguated as a function declaration}} expected-note{{add a pair of parentheses}} 
  w(17);
  S x1(int()); // expected-warning{{disambiguated as a function declaration}} expected-note{{add a pair of parentheses}} 
  x1(&returns_an_int);
  S y((int)a); 
  y.bar();
  S z = int(a);
  z.bar();
} 

// [dcl.ambig.res]p3:
char *p; 
void *operator new(__SIZE_TYPE__, int); 
void foo3() { 
  const int x = 63; 
  new (int(*p)) int; //new-placement expression 
  new (int(*[x])); //new type-id 
} 

// [dcl.ambig.res]p4:
template <class T>  // expected-note{{here}}
struct S4 { 
  T *p; 
}; 
S4<int()> x; //type-id 
S4<int(1)> y; // expected-error{{must be a type}}

// [dcl.ambig.res]p5:
void foo5() 
{ 
  (void)sizeof(int(1)); //expression 
  // FIXME: should we make this an error rather than a warning? 
  // (It affects SFINAE)
  (void)sizeof(int()); // expected-warning{{function type}}
}

// [dcl.ambig.res]p6:
void foo6() 
{ 
  (void)(int(1)); //expression 
  (void)(int())1; // expected-error{{to 'int ()'}}
} 

// [dcl.ambig.res]p7:
class C7 { }; 
void f7(int(C7)) { } // expected-note{{candidate}}
int g7(C7); 
void foo7() { 
  f7(1); // expected-error{{no matching function}}
  f7(g7); //OK 
} 

void h7(int *(C7[10])) { } // expected-note{{previous}}
void h7(int *(*_fp)(C7 _parm[10])) { } // expected-error{{redefinition}}

struct S5 {
  static bool const value = false;
};
int foo8() {
  int v(int(S5::value)); // expected-warning{{disambiguated as a function declaration}} expected-note{{add a pair of parentheses}} expected-error{{parameter declarator cannot be qualified}}
}

template<typename T>
void rdar8739801( void (T::*)( void ) __attribute__((unused)) );
