cp:server: command not found.

PR c++/775
        * decl.c (lookup_tag): Only reject enum/class mismatch, not
        class/union mismatch.
        * parse.y (check_class_key): New function.
        (structsp): Call it.
testsuite:
        * g++.dg/other/classkey1.C: New test.

From-SVN: r50232
This commit is contained in:
Nathan Sidwell 2002-03-02 19:54:36 +00:00 committed by Nathan Sidwell
parent d027397a34
commit 30bda92357
4 changed files with 31 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2002-03-02 Nathan Sidwell <nathan@codesourcery.com>
PR c++/775
* decl.c (lookup_tag): Only reject enum/class mismatch, not
class/union mismatch.
* parse.y (check_class_key): New function.
(structsp): Call it.
2002-03-01 Michael Matz <matz@suse.de>
* typeck.c (cp_pointer_int_sum): Complete inner type which is

View File

@ -5345,7 +5345,7 @@ lookup_tag (form, name, binding_level, thislevel_only)
if (old && DECL_ORIGINAL_TYPE (TYPE_NAME (old)))
old = NULL_TREE;
if (old && TREE_CODE (old) != form
&& !(form != ENUMERAL_TYPE && TREE_CODE (old) == TEMPLATE_DECL))
&& (form == ENUMERAL_TYPE || TREE_CODE (old) == ENUMERAL_TYPE))
{
error ("`%#D' redeclared as %C", old, form);
return NULL_TREE;
@ -5361,14 +5361,12 @@ lookup_tag (form, name, binding_level, thislevel_only)
if (TREE_PURPOSE (tail) == name)
{
enum tree_code code = TREE_CODE (TREE_VALUE (tail));
/* Should tighten this up; it'll probably permit
UNION_TYPE and a struct template, for example. */
if (code != form
&& !(form != ENUMERAL_TYPE && code == TEMPLATE_DECL))
&& (form == ENUMERAL_TYPE || code == ENUMERAL_TYPE))
{
/* Definition isn't the kind we were looking for. */
error ("`%#D' redeclared as %C", TREE_VALUE (tail),
form);
error ("`%#D' redeclared as %C", TREE_VALUE (tail), form);
return NULL_TREE;
}
return TREE_VALUE (tail);

View File

@ -87,7 +87,8 @@ static tree parse_field PARAMS ((tree, tree, tree, tree));
static tree parse_bitfield0 PARAMS ((tree, tree, tree, tree, tree));
static tree parse_bitfield PARAMS ((tree, tree, tree));
static tree parse_method PARAMS ((tree, tree, tree));
static void frob_specs PARAMS ((tree, tree));
static void frob_specs PARAMS ((tree, tree));
static void check_class_key PARAMS ((tree, tree));
/* Cons up an empty parameter list. */
static inline tree
@ -208,6 +209,17 @@ parse_method (declarator, specs_attrs, lookups)
return d;
}
static void
check_class_key (key, aggr)
tree key;
tree aggr;
{
if ((key == union_type_node) != (TREE_CODE (aggr) == UNION_TYPE))
pedwarn ("`%s' tag used in naming `%#T'",
key == union_type_node ? "union"
: key == record_type_node ? "struct" : "class", aggr);
}
void
cp_parse_init ()
{
@ -2292,6 +2304,7 @@ structsp:
xref_basetypes (current_aggr, $1.t, type, $2);
}
$1.t = begin_class_definition (TREE_TYPE ($1.t));
check_class_key (current_aggr, $1.t);
current_aggr = NULL_TREE; }
opt.component_decl_list '}' maybe_attribute
{
@ -2326,6 +2339,7 @@ structsp:
{
$$.t = TREE_TYPE ($1.t);
$$.new_type_flag = $1.new_type_flag;
check_class_key (current_aggr, $$.t);
}
;

View File

@ -1,3 +1,7 @@
2002-03-02 Nathan Sidwell <nathan@codesourcery.com>
* g++.dg/other/classkey1.C: New test.
2002-03-01 Richard Henderson <rth@redhat.com>
* gcc.c-torture/compile/981223-1.x: New.