Reorganize some warning code
authorBernd Schmidt <bernds@cygnus.co.uk>
Wed, 1 Mar 2000 17:16:35 +0000 (17:16 +0000)
committerBernd Schmidt <crux@gcc.gnu.org>
Wed, 1 Mar 2000 17:16:35 +0000 (17:16 +0000)
From-SVN: r32282

gcc/cp/ChangeLog
gcc/cp/typeck.c

index aec6e4e..e42c764 100644 (file)
@@ -1,3 +1,8 @@
+2000-03-01  Bernd Schmidt  <bernds@cygnus.co.uk>
+
+       * typeck.c (maybe_warn_about_returning_address_of_local): Reorganize
+       to merge reference/pointer code and fix incorrect warnings.
+
 2000-02-29  Jason Merrill  <jason@casey.cygnus.com>
 
        * search.c (protected_accessible_p): Use context_for_name_lookup.
index ceed9c5..dd246af 100644 (file)
@@ -6705,59 +6705,56 @@ maybe_warn_about_returning_address_of_local (retval)
      tree retval;
 {
   tree valtype = TREE_TYPE (DECL_RESULT (current_function_decl));
+  tree whats_returned = retval;
 
-  if (TREE_CODE (valtype) == REFERENCE_TYPE)
+  for (;;)
     {
-      tree whats_returned;
-
-      /* Sort through common things to see what it is
-        we are returning.  */
-      whats_returned = retval;
       if (TREE_CODE (whats_returned) == COMPOUND_EXPR)
-       {
-         whats_returned = TREE_OPERAND (whats_returned, 1);
-         if (TREE_CODE (whats_returned) == ADDR_EXPR)
-           whats_returned = TREE_OPERAND (whats_returned, 0);
-       }
-      while (TREE_CODE (whats_returned) == CONVERT_EXPR
-            || TREE_CODE (whats_returned) == NOP_EXPR)
+       whats_returned = TREE_OPERAND (whats_returned, 1);
+      else if (TREE_CODE (whats_returned) == CONVERT_EXPR
+              || TREE_CODE (whats_returned) == NON_LVALUE_EXPR
+              || TREE_CODE (whats_returned) == NOP_EXPR)
        whats_returned = TREE_OPERAND (whats_returned, 0);
-      if (TREE_CODE (whats_returned) == ADDR_EXPR)
+      else
+       break;
+    }
+
+  if (TREE_CODE (whats_returned) != ADDR_EXPR)
+    return;
+  whats_returned = TREE_OPERAND (whats_returned, 0);      
+
+  if (TREE_CODE (valtype) == REFERENCE_TYPE)
+    {
+      if (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
+         || TREE_CODE (whats_returned) == TARGET_EXPR)
        {
+         /* Get the target.  */
          whats_returned = TREE_OPERAND (whats_returned, 0);
-         while (TREE_CODE (whats_returned) == AGGR_INIT_EXPR
-                || TREE_CODE (whats_returned) == TARGET_EXPR)
-           {
-             /* Get the target.  */
-             whats_returned = TREE_OPERAND (whats_returned, 0);
-             warning ("returning reference to temporary");
-           }
+         warning ("returning reference to temporary");
+         return;
        }
-
       if (TREE_CODE (whats_returned) == VAR_DECL 
-         && DECL_NAME (whats_returned))
+         && DECL_NAME (whats_returned)
+         && TEMP_NAME_P (DECL_NAME (whats_returned)))
        {
-         if (TEMP_NAME_P (DECL_NAME (whats_returned)))
-           warning ("reference to non-lvalue returned");
-         else if (TREE_CODE (TREE_TYPE (whats_returned)) != REFERENCE_TYPE
-                  && DECL_FUNCTION_SCOPE_P (whats_returned)
-                  && !(TREE_STATIC (whats_returned)
-                       || TREE_PUBLIC (whats_returned)))
-           cp_warning_at ("reference to local variable `%D' returned", 
-                          whats_returned);
+         warning ("reference to non-lvalue returned");
+         return;
        }
     }
-  else if (TREE_CODE (retval) == ADDR_EXPR)
-    {
-      tree whats_returned = TREE_OPERAND (retval, 0);
 
-      if (TREE_CODE (whats_returned) == VAR_DECL
-         && DECL_NAME (whats_returned)
-         && DECL_FUNCTION_SCOPE_P (whats_returned)
-         && !(TREE_STATIC (whats_returned)
-              || TREE_PUBLIC (whats_returned)))
+  if (TREE_CODE (whats_returned) == VAR_DECL
+      && DECL_NAME (whats_returned)
+      && DECL_FUNCTION_SCOPE_P (whats_returned)
+      && !(TREE_STATIC (whats_returned)
+          || TREE_PUBLIC (whats_returned)))
+    {
+      if (TREE_CODE (valtype) == REFERENCE_TYPE)
+       cp_warning_at ("reference to local variable `%D' returned", 
+                      whats_returned);
+      else
        cp_warning_at ("address of local variable `%D' returned", 
                       whats_returned);
+      return;
     }
 }