OSDN Git Service

* decl.c (grokfndecl): ::main and __builtin_* get C linkage.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Oct 1998 19:43:51 +0000 (19:43 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Oct 1998 19:43:51 +0000 (19:43 +0000)
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 { ... };'.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23117 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/friend.c
gcc/cp/spew.c

index 6b6ed2c..0958c3b 100644 (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
index 6a74d26..76ba93e 100644 (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)))
 
index 8facd96..29605a7 100644 (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;
index acb9657..a3d198a 100644 (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)
index ff93ac7..b524cb1 100644 (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;