* pt.c (for_each_template_parm): Rework to match documentation.
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 May 1999 14:58:40 +0000 (14:58 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 20 May 1999 14:58:40 +0000 (14:58 +0000)
Don't be fooled by a COMPONENT_REF with no TREE_TYPE.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@27066 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 5ac9e81..9ade541 100644 (file)
@@ -1,3 +1,8 @@
+1999-05-20  Mark Mitchell  <mark@codesourcery.com>
+
+       * pt.c (for_each_template_parm): Rework to match documentation.
+       Don't be fooled by a COMPONENT_REF with no TREE_TYPE.
+
 1999-05-20  Jason Merrill  <jason@yorick.cygnus.com>
 
        * class.c (finish_struct_1): Still check for ANON_AGGR_TYPE_P.
@@ -18,6 +23,7 @@
        (cplus_expand_expr): Here.  Use cplus_expand_constant.
        (init_cplus_expand): Set lang_expand_constant.
        * pt.c (convert_nontype_argument): Use make_ptrmem_cst.
+
        * tree.c (make_ptrmem_cst): Define.
        * typeck.c (unary_complex_lvalue): Use make_ptrmem_cst.
        * typeck2.c (initializer_constant_valid_p): Use make_ptrmem_cst.
index 8c5622c..b26fecb 100644 (file)
@@ -4019,13 +4019,6 @@ for_each_template_parm (t, fn, data)
 
   switch (TREE_CODE (t))
     {
-    case INDIRECT_REF:
-    case COMPONENT_REF:
-      /* We assume that the object must be instantiated in order to build
-        the COMPONENT_REF, so we test only whether the type of the
-        COMPONENT_REF uses template parms.  */
-      return for_each_template_parm (TREE_TYPE (t), fn, data);
-
     case ARRAY_REF:
     case OFFSET_REF:
       return (for_each_template_parm (TREE_OPERAND (t, 0), fn, data)
@@ -4183,10 +4176,6 @@ for_each_template_parm (t, fn, data)
       /* NOTREACHED */
       return 0;
 
-    case LOOKUP_EXPR:
-    case TYPENAME_TYPE:
-      return 1;
-
     case PTRMEM_CST:
       return for_each_template_parm (TREE_TYPE (t), fn, data);
 
@@ -4199,6 +4188,21 @@ for_each_template_parm (t, fn, data)
                                       (TREE_TYPE (t)), fn, data);
       return for_each_template_parm (TREE_OPERAND (t, 1), fn, data);
 
+    case SIZEOF_EXPR:
+    case ALIGNOF_EXPR:
+      return for_each_template_parm (TREE_OPERAND (t, 0), fn, data);
+
+    case INDIRECT_REF:
+    case COMPONENT_REF:
+      /* We assume that the object must be instantiated in order to build
+        the COMPONENT_REF, so we test only whether the type of the
+        COMPONENT_REF uses template parms.  On the other hand, if
+        there's no type, then this thing must be some expression
+        involving template parameters.  */
+      if (TREE_TYPE (t))
+       return for_each_template_parm (TREE_TYPE (t), fn, data);
+      /* Fall through.  */
+
     case MODOP_EXPR:
     case CAST_EXPR:
     case REINTERPRET_CAST_EXPR:
@@ -4208,11 +4212,11 @@ for_each_template_parm (t, fn, data)
     case ARROW_EXPR:
     case DOTSTAR_EXPR:
     case TYPEID_EXPR:
-      return 1;
-
-    case SIZEOF_EXPR:
-    case ALIGNOF_EXPR:
-      return for_each_template_parm (TREE_OPERAND (t, 0), fn, data);
+    case LOOKUP_EXPR:
+    case TYPENAME_TYPE:
+      if (!fn)
+       return 1;
+      /* Fall through.  */
 
     default:
       switch (TREE_CODE_CLASS (TREE_CODE (t)))
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash41.C b/gcc/testsuite/g++.old-deja/g++.pt/crash41.C
new file mode 100644 (file)
index 0000000..3ab7c15
--- /dev/null
@@ -0,0 +1,11 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+template <int> struct S1{};
+
+struct S2 { int i; };
+
+template <class T>
+void f(S2 s2) {
+  S1<s2.i> s1;
+}