decl.c (grokfndecl): ::main and __builtin_* get C linkage.

* decl.c (grokfndecl): ::main and __builtin_* get C linkage.
	Do mangling here.
	(grokdeclarator): Instead of here.
	* friend.c (do_friend): Lose special handling of ::main and
	__builtin_*.
	* cp-tree.h (DECL_MAIN_P): Check for C linkage.
	* spew.c (yylex): Clear looking_for_typename if we got
	'enum { ... };'.

From-SVN: r23117
This commit is contained in:
Jason Merrill 1998-10-15 19:43:51 +00:00 committed by Jason Merrill
parent d46965b967
commit 0f8766b8af
5 changed files with 38 additions and 33 deletions

View File

@ -1,3 +1,15 @@
1998-10-15 Jason Merrill <jason@yorick.cygnus.com>
* decl.c (grokfndecl): ::main and __builtin_* get C linkage.
Do mangling here.
(grokdeclarator): Instead of here.
* friend.c (do_friend): Lose special handling of ::main and
__builtin_*.
* cp-tree.h (DECL_MAIN_P): Check for C linkage.
* spew.c (yylex): Clear looking_for_typename if we got
'enum { ... };'.
1998-10-15 Mark Mitchell <mark@markmitchell.com>
* class.c (maybe_warn_about_overly_private_class): Improve error

View File

@ -2203,7 +2203,7 @@ extern int current_function_parms_stored;
`main'. */
#define DECL_MAIN_P(NODE) \
(TREE_CODE (NODE) == FUNCTION_DECL \
&& DECL_CONTEXT (NODE) == NULL_TREE \
&& DECL_LANGUAGE (NODE) == lang_c \
&& DECL_NAME (NODE) != NULL_TREE \
&& MAIN_NAME_P (DECL_NAME (NODE)))

View File

@ -8016,6 +8016,19 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if (in_namespace)
set_decl_namespace (decl, in_namespace);
/* `main' and builtins have implicit 'C' linkage. */
if ((MAIN_NAME_P (declarator)
|| (IDENTIFIER_LENGTH (declarator) > 10
&& IDENTIFIER_POINTER (declarator)[0] == '_'
&& IDENTIFIER_POINTER (declarator)[1] == '_'
&& strncmp (IDENTIFIER_POINTER (declarator)+2, "builtin_", 8) == 0))
&& current_lang_name == lang_name_cplusplus
/* context == 0 could mean global scope or not set yet; either is fine
for us here, as we check current_namespace. */
&& DECL_CONTEXT (decl) == NULL_TREE
&& current_namespace == global_namespace)
DECL_LANGUAGE (decl) = lang_c;
/* Should probably propagate const out from type to decl I bet (mrs). */
if (staticp)
{
@ -8026,7 +8039,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if (ctype)
DECL_CLASS_CONTEXT (decl) = ctype;
if (ctype == NULL_TREE && MAIN_NAME_P (declarator))
if (ctype == NULL_TREE && DECL_MAIN_P (decl))
{
if (inlinep)
error ("cannot declare `main' to be inline");
@ -8123,6 +8136,12 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
}
}
/* Plain overloading: will not be grok'd by grokclassfn. */
if (! ctype && ! processing_template_decl
&& DECL_LANGUAGE (decl) != lang_c
&& (! DECL_USE_TEMPLATE (decl) || name_mangling_version < 1))
set_mangled_name_for_decl (decl);
/* Caller will do the rest of this. */
if (check < 0)
return decl;
@ -10625,18 +10644,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
error ("virtual non-class function `%s'", name);
virtualp = 0;
}
if (current_lang_name == lang_name_cplusplus
&& ! processing_template_decl
&& ! MAIN_NAME_P (original_name)
&& ! (IDENTIFIER_LENGTH (original_name) > 10
&& IDENTIFIER_POINTER (original_name)[0] == '_'
&& IDENTIFIER_POINTER (original_name)[1] == '_'
&& strncmp (IDENTIFIER_POINTER (original_name)+2, "builtin_", 8) == 0))
/* Plain overloading: will not be grok'd by grokclassfn. */
if (name_mangling_version < 1
|| TREE_CODE (declarator) != TEMPLATE_ID_EXPR)
declarator = build_decl_overload (dname, TYPE_ARG_TYPES (type), 0);
}
else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2)
type = build_cplus_method_type (ctype, TREE_TYPE (type),
@ -10660,11 +10667,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (decl == error_mark_node)
return error_mark_node;
if (ctype == NULL_TREE && DECL_LANGUAGE (decl) != lang_c
&& (! DECL_USE_TEMPLATE (decl) ||
name_mangling_version < 1))
DECL_ASSEMBLER_NAME (decl) = declarator;
if (staticp == 1)
{
int illegal_static = 0;

View File

@ -405,20 +405,6 @@ do_friend (ctype, declarator, decl, parmdecls, flags, quals, funcdef_flag)
decl = void_type_node;
}
}
else if (TREE_CODE (decl) == FUNCTION_DECL
&& (MAIN_NAME_P (declarator)
|| (IDENTIFIER_LENGTH (declarator) > 10
&& IDENTIFIER_POINTER (declarator)[0] == '_'
&& IDENTIFIER_POINTER (declarator)[1] == '_'
&& strncmp (IDENTIFIER_POINTER (declarator)+2,
"builtin_", 8) == 0)))
{
/* raw "main", and builtin functions never gets overloaded,
but they can become friends. */
add_friend (current_class_type, decl);
DECL_FRIEND_P (decl) = 1;
decl = void_type_node;
}
/* A global friend.
@@ or possibly a friend from a base class ?!? */
else if (TREE_CODE (decl) == FUNCTION_DECL)

View File

@ -401,6 +401,11 @@ yylex ()
if (tmp_token.yychar != '~')
got_object = NULL_TREE;
/* Clear looking_for_typename if we got 'enum { ... };'. */
if (tmp_token.yychar == '{' || tmp_token.yychar == ':'
|| tmp_token.yychar == ';')
looking_for_typename = 0;
yylval = tmp_token.yylval;
yychar = tmp_token.yychar;
end_of_file = tmp_token.end_of_file;