* macrotab.c (check_for_redefinition): Don't complain if the new
definition is the same as the previous one. Take more arguments to allow the comparison. (macro_define_object, macro_define_function): Pass more arguments to check_for_redefinition.
This commit is contained in:
parent
277254ba88
commit
0a3d042596
|
@ -1,3 +1,11 @@
|
||||||
|
2002-05-23 Jim Blandy <jimb@redhat.com>
|
||||||
|
|
||||||
|
* macrotab.c (check_for_redefinition): Don't complain if the new
|
||||||
|
definition is the same as the previous one. Take more arguments
|
||||||
|
to allow the comparison.
|
||||||
|
(macro_define_object, macro_define_function): Pass more arguments
|
||||||
|
to check_for_redefinition.
|
||||||
|
|
||||||
2002-05-22 Michael Snyder <msnyder@redhat.com>
|
2002-05-22 Michael Snyder <msnyder@redhat.com>
|
||||||
|
|
||||||
* d10v-tdep.c: Change a few macros to enums for ease of debugging.
|
* d10v-tdep.c: Change a few macros to enums for ease of debugging.
|
||||||
|
|
|
@ -660,27 +660,64 @@ find_definition (const char *name,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* If NAME already has a definition in scope at LINE in FILE, and
|
/* If NAME already has a definition in scope at LINE in SOURCE, return
|
||||||
return the key. Otherwise, return zero. */
|
the key. If the old definition is different from the definition
|
||||||
|
given by KIND, ARGC, ARGV, and REPLACEMENT, complain, too.
|
||||||
|
Otherwise, return zero. (ARGC and ARGV are meaningless unless KIND
|
||||||
|
is `macro_function_like'.) */
|
||||||
static struct macro_key *
|
static struct macro_key *
|
||||||
check_for_redefinition (struct macro_source_file *source, int line,
|
check_for_redefinition (struct macro_source_file *source, int line,
|
||||||
const char *name)
|
const char *name, enum macro_kind kind,
|
||||||
|
int argc, const char **argv,
|
||||||
|
const char *replacement)
|
||||||
{
|
{
|
||||||
splay_tree_node n = find_definition (name, source, line);
|
splay_tree_node n = find_definition (name, source, line);
|
||||||
|
|
||||||
/* This isn't really right. There's nothing wrong with redefining a
|
|
||||||
macro if the new replacement list is the same as the old one. */
|
|
||||||
if (n)
|
if (n)
|
||||||
{
|
{
|
||||||
struct macro_key *found_key = (struct macro_key *) n->key;
|
struct macro_key *found_key = (struct macro_key *) n->key;
|
||||||
static struct complaint macro_redefined = {
|
struct macro_definition *found_def
|
||||||
"macro `%s' redefined at %s:%d;"
|
= (struct macro_definition *) n->value;
|
||||||
"original definition at %s:%d", 0, 0
|
int same = 1;
|
||||||
};
|
|
||||||
complain (¯o_redefined, name,
|
/* Is this definition the same as the existing one?
|
||||||
source->filename, line,
|
According to the standard, this comparison needs to be done
|
||||||
found_key->start_file->filename,
|
on lists of tokens, not byte-by-byte, as we do here. But
|
||||||
found_key->start_line);
|
that's too hard for us at the moment, and comparing
|
||||||
|
byte-by-byte will only yield false negatives (i.e., extra
|
||||||
|
warning messages), not false positives (i.e., unnoticed
|
||||||
|
definition changes). */
|
||||||
|
if (kind != found_def->kind)
|
||||||
|
same = 0;
|
||||||
|
else if (strcmp (replacement, found_def->replacement))
|
||||||
|
same = 0;
|
||||||
|
else if (kind == macro_function_like)
|
||||||
|
{
|
||||||
|
if (argc != found_def->argc)
|
||||||
|
same = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < argc; i++)
|
||||||
|
if (strcmp (argv[i], found_def->argv[i]))
|
||||||
|
same = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! same)
|
||||||
|
{
|
||||||
|
static struct complaint macro_redefined = {
|
||||||
|
"macro `%s' redefined at %s:%d; original definition at %s:%d",
|
||||||
|
0, 0
|
||||||
|
};
|
||||||
|
complain (¯o_redefined,
|
||||||
|
name,
|
||||||
|
source->filename, line,
|
||||||
|
found_key->start_file->filename,
|
||||||
|
found_key->start_line);
|
||||||
|
}
|
||||||
|
|
||||||
return found_key;
|
return found_key;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -696,7 +733,10 @@ macro_define_object (struct macro_source_file *source, int line,
|
||||||
struct macro_key *k;
|
struct macro_key *k;
|
||||||
struct macro_definition *d;
|
struct macro_definition *d;
|
||||||
|
|
||||||
k = check_for_redefinition (source, line, name);
|
k = check_for_redefinition (source, line,
|
||||||
|
name, macro_object_like,
|
||||||
|
0, 0,
|
||||||
|
replacement);
|
||||||
|
|
||||||
/* If we're redefining a symbol, and the existing key would be
|
/* If we're redefining a symbol, and the existing key would be
|
||||||
identical to our new key, then the splay_tree_insert function
|
identical to our new key, then the splay_tree_insert function
|
||||||
|
@ -726,7 +766,10 @@ macro_define_function (struct macro_source_file *source, int line,
|
||||||
struct macro_key *k;
|
struct macro_key *k;
|
||||||
struct macro_definition *d;
|
struct macro_definition *d;
|
||||||
|
|
||||||
k = check_for_redefinition (source, line, name);
|
k = check_for_redefinition (source, line,
|
||||||
|
name, macro_function_like,
|
||||||
|
argc, argv,
|
||||||
|
replacement);
|
||||||
|
|
||||||
/* See comments about duplicate keys in macro_define_object. */
|
/* See comments about duplicate keys in macro_define_object. */
|
||||||
if (k && ! key_compare (k, name, source, line))
|
if (k && ! key_compare (k, name, source, line))
|
||||||
|
|
Loading…
Reference in New Issue