cp-tree.h (IDENTIFIER_TYPENAME_P): Use a flag, not strncmp.

* cp-tree.h (IDENTIFIER_TYPENAME_P): Use a flag, not strncmp.
	(DECL_CONV_FN_P): Simplify.
	(DECL_OPERATOR): Remove.
	(language_to_string): Declare.
	* decl.c (duplicate_decls): Fix typo in comment.
	(grokdeclarator): Adjust use of IDENTIFIER_TYPENAME_P.
	(grok_op_properties): Use DECL_CONV_FN_P instead of
	IDENTIFIER_TYPENAME_P.
	* dump.c (dequeue_and_dump): Dump the language linkage of
	declarations.
	* error.c (language_to_string): Give it external linkage.
	* method.c (build_typename_overload): Set IDENTIFIER_TYPENAME_P.
	(implicitly_declare_fn): Set DECL_LANGUAGE.
	* pt.c (check_explicit_specialization): Use DECL_CONV_FN_P, not
	IDENTIFIER_TYPENAME_P.
	(tsubst_decl): Likewise.
	(tsubst_copy): Adjust use of IDENTIFIER_TYPENAME_P.
	* semantics.c (finish_member_declaration): Don't mark members of
	classes declared in an extern "C" region as extern "C".

From-SVN: r34095
This commit is contained in:
Mark Mitchell 2000-05-22 22:52:32 +00:00 committed by Mark Mitchell
parent 46972a3631
commit 421844e720
8 changed files with 52 additions and 28 deletions

View File

@ -1,3 +1,25 @@
2000-05-22 Mark Mitchell <mark@codesourcery.com>
* cp-tree.h (IDENTIFIER_TYPENAME_P): Use a flag, not strncmp.
(DECL_CONV_FN_P): Simplify.
(DECL_OPERATOR): Remove.
(language_to_string): Declare.
* decl.c (duplicate_decls): Fix typo in comment.
(grokdeclarator): Adjust use of IDENTIFIER_TYPENAME_P.
(grok_op_properties): Use DECL_CONV_FN_P instead of
IDENTIFIER_TYPENAME_P.
* dump.c (dequeue_and_dump): Dump the language linkage of
declarations.
* error.c (language_to_string): Give it external linkage.
* method.c (build_typename_overload): Set IDENTIFIER_TYPENAME_P.
(implicitly_declare_fn): Set DECL_LANGUAGE.
* pt.c (check_explicit_specialization): Use DECL_CONV_FN_P, not
IDENTIFIER_TYPENAME_P.
(tsubst_decl): Likewise.
(tsubst_copy): Adjust use of IDENTIFIER_TYPENAME_P.
* semantics.c (finish_member_declaration): Don't mark members of
classes declared in an extern "C" region as extern "C".
2000-05-22 Martin v. Löwis <loewis@informatik.hu-berlin.de>
* decl2.c (qualified_lookup_using_namespace): Look through

View File

@ -73,6 +73,7 @@ Boston, MA 02111-1307, USA. */
or FIELD_DECL).
NEED_TEMPORARY_P (in REF_BIND, BASE_CONV)
SCOPE_PARTIAL_P (in SCOPE_STMT)
IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
5: BINFO_PRIMARY_MARKED_P (in BINFO)
6: BINFO_VBASE_PRIMARY_P (in BINFO)
@ -484,10 +485,8 @@ struct tree_srcloc
/* Nonzero if this identifier is the name of a type-conversion
operator. */
#define IDENTIFIER_TYPENAME_P(NODE) \
(! strncmp (IDENTIFIER_POINTER (NODE), \
OPERATOR_TYPENAME_FORMAT, \
strlen (OPERATOR_TYPENAME_FORMAT)))
#define IDENTIFIER_TYPENAME_P(NODE) \
(TREE_LANG_FLAG_4 (NODE))
/* Nonzero if this identifier is the name of a constructor or
destructor. */
@ -1972,8 +1971,8 @@ struct lang_decl
(DECL_LANG_SPECIFIC (NODE)->cloned_function)
/* Non-zero if NODE is a user-defined conversion operator. */
#define DECL_CONV_FN_P(NODE) \
(IDENTIFIER_TYPENAME_P (DECL_NAME (NODE)) && TREE_TYPE (DECL_NAME (NODE)))
#define DECL_CONV_FN_P(NODE) \
(IDENTIFIER_TYPENAME_P (DECL_NAME (NODE)))
/* Non-zero if NODE is an overloaded operator. */
#define DECL_OVERLOADED_OPERATOR_P(NODE) \
@ -2684,11 +2683,6 @@ extern int flag_new_for_scope;
#define DECL_THIS_STATIC(NODE) \
DECL_LANG_FLAG_6 (VAR_FUNCTION_OR_PARM_DECL_CHECK (NODE))
/* Nonzero in FUNCTION_DECL means it is really an operator.
Just used to communicate formatting information to dbxout.c. */
#define DECL_OPERATOR(NODE) \
(DECL_LANG_SPECIFIC(FUNCTION_DECL_CHECK (NODE))->decl_flags.operator_attr)
/* Nonzero if TYPE is an anonymous union or struct type. We have to use a
flag for this because "A union for which objects or pointers are
declared is not an anonymous union" [class.union]. */
@ -4084,6 +4078,7 @@ extern const char *context_as_string PARAMS ((tree, enum tree_string_
extern const char *lang_decl_name PARAMS ((tree, int));
extern const char *cp_file_of PARAMS ((tree));
extern int cp_line_of PARAMS ((tree));
extern const char *language_to_string PARAMS ((enum languages, int));
/* in except.c */
extern void init_exception_processing PARAMS ((void));

View File

@ -3126,9 +3126,9 @@ duplicate_decls (newdecl, olddecl)
DECL_THIS_STATIC (olddecl) = 1;
TREE_PUBLIC (olddecl) = 0;
/* Make the olddeclaration consistent with the new one so that
all remnants of the builtin-ness of this function will be
banished. */
/* Make the old declaration consistent with the new one so
that all remnants of the builtin-ness of this function
will be banished. */
DECL_LANGUAGE (olddecl) = DECL_LANGUAGE (newdecl);
DECL_RTL (olddecl) = DECL_RTL (newdecl);
DECL_ASSEMBLER_NAME (olddecl) = DECL_ASSEMBLER_NAME (newdecl);
@ -9643,9 +9643,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
dname);
name = IDENTIFIER_POINTER (dname);
}
if (! IDENTIFIER_OPNAME_P (dname)
/* GNU/Linux headers use '__op'. Arrgh. */
|| (IDENTIFIER_TYPENAME_P (dname) && ! TREE_TYPE (dname)))
else if (!IDENTIFIER_OPNAME_P (dname))
name = IDENTIFIER_POINTER (dname);
else
{
@ -12183,7 +12181,7 @@ grok_op_properties (decl, virtualp, friendp)
an enumeration, or a reference to an enumeration. 13.4.0.6 */
if (! methodp || DECL_STATIC_FUNCTION_P (decl))
{
if (IDENTIFIER_TYPENAME_P (name)
if (DECL_CONV_FN_P (decl)
|| name == ansi_opname[(int) CALL_EXPR]
|| name == ansi_opname[(int) MODIFY_EXPR]
|| name == ansi_opname[(int) COMPONENT_REF]

View File

@ -395,6 +395,8 @@ dequeue_and_dump (di)
dump_string (di, "artificial");
if (TREE_CHAIN (t))
dump_child ("chan", TREE_CHAIN (t));
if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus)
dump_string (di, language_to_string (DECL_LANGUAGE (t), 0));
}
else if (code_class == 't')
{

View File

@ -64,7 +64,6 @@ static const char *cv_to_string PARAMS ((tree, int));
static const char *decl_to_string PARAMS ((tree, int));
static const char *expr_to_string PARAMS ((tree, int));
static const char *fndecl_to_string PARAMS ((tree, int));
static const char *language_to_string PARAMS ((enum languages, int));
static const char *op_to_string PARAMS ((enum tree_code, int));
static const char *parm_to_string PARAMS ((int, int));
static const char *type_to_string PARAMS ((tree, int));
@ -2267,7 +2266,7 @@ code_to_string (c, v)
return tree_code_name [c];
}
static const char *
const char *
language_to_string (c, v)
enum languages c;
int v ATTRIBUTE_UNUSED;

View File

@ -1766,6 +1766,7 @@ build_typename_overload (type)
build_mangled_name (type, 0, 1);
id = get_identifier (obstack_base (&scratch_obstack));
IDENTIFIER_OPNAME_P (id) = 1;
IDENTIFIER_TYPENAME_P (id) = 1;
TREE_TYPE (id) = type;
end_squangling ();
return id;
@ -2580,6 +2581,9 @@ implicitly_declare_fn (kind, type, const_p)
DECL_NOT_REALLY_EXTERN (fn) = 1;
DECL_THIS_INLINE (fn) = 1;
DECL_INLINE (fn) = 1;
/* Even within an `extern "C"' block, members get C++ linkage. See
[dcl.link] for details. */
DECL_LANGUAGE (fn) = lang_cplusplus;
defer_fn (fn);
return fn;

View File

@ -1392,7 +1392,7 @@ check_explicit_specialization (declarator, decl, template_count, flags)
name = is_constructor ? ctor_identifier : dtor_identifier;
}
if (!IDENTIFIER_TYPENAME_P (name))
if (!DECL_CONV_FN_P (decl))
{
idx = lookup_fnfields_1 (ctype, name);
if (idx >= 0)
@ -5687,7 +5687,7 @@ tsubst_decl (t, args, type, in_decl)
/*complain=*/1, t,
/*entering_scope=*/1);
if (member && IDENTIFIER_TYPENAME_P (DECL_NAME (r)))
if (member && DECL_CONV_FN_P (r))
/* Type-conversion operator. Reconstruct the name, in
case it's the name of one of the template's parameters. */
DECL_NAME (r) = build_typename_overload (TREE_TYPE (type));
@ -7055,12 +7055,9 @@ tsubst_copy (t, args, complain, in_decl)
return tsubst (t, args, complain, in_decl);
case IDENTIFIER_NODE:
if (IDENTIFIER_TYPENAME_P (t)
/* Make sure it's not just a variable named `__opr', for instance,
which can occur in some existing code. */
&& TREE_TYPE (t))
return build_typename_overload
(tsubst (TREE_TYPE (t), args, complain, in_decl));
if (IDENTIFIER_TYPENAME_P (t))
return (build_typename_overload
(tsubst (TREE_TYPE (t), args, complain, in_decl)));
else
return t;

View File

@ -2004,6 +2004,13 @@ finish_member_declaration (decl)
/* Mark the DECL as a member of the current class. */
DECL_CONTEXT (decl) = current_class_type;
/* [dcl.link]
A C language linkage is ignored for the names of class members
and the member function type of class member functions. */
if (DECL_LANG_SPECIFIC (decl) && DECL_LANGUAGE (decl) == lang_c)
DECL_LANGUAGE (decl) = lang_cplusplus;
/* Put functions on the TYPE_METHODS list and everything else on the
TYPE_FIELDS list. Note that these are built up in reverse order.
We reverse them (to obtain declaration order) in finish_struct. */