Commit a0d9f322 by Benjamin Kosnik

decl.c (pushdecl_class_level): Add warning here.

P
1998-09-03  Benjamin Kosnik  <bkoz@rhino.cygnus.com>
        * decl.c (pushdecl_class_level): Add warning here.
        (pushdecl): Tweak.

From-SVN: r22210
parent 343a4a0e
...@@ -3671,12 +3671,12 @@ pushdecl (x) ...@@ -3671,12 +3671,12 @@ pushdecl (x)
warning (warnstring, IDENTIFIER_POINTER (name)); warning (warnstring, IDENTIFIER_POINTER (name));
} }
/* Check to see if decl redeclares a template parameter. */ /* Check to see if decl redeclares a template parameter. */
if (oldlocal && (current_class_type || current_function_decl ) if (oldlocal && (current_class_type || current_function_decl)
&& current_template_parms) && current_template_parms)
{ {
if (decl_template_parm_p (oldlocal)) if (decl_template_parm_p (oldlocal))
{ {
cp_error ("redeclaration of template parameter `%T'", name); cp_error ("re-using name of template parameter `%T' in this scope", name);
cp_error_at (" previously declared here `%#D'", oldlocal); cp_error_at (" previously declared here `%#D'", oldlocal);
} }
} }
...@@ -3812,10 +3812,10 @@ pushdecl_class_level (x) ...@@ -3812,10 +3812,10 @@ pushdecl_class_level (x)
{ {
/* A name N used in a class S shall refer to the same declaration /* A name N used in a class S shall refer to the same declaration
in its context and when re-evaluated in the completed scope of S. in its context and when re-evaluated in the completed scope of S.
Types, enums, and static vars are checked here; other Types, enums, and static vars are checked here; other
members are checked in finish_struct. */ members are checked in finish_struct. */
tree icv = IDENTIFIER_CLASS_VALUE (name); tree icv = IDENTIFIER_CLASS_VALUE (name);
tree ilv = IDENTIFIER_LOCAL_VALUE (name);
if (icv && icv != x if (icv && icv != x
&& flag_optional_diags && flag_optional_diags
...@@ -3829,6 +3829,18 @@ pushdecl_class_level (x) ...@@ -3829,6 +3829,18 @@ pushdecl_class_level (x)
cp_pedwarn_at ("conflicts with previous use in class as `%#D'", cp_pedwarn_at ("conflicts with previous use in class as `%#D'",
icv); icv);
} }
/* Check to see if decl redeclares a template parameter. */
if (ilv && ! decls_match (ilv, x)
&& (current_class_type || current_function_decl)
&& current_template_parms)
{
if (decl_template_parm_p (ilv))
{
cp_error ("re-using name of template parameter `%T' in this scope", name);
cp_error_at (" previously declared here `%#D'", ilv);
}
}
} }
push_class_level_binding (name, x); push_class_level_binding (name, x);
......
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