Hi,
On 01/02/2013 11:07 AM, Jakub Jelinek wrote:
Hi!
On Sun, Oct 28, 2012 at 12:27:40PM +0100, Paolo Carlini wrote:
--- gcc/cp/parser.c (revision 192887)
+++ gcc/cp/parser.c (working copy)
@@ -12655,9 +12655,8 @@ cp_parser_template_id (cp_parser *parser,
/* 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. */
Shouldn't the "In C++11 do not emit"... sentence be removed from the comment as
well?
--- libcpp/lex.c (revision 192887)
+++ libcpp/lex.c (working copy)
@@ -2291,6 +2291,25 @@ _cpp_lex_direct (cpp_reader *pfile)
if (*buffer->cur == ':')
{
buffer->cur++;
+
+ /* C++11 - 2.5 p3, bullet 2. */
+ if (CPP_OPTION (pfile, cplusplus)
+ && (CPP_OPTION (pfile, lang) == CLK_CXX11
+ || CPP_OPTION (pfile, lang) == CLK_GNUCXX11))
+ {
+ if (*buffer->cur == ':')
+ {
+ buffer->cur++;
+ if (*buffer->cur != ':' && *buffer->cur != '>')
+ {
+ --buffer->cur;
+ --buffer->cur;
+ break;
+ }
+ --buffer->cur;
I'd say way too many ++/-- above. I'd write it as:
- buffer->cur++;
+
+ /* C++11 - 2.5 p3, bullet 2. */
+ 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++;
Agreed, thanks for your review Jakub. Thus I booted and tested
succesfully the below version of the patch. Shall we apply it or it's
late for 4.8.0?
Thanks!
Paolo.
///////////////////////
Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c (revision 194839)
+++ gcc/cp/parser.c (working copy)
@@ -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,
Index: gcc/testsuite/g++.dg/cpp0x/parse2.C
===================================================================
--- gcc/testsuite/g++.dg/cpp0x/parse2.C (revision 194839)
+++ gcc/testsuite/g++.dg/cpp0x/parse2.C (working copy)
@@ -10,3 +10,6 @@ int main()
{
X<::A> x;
}
+
+int a;
+bool b = 0<::a;
Index: gcc/testsuite/g++.old-deja/g++.other/crash28.C
===================================================================
--- gcc/testsuite/g++.old-deja/g++.other/crash28.C (revision 194839)
+++ gcc/testsuite/g++.old-deja/g++.other/crash28.C (working copy)
@@ -31,5 +31,5 @@ class foo
};
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
}
Index: libcpp/lex.c
===================================================================
--- libcpp/lex.c (revision 194839)
+++ libcpp/lex.c (working copy)
@@ -2290,7 +2290,16 @@ _cpp_lex_direct (cpp_reader *pfile)
{
if (*buffer->cur == ':')
{
+ /* C++11 - 2.5 p3, bullet 2. */
+ 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;
}