decl.c (grokdeclarator): Undo 1998-12-14 change.
authorMark Mitchell <mark@markmitchell.com>
Wed, 13 Jan 1999 16:27:23 +0000 (16:27 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 13 Jan 1999 16:27:23 +0000 (16:27 +0000)
* decl.c (grokdeclarator): Undo 1998-12-14 change.
* tree.c (build_cplus_array_type_1): Likewise.
* pt.c (instantiate_class_template): Remove misleading comment.
(tsubst_aggr_type): Substitute if there are template parameters,
regardless of whether or not they use template arguments.
(unify): Likewise, but for unification.

From-SVN: r24656

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

index 01542f4e25a2dc900c8ae95cd34d96b2c96bd044..36d3a34fc4df3f56ad3d2c432d845f2eb2cba359 100644 (file)
@@ -1,3 +1,12 @@
+1999-01-13  Mark Mitchell  <mark@markmitchell.com>
+
+       * decl.c (grokdeclarator): Undo 1998-12-14 change.
+       * tree.c (build_cplus_array_type_1): Likewise.
+       * pt.c (instantiate_class_template): Remove misleading comment.
+       (tsubst_aggr_type): Substitute if there are template parameters,
+       regardless of whether or not they use template arguments.
+       (unify): Likewise, but for unification.
+
 1999-01-12  Richard Henderson  <rth@cygnus.com>
 
        * cp-tree.h (flag_permissive): Declare extern.
index edad0a980974c3ae29463ae89206e21c1b25463d..bf887d2918d4d2b77109d8d0cf64a7c07a05cfa6 100644 (file)
@@ -9890,9 +9890,13 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
                    && TREE_TYPE (size) == TREE_TYPE (TREE_OPERAND (size, 0)))
                  size = TREE_OPERAND (size, 0);
 
-               /* If this involves a template parameter, it'll be
-                  constant, but we don't know what the value is yet.  */
-               if (uses_template_parms (size))
+               /* If this involves a template parameter, it will be a
+                  constant at instantiation time, but we don't know
+                  what the value is yet.  Even if no template
+                  parameters are involved, we may an expression that
+                  is not a constant; we don't even simplify `1 + 2'
+                  when processing a template.  */
+               if (processing_template_decl)
                  {
                    /* Resolve a qualified reference to an enumerator or
                       static const data member of ours.  */
index 9a0545ecd9f3a331b4a66e126fe94a26c2899899..fea1c345be84784e37f275cc0d215dc6a5c5f1a9 100644 (file)
@@ -4475,9 +4475,7 @@ instantiate_class_template (type)
          struct S<int> {};
 
        Now, the `S<U>' in `f<int>' is the specialization, not an
-       instantiation of the original template.  Mark the type as
-       complete, in the same way that we do for a definition of a
-       template class.  */
+       instantiation of the original template.  */
     goto end;
 
   /* Determine what specialization of the original template to
@@ -5043,7 +5041,7 @@ tsubst_aggr_type (t, args, in_decl, entering_scope)
       /* else fall through */
     case ENUMERAL_TYPE:
     case UNION_TYPE:
-      if (uses_template_parms (t))
+      if (TYPE_TEMPLATE_INFO (t))
        {
          tree argvec;
          tree context;
@@ -7671,7 +7669,7 @@ unify (tparms, targs, parm, arg, strict, explicit_mask)
       if (TREE_CODE (arg) != TREE_CODE (parm))
        return 1;
   
-      if (CLASSTYPE_TEMPLATE_INFO (parm) && uses_template_parms (parm))
+      if (CLASSTYPE_TEMPLATE_INFO (parm))
        {
          tree t = NULL_TREE;
          if (strict & UNIFY_ALLOW_DERIVED)
index 486b4c45d362dcd35414e73d1db02dd3e21f24c3..fdf46cfdfa51e5e534500fb8334a89e6b862cc97 100644 (file)
@@ -416,8 +416,7 @@ build_cplus_array_type_1 (elt_type, index_type)
       saveable_obstack = &permanent_obstack;
     }
 
-  if (uses_template_parms (elt_type)
-      || uses_template_parms (index_type))
+  if (processing_template_decl)
     {
       t = make_node (ARRAY_TYPE);
       TREE_TYPE (t) = elt_type;
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash25.C b/gcc/testsuite/g++.old-deja/g++.pt/crash25.C
new file mode 100644 (file)
index 0000000..f587585
--- /dev/null
@@ -0,0 +1,7 @@
+// Build don't link:
+
+template <class T>
+void f()
+{
+  int i[1 << 3];
+}