aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely.gcc@gmail.com>2012-10-29 23:21:35 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2012-10-29 23:21:35 +0000
commit880661a48b6e2f3f4b3c05860d3c9737b2a1dcc8 (patch)
treecc94a67e7b17460335b8b668eac1f55a166543ed
parent2adaa795e40c898f70aa58a4487587490304ddaa (diff)
downloadgcc-880661a48b6e2f3f4b3c05860d3c9737b2a1dcc8.zip
gcc-880661a48b6e2f3f4b3c05860d3c9737b2a1dcc8.tar.gz
gcc-880661a48b6e2f3f4b3c05860d3c9737b2a1dcc8.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c-family/c.opt4
-rw-r--r--gcc/c/ChangeLog5
-rw-r--r--gcc/c/c-typeck.c3
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/typeck.c8
-rw-r--r--gcc/doc/invoke.texi8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C26
-rw-r--r--gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C20
-rw-r--r--gcc/testsuite/gcc.dg/Wreturn-local-addr.c9
12 files changed, 100 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 33f3497..9daf727 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
* lra-assigns.c: Remove trailing white spaces.
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index f97057e..f7c9422 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -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>
* c.opt (Wvirtual-move-assign): New.
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
index 7eb66c6..06d6e36 100644
--- a/gcc/c-family/c.opt
+++ b/gcc/c-family/c.opt
@@ -613,6 +613,10 @@ Wreorder
C++ ObjC++ Var(warn_reorder) Warning LangEnabledBy(C++ ObjC++,Wall)
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
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++)
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index f44131b..cd3a457 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -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>
PR c/53066
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 4855933..cf63355 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -8742,7 +8742,8 @@ c_finish_return (location_t loc, tree retval, tree origtype)
&& !TREE_STATIC (inner)
&& DECL_CONTEXT (inner) == current_function_decl)
warning_at (loc,
- 0, "function returns address of local variable");
+ OPT_Wreturn_local_addr, "function returns address "
+ "of local variable");
break;
default:
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 86050da..1eb1fe4 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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>
PR c++/55081
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 2514b6f..5d8c27d 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -8020,14 +8020,14 @@ maybe_warn_about_returning_address_of_local (tree retval)
if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
|| TREE_CODE (whats_returned) == TARGET_EXPR)
{
- warning (0, "returning reference to temporary");
+ warning (OPT_Wreturn_local_addr, "returning reference to temporary");
return;
}
if (TREE_CODE (whats_returned) == VAR_DECL
&& 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;
}
}
@@ -8043,10 +8043,10 @@ maybe_warn_about_returning_address_of_local (tree retval)
|| TREE_PUBLIC (whats_returned)))
{
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);
else
- warning (0, "address of local variable %q+D returned",
+ warning (OPT_Wreturn_local_addr, "address of local variable %q+D returned",
whats_returned);
return;
}
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 15ecaf1..720d42d 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -261,7 +261,7 @@ Objective-C and Objective-C++ Dialects}.
-Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded @gol
-Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format @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
-Wsign-compare -Wsign-conversion -Wsizeof-pointer-memaccess @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++.
+@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
@opindex Wreturn-type
@opindex Wno-return-type
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 80e9289..f6a8122 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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>
PR middle-end/55116
diff --git a/gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C b/gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C
new file mode 100644
index 0000000..e15bfa2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C
@@ -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();
+}
diff --git a/gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C
new file mode 100644
index 0000000..faa3a34
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C
@@ -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" }
+}
diff --git a/gcc/testsuite/gcc.dg/Wreturn-local-addr.c b/gcc/testsuite/gcc.dg/Wreturn-local-addr.c
new file mode 100644
index 0000000..d496d20
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wreturn-local-addr.c
@@ -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" } */
+}