// PR c++/25814
// { dg-do compile }
// Test -Wvexing-parse.
struct T { };
struct X {
  X();
};
struct S {
  S(int);
  S foo (int (int));
  S(T);
  int m;
};
struct W {
  W();
  W(X, X);
  int m;
};
int g;
int g1(int(g));
int g2(int());
void fg(int);
void
fn1 (double (a))
{
  extern int f0();
  extern int f1(int(a));
  int f2(int(a)); // { dg-warning "parentheses were disambiguated as a function declaration" }
  int (*f3)(int(a));
  int f4(int a);
  int f5(int()); // { dg-warning "parentheses were disambiguated as a function declaration" }
  int f6(...);
  int f7((int(a)));
  int (f8);
  int f9(S(s)); // { dg-warning "parentheses were disambiguated as a function declaration" }
  int(f10) __attribute__(());
  int(f11(int()));
  if (int(a) = 1) { }
  int j, k, l(); // { dg-warning "empty parentheses were disambiguated as a function declaration" }
  int m, f12(int(j)); // { dg-warning "parentheses were disambiguated as a function declaration" }
  T t1(); // { dg-warning "empty parentheses were disambiguated as a function declaration" }
  T t2(T()); // { dg-warning "parentheses were disambiguated as a function declaration" }
  /* Declares a variable t3.  */
  T(t3);
  T t4(), // { dg-warning "empty parentheses were disambiguated as a function declaration" }
    t5(); // { dg-warning "empty parentheses were disambiguated as a function declaration" }
  extern S s1(int(a));
  S s2(int(a)); // { dg-warning "parentheses were disambiguated as a function declaration" }
  S s3(int a);
  S s4(int()); // { dg-warning "parentheses were disambiguated as a function declaration" }
  S s5(int(int)); // { dg-warning "parentheses were disambiguated as a function declaration" }
  S s6(...);
  S s7((int(a)));
  S s8((int)a);
  S s9 = int(a);
  S(T());
  S s10(S()); // { dg-warning "parentheses were disambiguated as a function declaration" }
  S s11(T());
  S s12(X()); // { dg-warning "parentheses were disambiguated as a function declaration" }
  S s13 = S(T());
  S(T()).foo(0);
  S (S::*foo)(int (int));
  S(*s14)(int(a));
  S s15(); // { dg-warning "empty parentheses were disambiguated as a function declaration" }
  S s16(void);
  /* Don't warn here.  */
  void fv1(int(a));
  void fv2(int());
  void (fv3)();
  void (fv4)(void);
  void (fv5)(int);
  int n(); // { dg-warning "empty parentheses were disambiguated as a function declaration" }
  int (n2)(); // { dg-warning "empty parentheses were disambiguated as a function declaration" }
  int n3(void);
  typedef int F(const char*);
  typedef int F2();
  typedef int F3() const;
  typedef int F4(int(a)) const;
  W w(X(), X()); // { dg-warning "parentheses were disambiguated as a function declaration" }
}
struct C1 {
  C1(int);
};
struct C2 {
  C2(C1, int);
};
template<int N> int value() { return N; }
void
fn2 ()
{
  int i = 0;
  C2 c2(C1(int(i)), i);
  C1(value<0>());
}