re PR c++/51738 (C++11 initializer list does not work correctly with operator[])

/gcc/cp
2012-01-03  Paolo Carlini  <paolo.carlini@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.carlini@oracle.com>

	PR c++/51738
	* g++.dg/cpp0x/initlist-postfix-open-square.C: New.

/libstdc++-v3
2012-01-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/51738
	* testsuite/23_containers/map/element_access/39901.cc: New.

From-SVN: r182856
This commit is contained in:
Paolo Carlini 2012-01-03 20:25:16 +00:00 committed by Paolo Carlini
parent 0239db9272
commit 2b59b5284f
6 changed files with 87 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51738
* parser.c (cp_parser_postfix_open_square_expression): Handle
postfix-expression [ braced-init-list ].
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/29273

View File

@ -5831,6 +5831,7 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
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_parser *parser,
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);

View File

@ -1,3 +1,8 @@
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51738
* g++.dg/cpp0x/initlist-postfix-open-square.C: New.
2012-01-03 Andrew Pinski <apinski@cavium.com>
* lib/scanasm.exp (dg-function-on-line): Always use a special format

View File

@ -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}];
}

View File

@ -1,3 +1,8 @@
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51738
* testsuite/23_containers/map/element_access/39901.cc: New.
2011-12-30 Jonathan Wakely <jwakely.gcc@gmail.com>
* doc/xml/manual/extensions.xml: Improve markup and note that some

View File

@ -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;
}