diff options
author | Paolo Carlini <paolo@gcc.gnu.org> | 2013-06-05 17:29:21 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-06-05 17:29:21 +0000 |
commit | 67f018391792e1ff69256f21742e9b2fe4c75ef8 (patch) | |
tree | 0a12840d777589782c453984e52833b894d3d9e3 /gcc | |
parent | 17a7fc37d4cc1d5c6d51c9c59de0b193e9462b48 (diff) | |
download | gcc-67f018391792e1ff69256f21742e9b2fe4c75ef8.zip gcc-67f018391792e1ff69256f21742e9b2fe4c75ef8.tar.gz gcc-67f018391792e1ff69256f21742e9b2fe4c75ef8.tar.bz2 |
re PR c++/51908 ([C++11] ICE in cp_parser_abort_tentative_parse with decltype and variable template arguments)
/cp
2013-06-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51908
* parser.c (cp_parser_postfix_expression [RID_*CAST]): Set
parser->in_type_id_in_expr_p before calling cp_parser_type_id.
/testsuite
2013-06-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51908
* g++.dg/cpp0x/decltype54.C: New.
From-SVN: r199707
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/parser.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/decltype54.C | 26 |
4 files changed, 42 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4698a18..f8bacf5 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,6 +1,12 @@ +2013-06-05 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51908 + * parser.c (cp_parser_postfix_expression [RID_*CAST]): Set + parser->in_type_id_in_expr_p before calling cp_parser_type_id. + 2013-06-03 Jan Hubicka <jh@suse.cz> - * decl2.c (maybe_make_one_only): Use forced_by_abi instad of + * decl2.c (maybe_make_one_only): Use forced_by_abi instead of mark_decl_referenced. (mark_needed): Likewise. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 061b571..dfeeb0a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -5546,6 +5546,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, tree type; tree expression; const char *saved_message; + bool saved_in_type_id_in_expr_p; /* All of these can be handled in the same way from the point of view of parsing. Begin by consuming the token @@ -5560,7 +5561,10 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, /* Look for the opening `<'. */ cp_parser_require (parser, CPP_LESS, RT_LESS); /* Parse the type to which we are casting. */ + saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p; + parser->in_type_id_in_expr_p = true; type = cp_parser_type_id (parser); + parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p; /* Look for the closing `>'. */ cp_parser_require (parser, CPP_GREATER, RT_GREATER); /* Restore the old message. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2985cb6..f214b58 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-05 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51908 + * g++.dg/cpp0x/decltype54.C: New. + 2013-06-05 James Greenhalgh <james.greenhalgh@arm.com> * gcc.dg/fshort-wchar.c: Add extra dg-options for diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype54.C b/gcc/testsuite/g++.dg/cpp0x/decltype54.C new file mode 100644 index 0000000..9d301c0 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/decltype54.C @@ -0,0 +1,26 @@ +// PR c++/51908 +// { dg-do compile { target c++11 } } + +struct foo1 +{ + template <typename Ret, typename... Args> + operator decltype(static_cast<Ret (*)(Args...)>(nullptr)) () const; +}; + +struct foo2 +{ + template <typename Ret, typename... Args> + operator decltype(static_cast<Ret (*)(Args... args)>(nullptr)) () const; +}; + +struct foo3 +{ + template <typename Ret, typename Arg> + operator decltype(static_cast<Ret (*)(Arg)>(nullptr)) () const; +}; + +struct foo4 +{ + template <typename Ret, typename Arg> + operator decltype(static_cast<Ret (*)(Arg arg)>(nullptr)) () const; +}; |