re PR c++/88554 (Segfault ICE when falling off the end of a reference-returning friend operator)

PR c++/88554
	* decl.c (finish_function): For -Wreturn-type don't add a return *this;
	fixit hint if current_class_ref is NULL.  Use a single if instead of
	two nested ones.

	* g++.dg/warn/Wreturn-type-11.C: New test.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>

From-SVN: r267672
This commit is contained in:
Jonathan Wakely 2019-01-08 08:57:58 +00:00 committed by Jakub Jelinek
parent 44e813ecd1
commit ff0425cdeb
4 changed files with 30 additions and 4 deletions

View file

@ -1,3 +1,11 @@
2019-01-08 Jonathan Wakely <jwakely@redhat.com>
Jakub Jelinek <jakub@redhat.com>
PR c++/88554
* decl.c (finish_function): For -Wreturn-type don't add a return *this;
fixit hint if current_class_ref is NULL. Use a single if instead of
two nested ones.
2019-01-07 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (start_decl): Improve two error_at locations.

View file

@ -16097,11 +16097,12 @@ finish_function (bool inline_p)
{
tree valtype = TREE_TYPE (DECL_RESULT (fndecl));
if (TREE_CODE (valtype) == REFERENCE_TYPE
&& current_class_ref
&& same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (valtype), TREE_TYPE (current_class_ref)))
if (global_dc->option_enabled (OPT_Wreturn_type,
global_dc->option_state))
add_return_star_this_fixit (&richloc, fndecl);
(TREE_TYPE (valtype), TREE_TYPE (current_class_ref))
&& global_dc->option_enabled (OPT_Wreturn_type,
global_dc->option_state))
add_return_star_this_fixit (&richloc, fndecl);
}
warning_at (&richloc, OPT_Wreturn_type,
"no return statement in function returning non-void");

View file

@ -1,3 +1,9 @@
2019-01-08 Jonathan Wakely <jwakely@redhat.com>
Jakub Jelinek <jakub@redhat.com>
PR c++/88554
* g++.dg/warn/Wreturn-type-11.C: New test.
2019-01-07 David Malcolm <dmalcolm@redhat.com>
PR jit/88747

View file

@ -0,0 +1,11 @@
// PR c++/88554
// { dg-do compile }
// { dg-options "-Wreturn-type" }
struct X {
friend X & operator+= (X &, int) { } // { dg-warning "no return statement in function returning non-void" }
// { dg-bogus "return \\*this;" "" { target *-*-* } .-1 }
};
struct Y {};
Y & operator += (Y &, Y &) { } // { dg-warning "no return statement in function returning non-void" }
// { dg-bogus "return \\*this;" "" { target *-*-* } .-1 }