diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4740af53e6b..fc813fe449c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +1999-04-22 Mark Mitchell + + * decl.c (make_typename_type): Tighten error-checking. + 1999-04-20 Mark Mitchell * cp-tree.h (build_binary_op): Remove unneeded parameter. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 331d6272985..917535a0164 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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 index 00000000000..49270644395 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/crash38.C @@ -0,0 +1,16 @@ +// Build don't link: +// Origin: Mark Mitchell + +template +struct S { + typedef typename T::Y::Z X; // ERROR - No Y in A + X x; // ERROR - No Y in A +}; + +struct A { + struct Y { + typedef A Z; + }; +}; + +template struct S;