Commit 0f8766b8 by Jason Merrill Committed by Jason Merrill

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
parent d46965b9
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> 1998-10-15 Mark Mitchell <mark@markmitchell.com>
* class.c (maybe_warn_about_overly_private_class): Improve error * class.c (maybe_warn_about_overly_private_class): Improve error
......
...@@ -2203,7 +2203,7 @@ extern int current_function_parms_stored; ...@@ -2203,7 +2203,7 @@ extern int current_function_parms_stored;
`main'. */ `main'. */
#define DECL_MAIN_P(NODE) \ #define DECL_MAIN_P(NODE) \
(TREE_CODE (NODE) == FUNCTION_DECL \ (TREE_CODE (NODE) == FUNCTION_DECL \
&& DECL_CONTEXT (NODE) == NULL_TREE \ && DECL_LANGUAGE (NODE) == lang_c \
&& DECL_NAME (NODE) != NULL_TREE \ && DECL_NAME (NODE) != NULL_TREE \
&& MAIN_NAME_P (DECL_NAME (NODE))) && MAIN_NAME_P (DECL_NAME (NODE)))
......
...@@ -8016,6 +8016,19 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -8016,6 +8016,19 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if (in_namespace) if (in_namespace)
set_decl_namespace (decl, 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). */ /* Should probably propagate const out from type to decl I bet (mrs). */
if (staticp) if (staticp)
{ {
...@@ -8026,7 +8039,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -8026,7 +8039,7 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals,
if (ctype) if (ctype)
DECL_CLASS_CONTEXT (decl) = ctype; DECL_CLASS_CONTEXT (decl) = ctype;
if (ctype == NULL_TREE && MAIN_NAME_P (declarator)) if (ctype == NULL_TREE && DECL_MAIN_P (decl))
{ {
if (inlinep) if (inlinep)
error ("cannot declare `main' to be inline"); error ("cannot declare `main' to be inline");
...@@ -8123,6 +8136,12 @@ grokfndecl (ctype, type, declarator, orig_declarator, virtualp, flags, quals, ...@@ -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. */ /* Caller will do the rest of this. */
if (check < 0) if (check < 0)
return decl; return decl;
...@@ -10625,18 +10644,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10625,18 +10644,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
error ("virtual non-class function `%s'", name); error ("virtual non-class function `%s'", name);
virtualp = 0; 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) else if (TREE_CODE (type) == FUNCTION_TYPE && staticp < 2)
type = build_cplus_method_type (ctype, TREE_TYPE (type), type = build_cplus_method_type (ctype, TREE_TYPE (type),
...@@ -10660,11 +10667,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist) ...@@ -10660,11 +10667,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
if (decl == error_mark_node) if (decl == error_mark_node)
return 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) if (staticp == 1)
{ {
int illegal_static = 0; int illegal_static = 0;
......
...@@ -405,20 +405,6 @@ do_friend (ctype, declarator, decl, parmdecls, flags, quals, funcdef_flag) ...@@ -405,20 +405,6 @@ do_friend (ctype, declarator, decl, parmdecls, flags, quals, funcdef_flag)
decl = void_type_node; 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. /* A global friend.
@@ or possibly a friend from a base class ?!? */ @@ or possibly a friend from a base class ?!? */
else if (TREE_CODE (decl) == FUNCTION_DECL) else if (TREE_CODE (decl) == FUNCTION_DECL)
......
...@@ -401,6 +401,11 @@ yylex () ...@@ -401,6 +401,11 @@ yylex ()
if (tmp_token.yychar != '~') if (tmp_token.yychar != '~')
got_object = NULL_TREE; 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; yylval = tmp_token.yylval;
yychar = tmp_token.yychar; yychar = tmp_token.yychar;
end_of_file = tmp_token.end_of_file; end_of_file = tmp_token.end_of_file;
......
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