diff options
author | Joseph Myers <joseph@codesourcery.com> | 2005-03-21 02:22:08 +0000 |
---|---|---|
committer | Joseph Myers <jsm28@gcc.gnu.org> | 2005-03-21 02:22:08 +0000 |
commit | 37dc0d8dc7248b0495b56a26ca436f3980271587 (patch) | |
tree | 4f046755cca3d6be85f4cf05610ef5313e865404 /gcc | |
parent | 5aff41479e6606793f74dfd9d5870eaebc267014 (diff) | |
download | gcc-37dc0d8dc7248b0495b56a26ca436f3980271587.zip gcc-37dc0d8dc7248b0495b56a26ca436f3980271587.tar.gz gcc-37dc0d8dc7248b0495b56a26ca436f3980271587.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/c-common.c | 50 | ||||
-rw-r--r-- | gcc/c-common.h | 5 | ||||
-rw-r--r-- | gcc/c-typeck.c | 20 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 2 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 16 |
7 files changed, 75 insertions, 33 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d9355e4..34e1a5d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2005-03-21 Joseph S. Myers <joseph@codesourcery.com> + + * 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 <amodra@bigpond.net.au> * config/rs6000/rs6000.c (rs6000_parm_start): New function. diff --git a/gcc/c-common.c b/gcc/c-common.c index 1851836..9c6a9d1 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 91be602..64daf34 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 0595b88..d5046d5 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 f43fe55..76c1305 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2005-03-21 Joseph S. Myers <joseph@codesourcery.com> + + * cp-tree.h (lvalue_or_else, lvalue_p): New. + * typeck.c (lvalue_or_else): New. Call lvalue_error. + 2005-03-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> PR c++/20240 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 466d4dd..e76e216 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 1639b54..c2adb1c 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; +} |