Hi,
so this is what I did earlier today to add the missing bits to the
parser. The work turned out to be very easy, maybe too easy? ;) Is there
something I'm missing? I'm also adding a 'dg-do run' library testcase.
Booted and tested x96_64-linux.
Thanks,
Paolo.
///////////////////
/gcc/cp
2012-01-03 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/51738
* parser.c (cp_parser_postfix_open_square_expression): Handle
postfix-expression [ braced-init-list ].
/gcc/testsuite
2012-01-03 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/51738
* g++.dg/cpp0x/initlist-postfix-open-square.C: New.
/libstdc++-v3
2012-01-03 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/51738
* testsuite/23_containers/map/element_access/39901.cc: New.
Index: libstdc++-v3/testsuite/23_containers/map/element_access/39901.cc
===================================================================
--- libstdc++-v3/testsuite/23_containers/map/element_access/39901.cc
(revision 0)
+++ libstdc++-v3/testsuite/23_containers/map/element_access/39901.cc
(revision 0)
@@ -0,0 +1,42 @@
+// { dg-options "-std=gnu++0x" }
+
+// Copyright (C) 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+#include <map>
+#include <testsuite_hooks.h>
+
+// c++/39901
+void test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::map<std::pair<int, int>, int> the_map;
+
+ the_map[{0, 1}] = 5;
+ VERIFY( (the_map.size() == 1) );
+ VERIFY( (the_map[{0, 1}] == 5) );
+
+ VERIFY( (the_map[{0, 0}] == 0) );
+ VERIFY( (the_map.size() == 2) );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
Index: gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C
===================================================================
--- gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C (revision 0)
+++ gcc/testsuite/g++.dg/cpp0x/initlist-postfix-open-square.C (revision 0)
@@ -0,0 +1,18 @@
+// PR c++/51738
+// { dg-options -std=c++0x }
+
+struct Index
+{
+ Index(unsigned, unsigned){ }
+};
+
+struct Matrix
+{
+ void operator[](Index){ }
+};
+
+int main()
+{
+ Matrix m;
+ m[{0,1}];
+}
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c (revision 182851)
+++ gcc/cp/parser.c (working copy)
@@ -5831,6 +5831,7 @@ cp_parser_postfix_expression (cp_parser *parser, b
by cp_parser_builtin_offsetof. We're looking for
postfix-expression [ expression ]
+ postfix-expression [ braced-init-list ] (C++11)
FOR_OFFSETOF is set if we're being called in that context, which
changes how we deal with integer constant expressions. */
@@ -5856,7 +5857,16 @@ cp_parser_postfix_open_square_expression (cp_parse
if (for_offsetof)
index = cp_parser_constant_expression (parser, false, NULL);
else
- index = cp_parser_expression (parser, /*cast_p=*/false, NULL);
+ {
+ if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE))
+ {
+ bool expr_nonconst_p;
+ maybe_warn_cpp0x (CPP0X_INITIALIZER_LISTS);
+ index = cp_parser_braced_list (parser, &expr_nonconst_p);
+ }
+ else
+ index = cp_parser_expression (parser, /*cast_p=*/false, NULL);
+ }
/* Look for the closing `]'. */
cp_parser_require (parser, CPP_CLOSE_SQUARE, RT_CLOSE_SQUARE);