re PR c++/54930 (Add warning switch for "returning reference to temporary" and similar)
gcc/c-family: PR c++/54930 * c.opt (Wreturn_local_addr): Define new option. gcc/c: PR c++/54930 * c-typeck.c (c_finish_return): Use OPT_Wreturn_local_addr. gcc/cp: PR c++/54930 * typeck.c (maybe_warn_about_returning_address_of_local): Use OPT_Wreturn_local_addr. gcc: PR c++/54930 * doc/invoke.texi (Warning Options): Document -Wno-return-local-addr. gcc/testsuite: PR c++/54930 * gcc.dg/Wreturn-local-addr.c: New. * g++.dg/warn/Wno-return-local-addr.C: New. * g++.dg/warn/Wreturn-local-addr.C: New. From-SVN: r192968
This commit is contained in:
parent
2adaa795e4
commit
880661a48b
@ -1,3 +1,8 @@
|
|||||||
|
2012-10-29 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||||
|
|
||||||
|
PR c++/54930
|
||||||
|
* doc/invoke.texi (Warning Options): Document -Wno-return-local-addr.
|
||||||
|
|
||||||
2012-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
2012-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
* lra-assigns.c: Remove trailing white spaces.
|
* lra-assigns.c: Remove trailing white spaces.
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2012-10-29 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||||
|
|
||||||
|
PR c++/54930
|
||||||
|
* c.opt (Wreturn_local_addr): Define new option.
|
||||||
|
|
||||||
2012-10-25 Jason Merrill <jason@redhat.com>
|
2012-10-25 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
* c.opt (Wvirtual-move-assign): New.
|
* c.opt (Wvirtual-move-assign): New.
|
||||||
|
@ -613,6 +613,10 @@ Wreorder
|
|||||||
C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall)
|
C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall)
|
||||||
Warn when the compiler reorders code
|
Warn when the compiler reorders code
|
||||||
|
|
||||||
|
Wreturn-local-addr
|
||||||
|
C ObjC C++ ObjC++ Var(warn_return_local_addr) Init(1) Warning
|
||||||
|
Warn about returning a pointer/reference to a local or temporary variable.
|
||||||
|
|
||||||
Wreturn-type
|
Wreturn-type
|
||||||
C ObjC C++ ObjC++ Var(warn_return_type) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
|
C ObjC C++ ObjC++ Var(warn_return_type) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall)
|
||||||
Warn whenever a function's return type defaults to \"int\" (C), or about inconsistent return types (C++)
|
Warn whenever a function's return type defaults to \"int\" (C), or about inconsistent return types (C++)
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2012-10-29 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||||
|
|
||||||
|
PR c++/54930
|
||||||
|
* c-typeck.c (c_finish_return): Use OPT_Wreturn_local_addr.
|
||||||
|
|
||||||
2012-10-29 Manuel López-Ibáñez <manu@gcc.gnu.org>
|
2012-10-29 Manuel López-Ibáñez <manu@gcc.gnu.org>
|
||||||
|
|
||||||
PR c/53066
|
PR c/53066
|
||||||
|
@ -8742,7 +8742,8 @@ c_finish_return (location_t loc, tree retval, tree origtype)
|
|||||||
&& !TREE_STATIC (inner)
|
&& !TREE_STATIC (inner)
|
||||||
&& DECL_CONTEXT (inner) == current_function_decl)
|
&& DECL_CONTEXT (inner) == current_function_decl)
|
||||||
warning_at (loc,
|
warning_at (loc,
|
||||||
0, "function returns address of local variable");
|
OPT_Wreturn_local_addr, "function returns address "
|
||||||
|
"of local variable");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
2012-10-29 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||||
|
|
||||||
|
PR c++/54930
|
||||||
|
* typeck.c (maybe_warn_about_returning_address_of_local): Use
|
||||||
|
OPT_Wreturn_local_addr.
|
||||||
|
|
||||||
2012-10-26 Jakub Jelinek <jakub@redhat.com>
|
2012-10-26 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR c++/55081
|
PR c++/55081
|
||||||
|
@ -8020,14 +8020,14 @@ maybe_warn_about_returning_address_of_local (tree retval)
|
|||||||
if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
|
if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
|
||||||
|| TREE_CODE (whats_returned) == TARGET_EXPR)
|
|| TREE_CODE (whats_returned) == TARGET_EXPR)
|
||||||
{
|
{
|
||||||
warning (0, "returning reference to temporary");
|
warning (OPT_Wreturn_local_addr, "returning reference to temporary");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (TREE_CODE (whats_returned) == VAR_DECL
|
if (TREE_CODE (whats_returned) == VAR_DECL
|
||||||
&& DECL_NAME (whats_returned)
|
&& DECL_NAME (whats_returned)
|
||||||
&& TEMP_NAME_P (DECL_NAME (whats_returned)))
|
&& TEMP_NAME_P (DECL_NAME (whats_returned)))
|
||||||
{
|
{
|
||||||
warning (0, "reference to non-lvalue returned");
|
warning (OPT_Wreturn_local_addr, "reference to non-lvalue returned");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -8043,10 +8043,10 @@ maybe_warn_about_returning_address_of_local (tree retval)
|
|||||||
|| TREE_PUBLIC (whats_returned)))
|
|| TREE_PUBLIC (whats_returned)))
|
||||||
{
|
{
|
||||||
if (TREE_CODE (valtype) == REFERENCE_TYPE)
|
if (TREE_CODE (valtype) == REFERENCE_TYPE)
|
||||||
warning (0, "reference to local variable %q+D returned",
|
warning (OPT_Wreturn_local_addr, "reference to local variable %q+D returned",
|
||||||
whats_returned);
|
whats_returned);
|
||||||
else
|
else
|
||||||
warning (0, "address of local variable %q+D returned",
|
warning (OPT_Wreturn_local_addr, "address of local variable %q+D returned",
|
||||||
whats_returned);
|
whats_returned);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -261,7 +261,7 @@ Objective-C and Objective-C++ Dialects}.
|
|||||||
-Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded @gol
|
-Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded @gol
|
||||||
-Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format @gol
|
-Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format @gol
|
||||||
-Wpointer-arith -Wno-pointer-to-int-cast @gol
|
-Wpointer-arith -Wno-pointer-to-int-cast @gol
|
||||||
-Wredundant-decls @gol
|
-Wredundant-decls -Wno-return-local-addr @gol
|
||||||
-Wreturn-type -Wsequence-point -Wshadow @gol
|
-Wreturn-type -Wsequence-point -Wshadow @gol
|
||||||
-Wsign-compare -Wsign-conversion -Wsizeof-pointer-memaccess @gol
|
-Wsign-compare -Wsign-conversion -Wsizeof-pointer-memaccess @gol
|
||||||
-Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol
|
-Wstack-protector -Wstack-usage=@var{len} -Wstrict-aliasing @gol
|
||||||
@ -3535,6 +3535,12 @@ definitions, may be found on the GCC readings page, at
|
|||||||
|
|
||||||
This warning is enabled by @option{-Wall} for C and C++.
|
This warning is enabled by @option{-Wall} for C and C++.
|
||||||
|
|
||||||
|
@item -Wno-return-local-addr
|
||||||
|
@opindex Wno-return-local-addr
|
||||||
|
@opindex Wreturn-local-addr
|
||||||
|
Do not warn about returning a pointer (or in C++, a reference) to a
|
||||||
|
variable that goes out of scope after the function returns.
|
||||||
|
|
||||||
@item -Wreturn-type
|
@item -Wreturn-type
|
||||||
@opindex Wreturn-type
|
@opindex Wreturn-type
|
||||||
@opindex Wno-return-type
|
@opindex Wno-return-type
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
2012-10-29 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||||
|
|
||||||
|
PR c++/54930
|
||||||
|
* gcc.dg/Wreturn-local-addr.c: New.
|
||||||
|
* g++.dg/warn/Wno-return-local-addr.C: New.
|
||||||
|
* g++.dg/warn/Wreturn-local-addr.C: New.
|
||||||
|
|
||||||
2012-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
2012-10-29 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
PR middle-end/55116
|
PR middle-end/55116
|
||||||
|
26
gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C
Normal file
26
gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// { dg-do assemble }
|
||||||
|
// { dg-options "-Wno-return-local-addr" }
|
||||||
|
|
||||||
|
int& bad1()
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int* bad2()
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
return &x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int f();
|
||||||
|
|
||||||
|
const int& bad3()
|
||||||
|
{
|
||||||
|
return f();
|
||||||
|
}
|
||||||
|
|
||||||
|
const int& bad4()
|
||||||
|
{
|
||||||
|
return int();
|
||||||
|
}
|
20
gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C
Normal file
20
gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// { dg-do assemble }
|
||||||
|
// { dg-options "-Werror=return-local-addr" }
|
||||||
|
// { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 }
|
||||||
|
|
||||||
|
int& bad1()
|
||||||
|
{
|
||||||
|
int x = 0; // { dg-error "reference to local variable" }
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
int* bad2()
|
||||||
|
{
|
||||||
|
int x = 0; // { dg-error "address of local variable" }
|
||||||
|
return &x;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int& bad4()
|
||||||
|
{
|
||||||
|
return int(); // { dg-error "returning reference to temporary" }
|
||||||
|
}
|
9
gcc/testsuite/gcc.dg/Wreturn-local-addr.c
Normal file
9
gcc/testsuite/gcc.dg/Wreturn-local-addr.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/* { dg-do assemble } */
|
||||||
|
/* { dg-options "-Werror=return-local-addr" } */
|
||||||
|
/* { dg-message "some warnings being treated as errors" "" {target "*-*-*"} 0 } */
|
||||||
|
|
||||||
|
int* bad()
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
return &x; /* { dg-error "address of local variable" } */
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user