* decl.c (make_typename_type): Tighten error-checking.
authorMark Mitchell <mark@codesourcery.com>
Thu, 22 Apr 1999 16:26:44 +0000 (16:26 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Thu, 22 Apr 1999 16:26:44 +0000 (16:26 +0000)
From-SVN: r26586

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

index 4740af5..fc813fe 100644 (file)
@@ -1,3 +1,7 @@
+1999-04-22  Mark Mitchell  <mark@codesourcery.com>
+
+       * decl.c (make_typename_type): Tighten error-checking.
+
 1999-04-20  Mark Mitchell  <mark@codesourcery.com>
 
        * cp-tree.h (build_binary_op): Remove unneeded parameter.
index 331d627..917535a 100644 (file)
@@ -5385,19 +5385,20 @@ make_typename_type (context, name)
     {
       if (TREE_CODE (fullname) == TEMPLATE_ID_EXPR)
        {
+         tree tmpl = NULL_TREE;
          if (IS_AGGR_TYPE (context))
-           t = lookup_field (context, name, 0, 0);
-         else
+           tmpl = lookup_field (context, name, 0, 0);
+         if (!tmpl || !DECL_CLASS_TEMPLATE_P (tmpl))
            {
              cp_error ("no class template named `%#T' in `%#T'",
                        name, context);
              return error_mark_node;
            }
 
-         if (t && DECL_CLASS_TEMPLATE_P (t))
-           return lookup_template_class (t, TREE_OPERAND (fullname, 1),
-                                         NULL_TREE, context, 
-                                         /*entering_scope=*/0);
+         return lookup_template_class (tmpl, 
+                                       TREE_OPERAND (fullname, 1),
+                                       NULL_TREE, context, 
+                                       /*entering_scope=*/0);
        }
       else
        {
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/crash38.C b/gcc/testsuite/g++.old-deja/g++.pt/crash38.C
new file mode 100644 (file)
index 0000000..4927064
--- /dev/null
@@ -0,0 +1,16 @@
+// Build don't link:
+// Origin: Mark Mitchell <mark@codesourcery.com>
+
+template <class T>
+struct S {
+  typedef typename T::Y<T>::Z X; // ERROR - No Y in A
+  X x; // ERROR - No Y in A
+};
+
+struct A {
+  struct Y {
+    typedef A Z;
+  };
+};
+
+template struct S<A>;