1 /* { dg-do compile } */ 2 /* { dg-options "-Wuninitialized -O2" } */ 3 4 /* Multiple initialization paths. */ 5 6 typedef long long int64; 7 void incr (); 8 bool is_valid (int); 9 int get_time (); 10 11 class A 12 { 13 public: 14 A (); ~A()15 ~A () { 16 if (I) delete I; 17 } 18 19 private: 20 int* I; 21 }; 22 23 bool get_url (A *); 24 bool get_url2 (A *); 25 26 class M { 27 28 public: 29 __attribute__ ((always_inline)) GetC(int * c)30 bool GetC (int *c) { 31 32 A details_str; 33 /* Intialization path 1 */ 34 if (get_url (&details_str)) 35 { 36 *c = get_time (); 37 return true; 38 } 39 40 /* insert dtor calls (inlined) into following return paths */ 41 A tmp_str; 42 43 /* Intializtion path 2 */ 44 if (get_url2 (&details_str)) 45 { 46 *c = get_time (); 47 return true; 48 } 49 50 return false; 51 } 52 53 void do_sth(); 54 void do_sth2(); 55 P(int64 t)56 void P (int64 t) 57 { 58 int cc; 59 if (!GetC (&cc)) /* return flag checked properly */ 60 return; 61 62 if (cc <= 0) /* { dg-bogus "uninitialized" "uninitialized variable warning" } */ 63 { 64 this->do_sth(); 65 return; 66 } 67 68 do_sth2(); 69 } 70 }; 71 72 M* m; test(int x)73void test(int x) 74 { 75 m = new M; 76 m->P(x); 77 } 78