OSDN Git Service

gcc/c-family:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Oct 2012 23:21:35 +0000 (23:21 +0000)
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 29 Oct 2012 23:21:35 +0000 (23:21 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192968 138bc75d-0d04-0410-961f-82ee72b054a4

12 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c.opt
gcc/c/ChangeLog
gcc/c/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wno-return-local-addr.C [new file with mode: 0644]
gcc/testsuite/g++.dg/warn/Wreturn-local-addr.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/Wreturn-local-addr.c [new file with mode: 0644]

index 33f3497..9daf727 100644 (file)
@@ -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.
index f97057e..f7c9422 100644 (file)
@@ -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.
index 7eb66c6..06d6e36 100644 (file)
@@ -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++)
index f44131b..cd3a457 100644 (file)
@@ -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
index 4855933..cf63355 100644 (file)
@@ -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:
index 86050da..1eb1fe4 100644 (file)
@@ -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
index 2514b6f..5d8c27d 100644 (file)
@@ -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;
     }
index 15ecaf1..720d42d 100644 (file)
@@ -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
index 80e9289..f6a8122 100644 (file)
@@ -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 (file)
index 0000000..e15bfa2
--- /dev/null
@@ -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 (file)
index 0000000..faa3a34
--- /dev/null
@@ -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 (file)
index 0000000..d496d20
--- /dev/null
@@ -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" } */
+}