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

Reply via email to