1 // { dg-additional-options -Wparentheses } 2 3 // Most Vexing Parse warnings 4 // in C++ anythig that syntactically looks like a decl IS a decl, this 5 // can lead to confused users, but worse silent unexpectedly unsafe 6 // code generation. 7 8 int (a); // { dg-warning "" } 9 int (*b); // { dg-warning "" } 10 extern int (&c); // { dg-warning "" } 11 12 int h1 = 0, h2 = 0; 13 struct H { H(...);}; 14 15 namespace fns 16 { 17 int (*a) (); 18 int (b) (); 19 int (*c ()) (); 20 int (d1 ()); // { dg-warning "" } 21 int (d2 // { dg-warning "" } 22 ()); 23 int (e) (int); 24 int g (int (a)); // No warning because ... 25 H h (int (h1), int (h2), 3); // ... not a function decl. 26 } 27 28 namespace arys 29 { 30 int (*a)[1]; 31 int (b)[1]; 32 int (*c[1])[1]; 33 int (d1[1]); // { dg-warning "" } 34 int (d2 35 [1]); 36 int (e[1])[1]; 37 } 38 39 namespace complex 40 { 41 int (*a())[1]; 42 int (*b[1])(); 43 int ((*c1())[1]); // { dg-warning "" } 44 int ((*c2()) 45 [1]); 46 int ((*d1[1])()); // { dg-warning "" } 47 int ((*d2[1]) // { dg-warning "" } 48 ()); 49 } 50 51 namespace motivation 52 { 53 typedef int shared_mutex; // for exposition 54 struct locker 55 { 56 locker (); 57 locker (int &r); 58 ~locker (); 59 }; 60 class protected_state 61 { 62 shared_mutex mutex; // not a real mutex type 63 int state; 64 65 public: not_thread_safe()66 void not_thread_safe () 67 { 68 locker (mutex); // { dg-warning "" } 69 state++; // oops 70 } 71 thread_safe()72 void thread_safe () 73 { 74 locker lock (mutex); 75 state++; // ok; 76 } 77 }; 78 } 79