/* { dg-options "-fdiagnostics-show-caret" } */ /* Verify that we emit a "return *this;" fix-it hint for a missing return in an assignment operator. */ struct s1 { s1& operator=(const s1&) { } // { dg-warning "no return statement in function returning non-void" } /* { dg-begin-multiline-output "" } s1& operator=(const s1&) { } ^ return *this; { dg-end-multiline-output "" } */ }; /* Likewise for +=. */ struct s2 { s2& operator+=(const s2&) {} // { dg-warning "no return statement in function returning non-void" } /* { dg-begin-multiline-output "" } s2& operator+=(const s2&) {} ^ return *this; { dg-end-multiline-output "" } */ }; /* No warning for "void" return. */ struct s3 { void operator=(const s3&) { } }; /* We shouldn't issue the fix-it hint if the return type isn't right. */ struct s4 { int operator=(int) { } // { dg-warning "no return statement in function returning non-void" } /* { dg-begin-multiline-output "" } int operator=(int) { } ^ { dg-end-multiline-output "" } */ }; /* Example of a multi-line fix-it hint. */ struct s5 { int i; s5& operator=(const s5& z) { i = z.i; } // { dg-warning "no return statement in function returning non-void" } /* { dg-begin-multiline-output "" } i = z.i; + return *this; } ^ { dg-end-multiline-output "" } */ }; /* Example of a multi-line fix-it hint with other statements. */ extern void log (const char *); struct s6 { int i; s6& operator=(const s6& z) { log ("operator=\n"); i = z.i; } // { dg-warning "no return statement in function returning non-void" } /* { dg-begin-multiline-output "" } i = z.i; + return *this; } ^ { dg-end-multiline-output "" } */ }; /* Another example of a multi-line fix-it hint with other statements. */ struct s7 { int i; s7& operator=(const s6& z) { if (z.i) log ("operator=\n"); else log ("operator=\n"); i = z.i; } // { dg-warning "no return statement in function returning non-void" } /* { dg-begin-multiline-output "" } i = z.i; + return *this; } ^ { dg-end-multiline-output "" } */ };