]> gcc.gnu.org Git - gcc.git/commitdiff
pt.c (tsubst_decl): Remove IN_DECL parameter.
authorNathan Sidwell <nathan@codesourcery.com>
Wed, 24 Jan 2001 11:25:28 +0000 (11:25 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 24 Jan 2001 11:25:28 +0000 (11:25 +0000)
cp:
* pt.c (tsubst_decl): Remove IN_DECL parameter.
(tsubst_arg_types): Check parameter is not void.
(tsubst): Adjust tsubst_decl call.
testsuite:
* g++.old-deja/g++.pt/spec38.C: New test.

From-SVN: r39234

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/spec38.C [new file with mode: 0644]

index 2dcd54d39e14abb52ae65712eb89d88370212466..69ac61d1032a214ab1cb1b2e5412cc42096f9d96 100644 (file)
@@ -1,3 +1,9 @@
+2001-01-24  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * pt.c (tsubst_decl): Remove IN_DECL parameter.
+       (tsubst_arg_types): Check parameter is not void.
+       (tsubst): Adjust tsubst_decl call.
+
 2001-01-24  Nathan Sidwell  <nathan@codesourcery.com>
 
        * call.c (add_builtin_candidate): Quote std properly, from
index 0bed46ec8545dbc00b7d212ee3e0dbbed1a4b458..be5439c3c516bf7c677b368d3c45d5da669bda2c 100644 (file)
@@ -149,7 +149,7 @@ static tree most_specialized_class PARAMS ((tree, tree));
 static void set_mangled_name_for_template_decl PARAMS ((tree));
 static int template_class_depth_real PARAMS ((tree, int));
 static tree tsubst_aggr_type PARAMS ((tree, tree, int, tree, int));
-static tree tsubst_decl PARAMS ((tree, tree, tree, tree));
+static tree tsubst_decl PARAMS ((tree, tree, tree));
 static tree tsubst_arg_types PARAMS ((tree, tree, int, tree));
 static tree tsubst_function_type PARAMS ((tree, tree, int, tree));
 static void check_specialization_scope PARAMS ((void));
@@ -5558,19 +5558,18 @@ tsubst_default_arguments (fn)
 
 /* Substitute the ARGS into the T, which is a _DECL.  TYPE is the
    (already computed) substitution of ARGS into TREE_TYPE (T), if
-   appropriate.  Return the result of the substitution.  IN_DECL is as
-   for tsubst.  */
+   appropriate.  Return the result of the substitution.  */
 
 static tree
-tsubst_decl (t, args, type, in_decl)
+tsubst_decl (t, args, type)
      tree t;
      tree args;
      tree type;
-     tree in_decl;
 {
   int saved_lineno;
   const char *saved_filename;
   tree r = NULL_TREE;
+  tree in_decl = t;
 
   /* Set the filename and linenumber to improve error-reporting.  */
   saved_lineno = lineno;
@@ -6122,6 +6121,16 @@ tsubst_arg_types (arg_types, args, complain, in_decl)
   type = tsubst (TREE_VALUE (arg_types), args, complain, in_decl);
   if (type == error_mark_node)
     return error_mark_node;
+  if (VOID_TYPE_P (type))
+    {
+      if (complain)
+        {
+          cp_error ("invalid parameter type `%T'", type);
+          if (in_decl)
+            cp_error_at ("in declaration `%D'", in_decl);
+        }
+      return error_mark_node;
+    }
 
   /* Do array-to-pointer, function-to-pointer conversion, and ignore
      top-level qualifiers as required.  */
@@ -6293,7 +6302,7 @@ tsubst (t, args, complain, in_decl)
     return error_mark_node;
 
   if (DECL_P (t))
-    return tsubst_decl (t, args, type, in_decl);
+    return tsubst_decl (t, args, type);
 
   switch (TREE_CODE (t))
     {
index a97e893c90f8b0878ea9438c1e6ce428ed90f2aa..197e6cab89d6e2ad2688f220a0804d0eada29e3e 100644 (file)
@@ -1,3 +1,7 @@
+2001-01-24  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.pt/spec38.C: New test.
+
 2001-01-23  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        * g++.old-deja/g++.pt/spec33.C: Change from "Build don't link" to
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/spec38.C b/gcc/testsuite/g++.old-deja/g++.pt/spec38.C
new file mode 100644 (file)
index 0000000..a33be54
--- /dev/null
@@ -0,0 +1,17 @@
+// Build don't link:
+// 
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 19 Jan 2001 <nathan@codesourcery.com>
+
+// Bug 1638. We failed to check if a function instantiation produced a void
+// parameter type.
+
+template <class T> struct S
+{
+  int f (T);    // ERROR - void type
+};
+
+void foo ()
+{
+  S<void> s;
+}
This page took 0.112386 seconds and 5 git commands to generate.