mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-08 15:42:07 +08:00
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:
parent
d46965b967
commit
0f8766b8af
@ -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
|
||||
|
@ -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)))
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user