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)73 void test(int x)
74 {
75   m = new M;
76   m->P(x);
77 }
78