]> gcc.gnu.org Git - gcc.git/blobdiff - gcc/cp/error.c
86th Cygnus<->FSF merge
[gcc.git] / gcc / cp / error.c
index a2d786cc70f9752fd261db48661068cd73b15ff8..652ed3ff0abb6a6563aea1984fdd8eb073eab346 100644 (file)
@@ -1,6 +1,6 @@
 /* Call-backs for C++ error reporting.
    This code is non-reentrant.
-   Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
 
    This file is part of GNU CC.
 
@@ -34,6 +34,7 @@ typedef char* cp_printer ();
 #define L language_as_string
 #define O op_as_string
 #define P parm_as_string
+#define Q assop_as_string
 #define T type_as_string
 #define V cv_as_string
 
@@ -46,7 +47,7 @@ cp_printer * cp_printers[256] =
   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* 0x20 */
   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* 0x30 */
   _, A, _, C, D, E, _, _, _, _, _, _, L, _, _, O, /* 0x40 */
-  P, _, _, _, T, _, V, _, _, _, _, _, _, _, _, _, /* 0x50 */
+  P, Q, _, _, T, _, V, _, _, _, _, _, _, _, _, _, /* 0x50 */
   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* 0x60 */
   _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* 0x70 */
 };
@@ -56,6 +57,7 @@ cp_printer * cp_printers[256] =
 #undef L
 #undef O
 #undef P
+#undef Q
 #undef T
 #undef V
 #undef _
@@ -209,12 +211,10 @@ dump_type (t, v)
       break;
 
     case TEMPLATE_TYPE_PARM:
-      OB_PUTID (TYPE_IDENTIFIER (t));
-      break;
-
-    case UNINSTANTIATED_P_TYPE:
-      OB_PUTID (DECL_NAME (UPT_TEMPLATE (t)));
-      OB_PUTS ("<...>");
+      if (TYPE_IDENTIFIER (t))
+       OB_PUTID (TYPE_IDENTIFIER (t));
+      else
+       OB_PUTS ("{anonymous template type parm}");
       break;
 
       /* This is not always necessary for pointers and such, but doing this
@@ -230,6 +230,13 @@ dump_type (t, v)
       dump_type_suffix (t, v);
       break;
 
+    case TYPENAME_TYPE:
+      OB_PUTS ("typename ");
+      dump_type (TYPE_CONTEXT (t), 0);
+      OB_PUTS ("::");
+      OB_PUTID (TYPE_IDENTIFIER (t));
+      break;
+
     default:
       sorry ("`%s' not supported by dump_type",
             tree_code_name[(int) TREE_CODE (t)]);
@@ -422,10 +429,10 @@ dump_type_prefix (t, v)
     case TREE_LIST:
     case TYPE_DECL:
     case TREE_VEC:
-    case UNINSTANTIATED_P_TYPE:
     case UNION_TYPE:
     case UNKNOWN_TYPE:
     case VOID_TYPE:
+    case TYPENAME_TYPE:
       dump_type (t, v);
       break;
       
@@ -494,10 +501,10 @@ dump_type_suffix (t, v)
     case TREE_LIST:
     case TYPE_DECL:
     case TREE_VEC:
-    case UNINSTANTIATED_P_TYPE:
     case UNION_TYPE:
     case UNKNOWN_TYPE:
     case VOID_TYPE:
+    case TYPENAME_TYPE:
       break;
 
     default:
@@ -538,7 +545,7 @@ ident_fndecl (t)
 #endif
 
 #define GLOBAL_IORD_P(NODE) \
-  !strncmp(IDENTIFIER_POINTER(NODE),GLOBAL_THING,sizeof(GLOBAL_THING)-1)
+  ! strncmp (IDENTIFIER_POINTER(NODE), GLOBAL_THING, sizeof (GLOBAL_THING) - 1)
 
 void
 dump_global_iord (t)
@@ -576,12 +583,9 @@ dump_decl (t, v)
     case TYPE_DECL:
       {
        /* Don't say 'typedef class A' */
-       tree type = TREE_TYPE (t);
-        if (((IS_AGGR_TYPE (type) && ! TYPE_PTRMEMFUNC_P (type))
-            || TREE_CODE (type) == ENUMERAL_TYPE)
-           && type == TYPE_MAIN_VARIANT (type))
+        if (DECL_ARTIFICIAL (t))
          {
-           dump_type (type, v);
+           dump_type (TREE_TYPE (t), v);
            break;
          }
       }
@@ -711,11 +715,8 @@ dump_decl (t, v)
          OB_UNPUT (2);
        OB_PUTC2 ('>', ' ');
 
-       if (DECL_TEMPLATE_IS_CLASS (t))
-         {
-           OB_PUTS ("class ");
-           OB_PUTID (DECL_NAME (t));
-         }
+       if (TREE_CODE (DECL_TEMPLATE_RESULT (t)) == TYPE_DECL)
+         dump_type (TREE_TYPE (t), v);
        else switch (NEXT_CODE (t))
          {
          case METHOD_TYPE:
@@ -734,12 +735,20 @@ dump_decl (t, v)
       break;
 
     case CONST_DECL:
-      if (NEXT_CODE (t) == ENUMERAL_TYPE)
+      if (NEXT_CODE (t) == ENUMERAL_TYPE
+         || TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_CONST_PARM)
        goto general;
       else
        dump_expr (DECL_INITIAL (t), 0);
       break;
 
+    case USING_DECL:
+      OB_PUTS ("using ");
+      dump_type (DECL_INITIAL (t), 0);
+      OB_PUTS ("::");
+      OB_PUTID (DECL_NAME (t));
+      break;
+
     default:
       sorry ("`%s' not supported by dump_decl",
             tree_code_name[(int) TREE_CODE (t)]);
@@ -934,6 +943,7 @@ dump_expr (t, nop)
     case FIELD_DECL:
     case CONST_DECL:
     case FUNCTION_DECL:
+    case TEMPLATE_DECL:
       dump_decl (t, -1);
       break;
 
@@ -1076,7 +1086,7 @@ dump_expr (t, nop)
            args = TREE_CHAIN (args);
          }
        dump_expr (fn, 0);
-       OB_PUTC('(');
+       OB_PUTC ('(');
        dump_expr_list (args);
        OB_PUTC (')');
       }
@@ -1255,6 +1265,56 @@ dump_expr (t, nop)
        break;
       }
 
+    case TEMPLATE_CONST_PARM:
+      {
+       tree r = TREE_VEC_ELT (TREE_VALUE (current_template_parms),
+                              TEMPLATE_CONST_IDX (t));
+       dump_decl (TREE_VALUE (r), -1);
+       break;
+      }
+
+    case IDENTIFIER_NODE:
+      OB_PUTID (t);
+      break;
+
+    case SCOPE_REF:
+      dump_type (TREE_OPERAND (t, 0), 0);
+      OB_PUTS ("::");
+      dump_expr (TREE_OPERAND (t, 1), 0);
+      break;
+
+    case CAST_EXPR:
+      if (TREE_CHAIN (TREE_OPERAND (t, 0)))
+       {
+         dump_type (TREE_TYPE (t), 0);
+         OB_PUTC ('(');
+         dump_expr_list (TREE_OPERAND (t, 0), 0);
+         OB_PUTC (')');
+       }
+      else
+       {
+         OB_PUTC ('(');
+         dump_type (TREE_TYPE (t), 0);
+         OB_PUTC (')');
+         OB_PUTC ('(');
+         dump_expr_list (TREE_OPERAND (t, 0));
+         OB_PUTC (')');
+       }
+      break;
+
+    case LOOKUP_EXPR:
+      OB_PUTID (TREE_OPERAND (t, 0));
+      break;
+
+    case SIZEOF_EXPR:
+      OB_PUTS ("sizeof (");
+      if (TREE_CODE_CLASS (TREE_CODE (TREE_OPERAND (t, 0))) == 't')
+       dump_type (TREE_OPERAND (t, 0), 0);
+      else
+       dump_unary_op ("*", t, 0);
+      OB_PUTC (')');
+      break;
+
     case TREE_LIST:
       if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL)
        {
@@ -1305,8 +1365,8 @@ dump_unary_op (opstring, t, nop)
 }
 
 char *
-fndecl_as_string (cname, fndecl, print_ret_type_p)
-     tree cname, fndecl;
+fndecl_as_string (fndecl, print_ret_type_p)
+     tree fndecl;
      int print_ret_type_p;
 {
   return decl_as_string (fndecl, print_ret_type_p);
@@ -1382,12 +1442,7 @@ cp_line_of (t)
     t = TREE_TYPE (t);
 
   if (TREE_CODE_CLASS (TREE_CODE (t)) == 't')
-    {
-      if (IS_AGGR_TYPE (t))
-       line = CLASSTYPE_SOURCE_LINE (t);
-      else
-       line = DECL_SOURCE_LINE (TYPE_NAME (t));
-    }
+    line = DECL_SOURCE_LINE (TYPE_NAME (t));
   else
     line = DECL_SOURCE_LINE (t);
 
@@ -1450,6 +1505,20 @@ op_as_string (p, v)
   return buf;
 }
 
+char *
+assop_as_string (p, v)
+     enum tree_code p;
+     int v;
+{
+  static char buf[] = "operator                ";
+
+  if (p == 0)
+    return "{unknown}";
+  
+  strcpy (buf + 9, assignop_tab [p]);
+  return buf;
+}
+
 char *
 args_as_string (p, v)
      tree p;
This page took 0.035363 seconds and 5 git commands to generate.