1 /* { dg-options "-fdiagnostics-show-caret" } */
2 
3 /* Verify that we emit a "return *this;" fix-it hint for
4    a missing return in an assignment operator.  */
5 
6 struct s1 {
7   s1& operator=(const s1&) { } // { dg-warning "no return statement in function returning non-void" }
8   /* { dg-begin-multiline-output "" }
9    s1& operator=(const s1&) { }
10                               ^
11                               return *this;
12      { dg-end-multiline-output "" } */
13 };
14 
15 /* Likewise for +=.  */
16 
17 struct s2 {
18   s2& operator+=(const s2&) {} // { dg-warning "no return statement in function returning non-void" }
19   /* { dg-begin-multiline-output "" }
20    s2& operator+=(const s2&) {}
21                               ^
22                               return *this;
23      { dg-end-multiline-output "" } */
24 };
25 
26 /* No warning for "void" return.  */
27 
28 struct s3 {
29   void operator=(const s3&) { }
30 };
31 
32 /* We shouldn't issue the fix-it hint if the return type isn't right.  */
33 
34 struct s4 {
35   int operator=(int) { } // { dg-warning "no return statement in function returning non-void" }
36   /* { dg-begin-multiline-output "" }
37    int operator=(int) { }
38                         ^
39      { dg-end-multiline-output "" } */
40 };
41 
42 /* Example of a multi-line fix-it hint.  */
43 
44 struct s5 {
45   int i;
46   s5& operator=(const s5& z) {
47     i = z.i;
48   } // { dg-warning "no return statement in function returning non-void" }
49   /* { dg-begin-multiline-output "" }
50      i = z.i;
51 +    return *this;
52    }
53    ^
54      { dg-end-multiline-output "" } */
55 };
56 
57 /* Example of a multi-line fix-it hint with other statements.  */
58 
59 extern void log (const char *);
60 struct s6 {
61   int i;
62   s6& operator=(const s6& z) {
63     log ("operator=\n");
64     i = z.i;
65   } // { dg-warning "no return statement in function returning non-void" }
66   /* { dg-begin-multiline-output "" }
67      i = z.i;
68 +    return *this;
69    }
70    ^
71      { dg-end-multiline-output "" } */
72 };
73 
74 /* Another example of a multi-line fix-it hint with other statements.  */
75 
76 struct s7 {
77   int i;
78   s7& operator=(const s6& z) {
79     if (z.i)
80       log ("operator=\n");
81     else
82       log ("operator=\n");
83     i = z.i;
84   } // { dg-warning "no return statement in function returning non-void" }
85   /* { dg-begin-multiline-output "" }
86      i = z.i;
87 +    return *this;
88    }
89    ^
90      { dg-end-multiline-output "" } */
91 };
92