Commit 3590f0a6 by Mark Mitchell Committed by Mark Mitchell

re PR c++/16716 (ICE in cp_parser_parse_and_diagnose_invalid_type_name)

	PR c++/16716
	* parser.c (cp_parser_parse_and_diagnose_invalid_type_name):
	Robustify.

	PR c++/17327
	* pt.c (unify): Add ENUMERAL_TYPE case.  Replace sorry with
	gcc_unreacable.

	PR c++/16716
	* g++.dg/parse/crash17.C: New test.

	PR c++/17327
	* g++.dg/template/enum3.C: New test.

From-SVN: r87467
parent 86620a42
2004-09-13 Mark Mitchell <mark@codesourcery.com>
PR c++/16716
* parser.c (cp_parser_parse_and_diagnose_invalid_type_name):
Robustify.
PR c++/17327
* pt.c (unify): Add ENUMERAL_TYPE case. Replace sorry with
gcc_unreacable.
2004-09-12 Richard Henderson <rth@redhat.com>
PR c++/16254
......
......@@ -2286,13 +2286,10 @@ cp_parser_parse_and_diagnose_invalid_type_name (cp_parser *parser)
cp_parser_abort_tentative_parse (parser);
return false;
}
if (!cp_parser_parse_definitely (parser))
if (!cp_parser_parse_definitely (parser)
|| TREE_CODE (id) != IDENTIFIER_NODE)
return false;
/* If we got here, this cannot be a valid variable declaration, thus
the cp_parser_id_expression must have resolved to a plain identifier
node (not a TYPE_DECL or TEMPLATE_ID_EXPR). */
gcc_assert (TREE_CODE (id) == IDENTIFIER_NODE);
/* Emit a diagnostic for the invalid type. */
cp_parser_diagnose_invalid_type_name (parser, parser->scope, id);
/* Skip to the end of the declaration; there's no point in
......
......@@ -9975,6 +9975,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
case VECTOR_TYPE:
case INTEGER_TYPE:
case BOOLEAN_TYPE:
case ENUMERAL_TYPE:
case VOID_TYPE:
if (TREE_CODE (arg) != TREE_CODE (parm))
return 1;
......@@ -10136,10 +10137,7 @@ unify (tree tparms, tree targs, tree parm, tree arg, int strict)
else
return 0;
}
else
sorry ("use of `%s' in template type unification",
tree_code_name [(int) TREE_CODE (parm)]);
gcc_unreachable ();
return 1;
}
}
......
2004-09-13 Mark Mitchell <mark@codesourcery.com>
PR c++/16716
* g++.dg/parse/crash17.C: New test.
PR c++/17327
* g++.dg/template/enum3.C: New test.
2004-09-13 Hans-Peter Nilsson <hp@bitrange.com>
* lib/gcc-defs.exp: Load wrapper.exp.
......
// PR c++/16716
template <typename> class allocator;
template<typename T> class vector {
// With the dg-error on the next line, we are really just trying to
// check that the message is not an ICE message.
typedef typename allocator<T> allocator_type; // { dg-error "expected|forbids" }
};
// PR c++/17327
enum E { E0, E1 };
template <class T,class U> class A {};
template <class T> void f(A<E,T>) {}
// We used to issue a "sorry" message. By using an explicit error
// message below, we make sure that we will not match "sorry".
template void f(A<int,E>); // { dg-error "template-id" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment