pt.c (check_explicit_specialization): Complain about using a template-id for a non...
authorJason Merrill <jason@gcc.gnu.org>
Fri, 28 Nov 1997 10:30:44 +0000 (05:30 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 28 Nov 1997 10:30:44 +0000 (05:30 -0500)
* pt.c (check_explicit_specialization): Complain about using a
template-id for a non-specialization.

Fri Nov 28 01:56:35 1997  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>

        * error.c (dump_decl): Handle TEMPLATE_ID_EXPR.

From-SVN: r16818

gcc/cp/ChangeLog
gcc/cp/error.c
gcc/cp/pt.c

index 0b1b931..7ceb75a 100644 (file)
@@ -1,3 +1,12 @@
+Fri Nov 28 01:58:14 1997  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * pt.c (check_explicit_specialization): Complain about using a 
+       template-id for a non-specialization.
+
+Fri Nov 28 01:56:35 1997  Bruno Haible  <bruno@linuix.mathematik.uni-karlsruhe.de>
+
+        * error.c (dump_decl): Handle TEMPLATE_ID_EXPR.
+
 Thu Nov 27 00:59:46 1997  Jason Merrill  <jason@yorick.cygnus.com>
 
        * typeck.c (build_const_cast): Handle references here instead of
index 5042126..ccc5b46 100644 (file)
@@ -776,6 +776,24 @@ dump_decl (t, v)
       }
       break;
 
+    case TEMPLATE_ID_EXPR:
+      {
+       tree args;
+       dump_type (TREE_OPERAND (t, 0), v);
+       OB_PUTC ('<');
+       for (args = TREE_OPERAND (t, 1); args; args = TREE_CHAIN (args))
+         {
+           if (TREE_CODE_CLASS (TREE_CODE (TREE_VALUE (args))) == 't')
+             dump_type (TREE_VALUE (args), 0);
+           else
+             dump_expr (TREE_VALUE (args), 0);
+           if (TREE_CHAIN (args))
+             OB_PUTC2 (',', ' ');
+         }
+       OB_PUTC ('>');
+      }
+      break;
+
     case LABEL_DECL:
       OB_PUTID (DECL_NAME (t));
       break;
index 3b56dac..1e9c905 100644 (file)
@@ -496,12 +496,19 @@ check_explicit_specialization (declarator, decl, template_count, flags)
          && !processing_explicit_specialization (template_count)
          && !is_friend)
        {
-         if (!have_def)
+         if (!have_def && ! template_header_count)
            /* This is not an explicit specialization.  It must be
               an explicit instantiation.  */
            return 2;
+         else if (template_header_count > template_count
+                  && !processing_specialization)
+           {
+             cp_error ("template-id `%D' in declaration of primary template",
+                       declarator);
+             return 0;
+           }
          else if (pedantic)
-           pedwarn ("Explicit specialization not preceeded by `template <>'");
+           pedwarn ("explicit specialization not preceeded by `template <>'");
        }
 
       if (TREE_CODE (declarator) != TEMPLATE_ID_EXPR)