mirror of git://gcc.gnu.org/git/gcc.git
PR c++/79056 - C++17 ICE with invalid template syntax.
* parser.c (cp_parser_simple_type_specifier): Don't assume that type is a TYPE_DECL. (cp_parser_check_for_invalid_template_id): Handle TYPE_DECL. * pt.c (template_placeholder_p): New. * cp-tree.h: Declare it. From-SVN: r249614
This commit is contained in:
parent
ee444c5f45
commit
e2e80f2f3c
|
|
@ -1,3 +1,12 @@
|
|||
2017-06-23 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/79056 - C++17 ICE with invalid template syntax.
|
||||
* parser.c (cp_parser_simple_type_specifier): Don't assume that type
|
||||
is a TYPE_DECL.
|
||||
(cp_parser_check_for_invalid_template_id): Handle TYPE_DECL.
|
||||
* pt.c (template_placeholder_p): New.
|
||||
* cp-tree.h: Declare it.
|
||||
|
||||
2017-06-23 Marc Glisse <marc.glisse@inria.fr>
|
||||
|
||||
* decl.c (duplicate_decls): Use builtin_structptr_types.
|
||||
|
|
|
|||
|
|
@ -6413,6 +6413,7 @@ extern void check_template_variable (tree);
|
|||
extern tree make_auto (void);
|
||||
extern tree make_decltype_auto (void);
|
||||
extern tree make_template_placeholder (tree);
|
||||
extern bool template_placeholder_p (tree);
|
||||
extern tree do_auto_deduction (tree, tree, tree);
|
||||
extern tree do_auto_deduction (tree, tree, tree,
|
||||
tsubst_flags_t,
|
||||
|
|
|
|||
|
|
@ -2983,7 +2983,9 @@ cp_parser_check_for_invalid_template_id (cp_parser* parser,
|
|||
|
||||
if (cp_lexer_next_token_is (parser->lexer, CPP_LESS))
|
||||
{
|
||||
if (TYPE_P (type))
|
||||
if (TREE_CODE (type) == TYPE_DECL)
|
||||
type = TREE_TYPE (type);
|
||||
if (TYPE_P (type) && !template_placeholder_p (type))
|
||||
error_at (location, "%qT is not a template", type);
|
||||
else if (identifier_p (type))
|
||||
{
|
||||
|
|
@ -17060,7 +17062,7 @@ cp_parser_simple_type_specifier (cp_parser* parser,
|
|||
/* There is no valid C++ program where a non-template type is
|
||||
followed by a "<". That usually indicates that the user
|
||||
thought that the type was a template. */
|
||||
cp_parser_check_for_invalid_template_id (parser, TREE_TYPE (type),
|
||||
cp_parser_check_for_invalid_template_id (parser, type,
|
||||
none_type,
|
||||
token->location);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24799,6 +24799,14 @@ make_template_placeholder (tree tmpl)
|
|||
return t;
|
||||
}
|
||||
|
||||
/* True iff T is a C++17 class template deduction placeholder. */
|
||||
|
||||
bool
|
||||
template_placeholder_p (tree t)
|
||||
{
|
||||
return is_auto (t) && CLASS_PLACEHOLDER_TEMPLATE (t);
|
||||
}
|
||||
|
||||
/* Make a "constrained auto" type-specifier. This is an
|
||||
auto type with constraints that must be associated after
|
||||
deduction. The constraint is formed from the given
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
// PR c++/79056
|
||||
|
||||
template<class> struct A {};
|
||||
|
||||
template<class T> void foo(A<T>=A<T>()) {} // { dg-error "" }
|
||||
|
||||
void bar()
|
||||
{
|
||||
foo(A<int>()); // { dg-error "" }
|
||||
}
|
||||
Loading…
Reference in New Issue