Commit 37dc0d8d by Joseph Myers Committed by Joseph Myers

c-common.c (lvalue_or_else): Replace by lvalue_error; only give diagnostic…

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
parent 5aff4147
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> 2005-03-21 Alan Modra <amodra@bigpond.net.au>
* config/rs6000/rs6000.c (rs6000_parm_start): New function. * config/rs6000/rs6000.c (rs6000_parm_start): New function.
......
...@@ -5721,17 +5721,12 @@ fold_offsetof (tree expr) ...@@ -5721,17 +5721,12 @@ fold_offsetof (tree expr)
return convert (size_type_node, fold_offsetof_1 (expr)); return convert (size_type_node, fold_offsetof_1 (expr));
} }
/* Return nonzero if REF is an lvalue valid for this language; /* Print an error message for an invalid lvalue. USE says
otherwise, print an error message and return zero. USE says
how the lvalue is being used and so selects the error message. */ how the lvalue is being used and so selects the error message. */
int void
lvalue_or_else (tree ref, enum lvalue_use use) lvalue_error (enum lvalue_use use)
{ {
int win = lvalue_p (ref);
if (!win)
{
switch (use) switch (use)
{ {
case lv_assign: case lv_assign:
...@@ -5752,9 +5747,6 @@ lvalue_or_else (tree ref, enum lvalue_use use) ...@@ -5752,9 +5747,6 @@ lvalue_or_else (tree ref, enum lvalue_use use)
default: default:
gcc_unreachable (); gcc_unreachable ();
} }
}
return win;
} }
#include "gt-c-common.h" #include "gt-c-common.h"
...@@ -808,7 +808,6 @@ extern tree build_break_stmt (void); ...@@ -808,7 +808,6 @@ extern tree build_break_stmt (void);
extern tree build_unary_op (enum tree_code, tree, int); extern tree build_unary_op (enum tree_code, tree, int);
extern tree build_binary_op (enum tree_code, tree, tree, int); extern tree build_binary_op (enum tree_code, tree, tree, int);
extern int lvalue_p (tree);
extern tree default_conversion (tree); extern tree default_conversion (tree);
/* Given two integer or real types, return the type for their sum. /* Given two integer or real types, return the type for their sum.
...@@ -877,7 +876,7 @@ extern void verify_sequence_points (tree); ...@@ -877,7 +876,7 @@ extern void verify_sequence_points (tree);
extern tree fold_offsetof (tree); extern tree fold_offsetof (tree);
/* Places where an lvalue, or modifiable lvalue, may be required. /* 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. */ readonly_error. */
enum lvalue_use { enum lvalue_use {
lv_assign, lv_assign,
...@@ -887,7 +886,7 @@ enum lvalue_use { ...@@ -887,7 +886,7 @@ enum lvalue_use {
lv_asm lv_asm
}; };
extern int lvalue_or_else (tree, enum lvalue_use); extern void lvalue_error (enum lvalue_use);
/* In c-gimplify.c */ /* In c-gimplify.c */
extern void c_genericize (tree); extern void c_genericize (tree);
......
...@@ -100,6 +100,8 @@ static void set_nonincremental_init (void); ...@@ -100,6 +100,8 @@ static void set_nonincremental_init (void);
static void set_nonincremental_init_from_string (tree); static void set_nonincremental_init_from_string (tree);
static tree find_init_member (tree); static tree find_init_member (tree);
static void readonly_error (tree, enum lvalue_use); 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); static void record_maybe_used_decl (tree);
/* Do `exp = require_complete_type (exp);' to make sure exp /* 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) ...@@ -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 be assigned, unless their type has TYPE_READONLY.
Lvalues can have their address taken, unless they have C_DECL_REGISTER. */ Lvalues can have their address taken, unless they have C_DECL_REGISTER. */
int static int
lvalue_p (tree ref) lvalue_p (tree ref)
{ {
enum tree_code code = TREE_CODE (ref); enum tree_code code = TREE_CODE (ref);
...@@ -2808,6 +2810,22 @@ readonly_error (tree arg, enum lvalue_use use) ...@@ -2808,6 +2810,22 @@ readonly_error (tree arg, enum lvalue_use use)
N_("decrement 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 /* Mark EXP saying that we need to be able to take the
address of it; it should not be allocated in a register. address of it; it should not be allocated in a register.
Returns true if successful. */ Returns true if successful. */
......
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> 2005-03-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/20240 PR c++/20240
......
...@@ -4332,6 +4332,8 @@ extern tree lookup_anon_field (tree, tree); ...@@ -4332,6 +4332,8 @@ extern tree lookup_anon_field (tree, tree);
extern bool invalid_nonstatic_memfn_p (tree); extern bool invalid_nonstatic_memfn_p (tree);
extern tree convert_member_func_to_ptr (tree, tree); extern tree convert_member_func_to_ptr (tree, tree);
extern tree convert_ptrmem (tree, tree, bool, bool); 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 */ /* in typeck2.c */
extern void require_complete_eh_spec_types (tree, tree); extern void require_complete_eh_spec_types (tree, tree);
......
...@@ -6513,3 +6513,19 @@ non_reference (tree t) ...@@ -6513,3 +6513,19 @@ non_reference (tree t)
t = TREE_TYPE (t); t = TREE_TYPE (t);
return 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment