From: paolo Date: Fri, 4 Jan 2013 15:30:24 +0000 (+0000) Subject: /libcpp X-Git-Tag: upstream/4.9.2~8287 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1aa79d397594447c20fc0505a9c9d163a39d7dfd;p=platform%2Fupstream%2Flinaro-gcc.git /libcpp 2013-01-04 Paolo Carlini PR c++/54526 (again) * lex.c (_cpp_lex_direct): In C++11 mode, implement 2.5 p3, bullet 2. /gcc/cp 2013-01-04 Paolo Carlini PR c++/54526 (again) * parser.c (cp_parser_template_id): Revert core of previous change (keep adjusted inform message). /gcc/testsuite 2013-01-04 Paolo Carlini PR c++/54526 (again) * g++.dg/cpp0x/parse2.C: Extend. * g++.old-deja/g++.other/crash28.C: Adjust. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194909 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4b7968a..0aef08d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-01-04 Paolo Carlini + + PR c++/54526 (again) + * parser.c (cp_parser_template_id): Revert core of previous change + (keep adjusted inform message). + 2013-01-03 Jason Merrill PR c++/55419 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 3dc2ec6..872d419 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1,6 +1,6 @@ /* C++ Parser. Copyright (C) 2000, 2001, 2002, 2003, 2004, - 2005, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. + 2005, 2007-2013 Free Software Foundation, Inc. Written by Mark Mitchell . This file is part of GCC. @@ -12655,11 +12655,9 @@ cp_parser_template_id (cp_parser *parser, return error_mark_node; } /* Otherwise, emit an error about the invalid digraph, but continue - parsing because we got our argument list. In C++11 do not emit - any error, per 2.5/3. */ - if (cxx_dialect < cxx0x - && permerror (next_token->location, - "%<<::%> cannot begin a template-argument list")) + parsing because we got our argument list. */ + if (permerror (next_token->location, + "%<<::%> cannot begin a template-argument list")) { static bool hint = false; inform (next_token->location, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ce0571..ceba87b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-01-04 Paolo Carlini + + PR c++/54526 (again) + * g++.dg/cpp0x/parse2.C: Extend. + * g++.old-deja/g++.other/crash28.C: Adjust. + 2013-01-04 Richard Biener PR tree-optimization/55862 diff --git a/gcc/testsuite/g++.dg/cpp0x/parse2.C b/gcc/testsuite/g++.dg/cpp0x/parse2.C index eea6b41..77ea14a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/parse2.C +++ b/gcc/testsuite/g++.dg/cpp0x/parse2.C @@ -10,3 +10,6 @@ int main() { X<::A> x; } + +int a; +bool b = 0<::a; diff --git a/gcc/testsuite/g++.old-deja/g++.other/crash28.C b/gcc/testsuite/g++.old-deja/g++.other/crash28.C index 59f1e84..c0f4bfa 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/crash28.C +++ b/gcc/testsuite/g++.old-deja/g++.other/crash28.C @@ -31,5 +31,5 @@ public: }; void foo::x() throw(bar) { - if (!b) throw bar (static_cast<::N::X*>(this)); // { dg-error "lambda expressions|expected" } parse error + if (!b) throw bar (static_cast<::N::X*>(this)); // { dg-error "lambda expressions|expected|invalid" } parse error } diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 332efa3..840bad3 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,8 @@ +2013-01-04 Paolo Carlini + + PR c++/54526 (again) + * lex.c (_cpp_lex_direct): In C++11 mode, implement 2.5 p3, bullet 2. + 2013-01-03 Marc Glisse PR bootstrap/50177 diff --git a/libcpp/lex.c b/libcpp/lex.c index 23809bc..866bb11 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -1,6 +1,6 @@ /* CPP Library - lexical analysis. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, - 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007-2013 + Free Software Foundation, Inc. Contributed by Per Bothner, 1994-95. Based on CCCP program by Paul Rubin, June 1986 Adapted to ANSI C, Richard Stallman, Jan 1987 @@ -2290,6 +2290,17 @@ _cpp_lex_direct (cpp_reader *pfile) { if (*buffer->cur == ':') { + /* C++11 [2.5/3 lex.pptoken], "Otherwise, if the next + three characters are <:: and the subsequent character + is neither : nor >, the < is treated as a preprocessor + token by itself". */ + if (CPP_OPTION (pfile, cplusplus) + && (CPP_OPTION (pfile, lang) == CLK_CXX11 + || CPP_OPTION (pfile, lang) == CLK_GNUCXX11) + && buffer->cur[1] == ':' + && buffer->cur[2] != ':' && buffer->cur[2] != '>') + break; + buffer->cur++; result->flags |= DIGRAPH; result->type = CPP_OPEN_SQUARE;