re PR c++/51908 ([C++11] ICE in cp_parser_abort_tentative_parse with decltype and...
authorPaolo Carlini <paolo@gcc.gnu.org>
Wed, 5 Jun 2013 17:29:21 +0000 (17:29 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 5 Jun 2013 17:29:21 +0000 (17:29 +0000)
/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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/decltype54.C [new file with mode: 0644]

index 4698a183448004f2e68ca5d97f5313912d479edb..f8bacf5d42ba4f27de7f661363efc18b1e950096 100644 (file)
@@ -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.
 
index 061b5714790e5910add0c23223ecd1aa20d1ef70..dfeeb0a94c28d2fcf01aff11b212fd6d09381023 100644 (file)
@@ -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.  */
index 2985cb619666682f8700bce8f68918f4c72a1400..f214b588a88fa4f750e295445c2b9c78f4466c99 100644 (file)
@@ -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 (file)
index 0000000..9d301c0
--- /dev/null
@@ -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;
+};