OSDN Git Service

63rd Cygnus<->FSF merge
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Apr 1995 17:51:34 +0000 (17:51 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 4 Apr 1995 17:51:34 +0000 (17:51 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@9311 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl2.c
gcc/cp/init.c
gcc/cp/parse.y
gcc/cp/repo.c
gcc/cp/typeck.c

index 1f68bf6..9b41703 100644 (file)
@@ -1,3 +1,37 @@
+Mon Apr  3 16:55:08 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
+
+       * repo.c (get_base_filename): Take filename parm, fix logic bug.
+
+       * typeck.c (build_compound_expr): Do not warn about a compound expr
+       in which the first expression has no side effects.
+       (build_x_compound_expr): Warn here instead.
+       (build_conditional_expr): Don't warn about a conditional expression
+       between an enum and the type it promotes to.
+
+       * init.c (build_new): Handle initialization of arrays of builtins
+       properly.
+
+Mon Apr  3 15:08:04 1995  Brendan Kehoe  (brendan@lisa.cygnus.com)
+
+       * repo.c: Include config.h to get definitions of bcopy and rindex
+       on systems that don't have them (e.g., SVR4).
+
+Mon Apr  3 14:41:55 1995  Mike Stump  <mrs@cygnus.com>
+
+       * decl2.c (finish_table): Pass NULL_TREE instead of init to
+       finish_decl so that it won't try and do error checking on the
+       initializer.
+
+Mon Apr  3 10:45:50 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
+
+       * repo.c (get_base_filename): Analyze COLLECT_GCC_OPTIONS to
+       determine whether this compile used -c -o.
+       (open_repo_file): Use get_base_filename.  Remove the extension.
+       (finish_repo): Spit out the values of main_input_filename,
+       COLLECT_GCC and COLLECT_GCC_OPTIONS.
+
+       * parse.y (structsp): Add TYPENAME_KEYWORD complex_type_name.
+
 Sun Apr  2 23:43:51 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
 
        * search.c (compute_access): Don't try to do access control on
index edce580..2a4068f 100644 (file)
@@ -2291,7 +2291,7 @@ finish_table (name, type, init, publicp)
          DECL_INITIAL (empty_table) = init;
          asmspec = build_string (IDENTIFIER_LENGTH (DECL_NAME (empty_table)),
                                  IDENTIFIER_POINTER (DECL_NAME (empty_table)));
-         finish_decl (empty_table, init, asmspec, 0, 0);
+         finish_decl (empty_table, NULL_TREE, asmspec, 0, 0);
        }
       is_empty = 1;
     }
@@ -2329,7 +2329,7 @@ finish_table (name, type, init, publicp)
                              IDENTIFIER_POINTER (DECL_NAME (empty_table)));
     }
 
-  finish_decl (decl, init, asmspec, 0, 0);
+  finish_decl (decl, NULL_TREE, asmspec, 0, 0);
   return decl;
 }
 
index e977151..ee99ba2 100644 (file)
@@ -3082,7 +3082,8 @@ build_new (placement, decl, init, use_global_new)
 
   if (TYPE_NEEDS_CONSTRUCTING (type) || init)
     {
-      if (! TYPE_NEEDS_CONSTRUCTING (type) && ! IS_AGGR_TYPE (type))
+      if (! TYPE_NEEDS_CONSTRUCTING (type)
+         && ! IS_AGGR_TYPE (type) && ! has_array)
        {
          /* New 2.0 interpretation: `new int (10)' means
             allocate an int, and initialize it with 10.  */
index a4bbd55..b28d9a1 100644 (file)
@@ -167,7 +167,7 @@ empty_parms ()
 %nonassoc IF
 %nonassoc ELSE
 
-%left IDENTIFIER TYPENAME PTYPENAME SCSPEC TYPESPEC TYPE_QUAL ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME
+%left IDENTIFIER TYPENAME PTYPENAME SCSPEC TYPESPEC TYPE_QUAL ENUM AGGR ELLIPSIS TYPEOF SIGOF OPERATOR NSNAME TYPENAME_KEYWORD
 
 %left '{' ',' ';'
 
@@ -2185,7 +2185,8 @@ structsp:
                { $$ = xref_tag (enum_type_node, $2, NULL_TREE, 1); }
        | ENUM complex_type_name
                { $$ = xref_tag (enum_type_node, $2, NULL_TREE, 1); }
-
+       | TYPENAME_KEYWORD complex_type_name
+               { $$ = $2; }
        /* C++ extensions, merged with C to avoid shift/reduce conflicts */
        | class_head left_curly opt.component_decl_list '}'
                {
index 78c8ddd..9052eb8 100644 (file)
@@ -22,18 +22,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
    Everything should be emitted in a translation unit where it is used.
    The results of the automatic process should be easily reproducible with
-   explicit code.
-
-   I'm thinking of compiling with -frepo, running a Perl script to update
-   files, and then being able to rebuild everything with -fno-implicit.
-   Full automation can come later.  */
+   explicit code.  */
 
 #include <stdio.h>
+#include "config.h"
 #include "tree.h"
 #include "cp-tree.h"
 #include "input.h"
 
 extern char * rindex ();
+extern char * getenv ();
 
 static tree pending_repo;
 static char repo_name[1024];
@@ -157,12 +155,61 @@ repo_tinfo_used (ti)
 {
 }
 
+static char *
+save_string (s, len)
+     char *s;
+     int len;
+{
+  register char *result = xmalloc (len + 1);
+
+  bcopy (s, result, len);
+  result[len] = 0;
+  return result;
+}
+
+static char *
+get_base_filename (filename)
+     char *filename;
+{
+  char *p = getenv ("COLLECT_GCC_OPTIONS");
+  char *output = 0;
+  int compiling = 0;
+
+  if (p)
+    while (*p)
+      {
+       char *q = p;
+       while (*q && *q != ' ') q++;
+       if (*p == '-' && p[1] == 'o')
+         {
+           p += 2;
+           if (p == q)
+             {
+               p++; q++;
+               if (*q)
+                 while (*q && *q != ' ') q++;
+             }
+
+           output = save_string (p, q - p);
+         }
+       else if (*p == '-' && p[1] == 'c')
+         compiling = 1;
+       if (*q) q++;
+       p = q;
+      }
+
+  if (compiling && output)
+    return output;
+
+  return save_string (filename, strlen (filename));
+}        
+
 static void
 open_repo_file (filename)
      char *filename;
 {
   register char *p, *q;
-  char *file = filename;
+  char *file = get_base_filename (filename);
   char *s = rindex (file, '/');
   if (s == NULL)
     s = file;
@@ -172,10 +219,15 @@ open_repo_file (filename)
   for (p = repo_name, q = file; q < s; )
     *p++ = *q++;
   *p++ = '.';
-  strcpy (p, q);
+  if ((s = rindex (q, '.')) == NULL)
+    strcpy (p, q);
+  else
+    for (; q < s;)
+      *p++ = *q++;
   strcat (p, ".repo");
 
   repo_file = fopen (repo_name, "r");
+  free (file);
 }
 
 void
@@ -187,7 +239,7 @@ init_repo (filename)
   if (! flag_use_repository)
     return;
 
-  open_repo_file (filename);
+  open_repo_file ();
 
   if (repo_file == 0)
     return;
@@ -202,6 +254,7 @@ init_repo (filename)
       switch (buf[0])
        {
        case 'A':
+       case 'G':
        case 'M':
          break;
        case 'C':
@@ -228,7 +281,7 @@ reopen_repo_file_for_write ()
 
   if (repo_file == 0)
     {
-      error ("man't create repository information file `%s'", repo_name);
+      error ("can't create repository information file `%s'", repo_name);
       flag_use_repository = 0;
     }
 }
@@ -239,7 +292,7 @@ void
 finish_repo ()
 {
   tree t;
-  int changed = 0;
+  char *p;
 
   if (! flag_use_repository)
     return;
@@ -254,6 +307,16 @@ finish_repo ()
   if (repo_file == 0)
     goto out;
 
+  fprintf (repo_file, "M %s\n", main_input_filename);
+
+  p = getenv ("COLLECT_GCC");
+  if (p != 0)
+    fprintf (repo_file, "G %s\n", p);
+
+  p = getenv ("COLLECT_GCC_OPTIONS");
+  if (p != 0)
+    fprintf (repo_file, "A %s\n", p);
+
   for (t = pending_repo; t; t = TREE_CHAIN (t))
     {
       tree val = TREE_VALUE (t);
index d83c3cb..6f261e9 100644 (file)
@@ -3483,6 +3483,9 @@ build_binary_op_nodefault (code, orig_op0, orig_op1, error_code)
             all the values of the unsigned type.  */
          if (! TREE_UNSIGNED (result_type))
            /* OK */;
+         /* Do not warn if both operands are unsigned.  */
+         else if (op0_signed == op1_signed)
+           /* OK */;
          /* Do not warn if the signed quantity is an unsuffixed
             integer literal (or some static constant expression
             involving such literals) and it is non-negative.  */
@@ -4592,11 +4595,13 @@ build_conditional_expr (ifexp, op1, op2)
          cp_error ("enumeral mismatch in conditional expression: `%T' vs `%T'", type1, type2);
          return error_mark_node;
        }
-      else if (extra_warnings && ! IS_AGGR_TYPE_CODE (code2))
+      else if (extra_warnings && ! IS_AGGR_TYPE_CODE (code2)
+              && type2 != type_promotes_to (type1))
        warning ("enumeral and non-enumeral type in conditional expression");
     }
   else if (extra_warnings
-          && code2 == ENUMERAL_TYPE && ! IS_AGGR_TYPE_CODE (code1))
+          && code2 == ENUMERAL_TYPE && ! IS_AGGR_TYPE_CODE (code1)
+          && type1 != type_promotes_to (type2))
     warning ("enumeral and non-enumeral type in conditional expression");
 
   if (code1 != VOID_TYPE)
@@ -4828,6 +4833,22 @@ build_x_compound_expr (list)
                           TREE_VALUE (list), TREE_VALUE (rest), NULL_TREE);
   if (result)
     return build_x_compound_expr (tree_cons (NULL_TREE, result, TREE_CHAIN (rest)));
+
+  if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)))
+    {
+      /* the left-hand operand of a comma expression is like an expression
+         statement: we should warn if it doesn't have any side-effects,
+         unless it was explicitly cast to (void).  */
+      if ((extra_warnings || warn_unused)
+           && !(TREE_CODE (TREE_VALUE(list)) == CONVERT_EXPR
+                && TREE_TYPE (TREE_VALUE(list)) == void_type_node))
+        warning("left-hand operand of comma expression has no effect");
+    }
+#if 0 /* this requires a gcc backend patch to export warn_if_unused_value */
+  else if (warn_unused)
+    warn_if_unused_value (TREE_VALUE(list));
+#endif
+
   return build_compound_expr (tree_cons (NULL_TREE, TREE_VALUE (list),
                                         build_tree_list (NULL_TREE, build_x_compound_expr (rest))));
 }
@@ -4861,25 +4882,9 @@ build_compound_expr (list)
 
   rest = build_compound_expr (TREE_CHAIN (list));
 
-  if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)))
-    {
-      /* the left-hand operand of a comma expression is like an expression
-         statement: we should warn if it doesn't have any side-effects,
-         unless it was explicitly cast to (void).  */
-      if ((extra_warnings || warn_unused)
-           && !(TREE_CODE (TREE_VALUE(list)) == CONVERT_EXPR
-                && TREE_TYPE (TREE_VALUE(list)) == void_type_node))
-        warning("left-hand operand of comma expression has no effect");
-
-      /* When pedantic, a compound expression can be neither an lvalue
-         nor an integer constant expression.  */
-      if (! pedantic)
-        return rest;
-    }
-#if 0 /* this requires a gcc backend patch to export warn_if_unused_value */
-  else if (warn_unused)
-    warn_if_unused_value (TREE_VALUE(list));
-#endif
+  /* When pedantic, a compound expression cannot be a constant expression.  */
+  if (! TREE_SIDE_EFFECTS (TREE_VALUE (list)) && ! pedantic)
+    return rest;
 
   return build (COMPOUND_EXPR, TREE_TYPE (rest),
                break_out_cleanups (TREE_VALUE (list)), rest);