[C++ Patch] PR 57682

Paolo Carlini paolo.carlini@oracle.com
Sun Jun 23 17:47:00 GMT 2013


Hi,

in this C++11 reject valid parsing issue, in a function-try-block we reject:

     try
     : f { func }  { }                     (1)

and we normally accept the C++98:

     try
     : f ( func )  { }                     (2)

Considering cp_parser_save_member_function_body, I think that a neat 
solution would be simply consuming first any 'try' keyword and then 
proceeding as usual. What is happening now is that, later on, the closed 
curly brace in 'f{ func }' is confused with the closed curly brace of 
(2) and things wrong when the former is not followed by 'catch'.

Tested x86_64-linux.

Thanks,
Paolo.

/////////////////////////
-------------- next part --------------
/cp
2013-06-23  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57682
	* parser.c (cp_parser_save_member_function_body): Handle correctly
	curly braces in function-try-block mem-initializers.

/testsuite
2013-06-23  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/57682
	* g++.dg/cpp0x/initlist72.C: New.
-------------- next part --------------
Index: cp/parser.c
===================================================================
--- cp/parser.c	(revision 200350)
+++ cp/parser.c	(working copy)
@@ -22797,6 +22797,9 @@ cp_parser_save_member_function_body (cp_parser* pa
   /* Save away the tokens that make up the body of the
      function.  */
   first = parser->lexer->next_token;
+  /* Handle function try blocks.  */
+  if (cp_lexer_next_token_is_keyword (parser->lexer, RID_TRY))
+    cp_lexer_consume_token (parser->lexer);
   /* We can have braced-init-list mem-initializers before the fn body.  */
   if (cp_lexer_next_token_is (parser->lexer, CPP_COLON))
     {
Index: testsuite/g++.dg/cpp0x/initlist72.C
===================================================================
--- testsuite/g++.dg/cpp0x/initlist72.C	(revision 0)
+++ testsuite/g++.dg/cpp0x/initlist72.C	(working copy)
@@ -0,0 +1,13 @@
+// PR c++/57682
+// { dg-do compile { target c++11 } }
+
+struct Class
+{
+  Class (int func)
+  try
+  : f { func }  { }
+  catch ( ... ) { }
+
+private:
+  int f;
+};


More information about the Gcc-patches mailing list