// { dg-additional-options -Wparentheses } // Most Vexing Parse warnings // in C++ anythig that syntactically looks like a decl IS a decl, this // can lead to confused users, but worse silent unexpectedly unsafe // code generation. int (a); // { dg-warning "" } int (*b); // { dg-warning "" } extern int (&c); // { dg-warning "" } int h1 = 0, h2 = 0; struct H { H(...);}; namespace fns { int (*a) (); int (b) (); int (*c ()) (); int (d1 ()); // { dg-warning "" } int (d2 // { dg-warning "" } ()); int (e) (int); int g (int (a)); // No warning because ... H h (int (h1), int (h2), 3); // ... not a function decl. } namespace arys { int (*a)[1]; int (b)[1]; int (*c[1])[1]; int (d1[1]); // { dg-warning "" } int (d2 [1]); int (e[1])[1]; } namespace complex { int (*a())[1]; int (*b[1])(); int ((*c1())[1]); // { dg-warning "" } int ((*c2()) [1]); int ((*d1[1])()); // { dg-warning "" } int ((*d2[1]) // { dg-warning "" } ()); } namespace motivation { typedef int shared_mutex; // for exposition struct locker { locker (); locker (int &r); ~locker (); }; class protected_state { shared_mutex mutex; // not a real mutex type int state; public: void not_thread_safe () { locker (mutex); // { dg-warning "" } state++; // oops } void thread_safe () { locker lock (mutex); state++; // ok; } }; }