From 37dc0d8dc7248b0495b56a26ca436f3980271587 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Mon, 21 Mar 2005 02:22:08 +0000 Subject: [PATCH] c-common.c (lvalue_or_else): Replace by lvalue_error; only give diagnostic without checking whether an lvalue. * c-common.c (lvalue_or_else): Replace by lvalue_error; only give diagnostic without checking whether an lvalue. * c-common.h (lvalue_p): Remove. (enum lvalue_use): Update comment. (lvalue_or_else): Replace by lvalue_error. * c-typeck.c (lvalue_p): Make static. (lvalue_or_else): New. Call lvalue_error. cp: * cp-tree.h (lvalue_or_else, lvalue_p): New. * typeck.c (lvalue_or_else): New. Call lvalue_error. From-SVN: r96776 --- gcc/ChangeLog | 10 ++++++++++ gcc/c-common.c | 50 ++++++++++++++++++++---------------------------- gcc/c-common.h | 5 ++--- gcc/c-typeck.c | 20 ++++++++++++++++++- gcc/cp/ChangeLog | 5 +++++ gcc/cp/cp-tree.h | 2 ++ gcc/cp/typeck.c | 16 ++++++++++++++++ 7 files changed, 75 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d9355e4082a..34e1a5ddbb2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2005-03-21 Joseph S. Myers + + * c-common.c (lvalue_or_else): Replace by lvalue_error; only give + diagnostic without checking whether an lvalue. + * c-common.h (lvalue_p): Remove. + (enum lvalue_use): Update comment. + (lvalue_or_else): Replace by lvalue_error. + * c-typeck.c (lvalue_p): Make static. + (lvalue_or_else): New. Call lvalue_error. + 2005-03-21 Alan Modra * config/rs6000/rs6000.c (rs6000_parm_start): New function. diff --git a/gcc/c-common.c b/gcc/c-common.c index 1851836e9df..9c6a9d141af 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -5721,40 +5721,32 @@ fold_offsetof (tree expr) return convert (size_type_node, fold_offsetof_1 (expr)); } -/* Return nonzero if REF is an lvalue valid for this language; - otherwise, print an error message and return zero. USE says +/* Print an error message for an invalid lvalue. USE says how the lvalue is being used and so selects the error message. */ -int -lvalue_or_else (tree ref, enum lvalue_use use) +void +lvalue_error (enum lvalue_use use) { - int win = lvalue_p (ref); - - if (!win) + switch (use) { - switch (use) - { - case lv_assign: - error ("invalid lvalue in assignment"); - break; - case lv_increment: - error ("invalid lvalue in increment"); - break; - case lv_decrement: - error ("invalid lvalue in decrement"); - break; - case lv_addressof: - error ("invalid lvalue in unary %<&%>"); - break; - case lv_asm: - error ("invalid lvalue in asm statement"); - break; - default: - gcc_unreachable (); - } + case lv_assign: + error ("invalid lvalue in assignment"); + break; + case lv_increment: + error ("invalid lvalue in increment"); + break; + case lv_decrement: + error ("invalid lvalue in decrement"); + break; + case lv_addressof: + error ("invalid lvalue in unary %<&%>"); + break; + case lv_asm: + error ("invalid lvalue in asm statement"); + break; + default: + gcc_unreachable (); } - - return win; } #include "gt-c-common.h" diff --git a/gcc/c-common.h b/gcc/c-common.h index 91be602066b..64daf34b440 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -808,7 +808,6 @@ extern tree build_break_stmt (void); extern tree build_unary_op (enum tree_code, tree, int); extern tree build_binary_op (enum tree_code, tree, tree, int); -extern int lvalue_p (tree); extern tree default_conversion (tree); /* Given two integer or real types, return the type for their sum. @@ -877,7 +876,7 @@ extern void verify_sequence_points (tree); extern tree fold_offsetof (tree); /* Places where an lvalue, or modifiable lvalue, may be required. - Used to select diagnostic messages in lvalue_or_else and + Used to select diagnostic messages in lvalue_error and readonly_error. */ enum lvalue_use { lv_assign, @@ -887,7 +886,7 @@ enum lvalue_use { lv_asm }; -extern int lvalue_or_else (tree, enum lvalue_use); +extern void lvalue_error (enum lvalue_use); /* In c-gimplify.c */ extern void c_genericize (tree); diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index 0595b88b877..d5046d5f425 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -100,6 +100,8 @@ static void set_nonincremental_init (void); static void set_nonincremental_init_from_string (tree); static tree find_init_member (tree); static void readonly_error (tree, enum lvalue_use); +static int lvalue_or_else (tree, enum lvalue_use); +static int lvalue_p (tree); static void record_maybe_used_decl (tree); /* Do `exp = require_complete_type (exp);' to make sure exp @@ -2742,7 +2744,7 @@ build_unary_op (enum tree_code code, tree xarg, int flag) Lvalues can be assigned, unless their type has TYPE_READONLY. Lvalues can have their address taken, unless they have C_DECL_REGISTER. */ -int +static int lvalue_p (tree ref) { enum tree_code code = TREE_CODE (ref); @@ -2807,6 +2809,22 @@ readonly_error (tree arg, enum lvalue_use use) N_("increment of read-only location"), N_("decrement of read-only location"))); } + + +/* Return nonzero if REF is an lvalue valid for this language; + otherwise, print an error message and return zero. USE says + how the lvalue is being used and so selects the error message. */ + +static int +lvalue_or_else (tree ref, enum lvalue_use use) +{ + int win = lvalue_p (ref); + + if (!win) + lvalue_error (use); + + return win; +} /* Mark EXP saying that we need to be able to take the address of it; it should not be allocated in a register. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f43fe55e275..76c1305bea6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2005-03-21 Joseph S. Myers + + * cp-tree.h (lvalue_or_else, lvalue_p): New. + * typeck.c (lvalue_or_else): New. Call lvalue_error. + 2005-03-19 Kriang Lerdsuwanakij PR c++/20240 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 466d4dd8e8c..e76e216a065 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -4332,6 +4332,8 @@ extern tree lookup_anon_field (tree, tree); extern bool invalid_nonstatic_memfn_p (tree); extern tree convert_member_func_to_ptr (tree, tree); extern tree convert_ptrmem (tree, tree, bool, bool); +extern int lvalue_or_else (tree, enum lvalue_use); +extern int lvalue_p (tree); /* in typeck2.c */ extern void require_complete_eh_spec_types (tree, tree); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 1639b54532b..c2adb1c7fd4 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -6513,3 +6513,19 @@ non_reference (tree t) t = TREE_TYPE (t); return t; } + + +/* Return nonzero if REF is an lvalue valid for this language; + otherwise, print an error message and return zero. USE says + how the lvalue is being used and so selects the error message. */ + +int +lvalue_or_else (tree ref, enum lvalue_use use) +{ + int win = lvalue_p (ref); + + if (!win) + lvalue_error (use); + + return win; +} -- 2.30.2