re PR c++/63203 (Self-initialization of reference not diagnosed if it occurs within...
authorJonathan Wakely <jwakely@redhat.com>
Mon, 24 Nov 2014 13:35:08 +0000 (13:35 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 24 Nov 2014 13:35:08 +0000 (13:35 +0000)
/cp
2014-11-24  Jonathan Wakely  <jwakely@redhat.com>
    Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/63203
* decl.c (initialize_local_var): Add -Winit-self warning for
references initialized with themselves.

/testsuite
2014-11-24  Jonathan Wakely  <jwakely@redhat.com>
    Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/63203
* g++.dg/warn/Winit-self-2.C: New.

Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>
From-SVN: r218017

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Winit-self-2.C [new file with mode: 0644]

index d23bad5b9143381f5dcaf43ab5e431a9bf3ec2bb..7f17929c20a77ca555e3a31703f3a920c83f4af0 100644 (file)
@@ -1,3 +1,10 @@
+2014-11-24  Jonathan Wakely  <jwakely@redhat.com>
+           Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/63203
+       * decl.c (initialize_local_var): Add -Winit-self warning for
+       references initialized with themselves.
+
 2014-11-24  Jason Merrill  <jason@redhat.com>
 
        PR c++/63942
index 225d4089882e8aab13cb6894a50c55a7094a91a7..4ce4645679e617525fd067fe5525b712d0862745 100644 (file)
@@ -6132,13 +6132,23 @@ initialize_local_var (tree decl, tree init)
   /* Perform the initialization.  */
   if (init)
     {
-      if (TREE_CODE (init) == INIT_EXPR
-         && !TREE_SIDE_EFFECTS (TREE_OPERAND (init, 1)))
+      tree rinit = (TREE_CODE (init) == INIT_EXPR
+                   ? TREE_OPERAND (init, 1) : NULL_TREE);
+      if (rinit && !TREE_SIDE_EFFECTS (rinit))
        {
          /* Stick simple initializers in DECL_INITIAL so that
             -Wno-init-self works (c++/34772).  */
          gcc_assert (TREE_OPERAND (init, 0) == decl);
-         DECL_INITIAL (decl) = TREE_OPERAND (init, 1);
+         DECL_INITIAL (decl) = rinit;
+
+         if (warn_init_self && TREE_CODE (type) == REFERENCE_TYPE)
+           {
+             STRIP_NOPS (rinit);
+             if (rinit == decl)
+               warning_at (DECL_SOURCE_LOCATION (decl),
+                           OPT_Winit_self,
+                           "reference %qD is initialized with itself", decl);
+           }
        }
       else
        {
index 07b00cf2bb4f4cc73b1c33820cd7be1f08c4011b..a9ac86bd33cc204525c8cc04c082660d7f8f2266 100644 (file)
@@ -1,3 +1,9 @@
+2014-11-24  Jonathan Wakely  <jwakely@redhat.com>
+           Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/63203
+       * g++.dg/warn/Winit-self-2.C: New.
+
 2014-11-24  Petr Murzin  <petr.murzin@intel.com>
 
        * gcc.target/i386/extract-insert-combining.c: New test.
diff --git a/gcc/testsuite/g++.dg/warn/Winit-self-2.C b/gcc/testsuite/g++.dg/warn/Winit-self-2.C
new file mode 100644 (file)
index 0000000..a619d5a
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/63203
+// { dg-options "-Winit-self" }
+
+struct string { };
+
+int main()
+{
+  for (int ii = 0; ii < 1; ++ii)
+  {
+    const string& str = str;  // { dg-warning "is initialized with itself" }
+  }
+}