aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@cygnus.co.uk>2000-03-01 17:16:35 +0000
committerBernd Schmidt <crux@gcc.gnu.org>2000-03-01 17:16:35 +0000
commit2bfa73e4182ed0a3ed7c7e7c80491d0bc8f511fc (patch)
treedb3d9e8220bc7efd9442c0794b8cd8dba8fc3c72 /gcc
parent765a46f99ec9bcaa90a593c977365853ba01bac1 (diff)
downloadgcc-2bfa73e4182ed0a3ed7c7e7c80491d0bc8f511fc.zip
gcc-2bfa73e4182ed0a3ed7c7e7c80491d0bc8f511fc.tar.gz
gcc-2bfa73e4182ed0a3ed7c7e7c80491d0bc8f511fc.tar.bz2
Reorganize some warning code
From-SVN: r32282
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/typeck.c75
2 files changed, 41 insertions, 39 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index aec6e4e..e42c764 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index ceed9c5..dd246af 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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;
}
}