re PR objc++/16816 (obj-c++ parser error with multi-colon selectors)
authorAndrew Pinski <pinskia@physics.uc.edu>
Thu, 8 Sep 2005 13:14:41 +0000 (13:14 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Thu, 8 Sep 2005 13:14:41 +0000 (06:14 -0700)
2005-09-08  Andrew Pinski  <pinskia@physics.uc.edu>

        PR obj-c++/16816
        * obj-c++.dg/selector-5.mm: New test.
        * obj-c++.dg/selector-6.mm: New test.
2005-09-08  Andrew Pinski  <pinskia@physics.uc.edu>

        PR obj-c++/16816
        * parser.c (cp_parser_objc_selector_expression): Treat CPP_SCOPE as
        two CPP_COLON.

From-SVN: r104033

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/obj-c++.dg/selector-5.mm [new file with mode: 0644]
gcc/testsuite/obj-c++.dg/selector-6.mm [new file with mode: 0644]

index 453140d2929cf6a4fb02c094c3b9d0ce69e9c88a..89a9656c15fcbbd3cd3abac599de2c79659a925b 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-08  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR obj-c++/16816
+       * parser.c (cp_parser_objc_selector_expression): Treat CPP_SCOPE as
+       two CPP_COLON.
+
 2005-09-07  Richard Guenther  <rguenther@suse.de>
 
        * cp-gimplify.c (cp_gimplify_expr): Create empty CONSTRUCTOR
index 6feb114436a4e328031f71d682d2d1cf7aee84c8..e979e939b10cf1901224ead14b10add1096947a5 100644 (file)
@@ -16500,27 +16500,45 @@ cp_parser_objc_selector_expression (cp_parser* parser)
   cp_parser_require (parser, CPP_OPEN_PAREN, "`('");
   token = cp_lexer_peek_token (parser->lexer);
 
-  while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON)
+  while (cp_parser_objc_selector_p (token->type) || token->type == CPP_COLON
+         || token->type == CPP_SCOPE)
     {
       tree selector = NULL_TREE;
 
-      if (token->type != CPP_COLON)
+      if (token->type != CPP_COLON
+         || token->type == CPP_SCOPE)
        selector = cp_parser_objc_selector (parser);
 
-      /* Detect if we have a unary selector.  */
-      if (maybe_unary_selector_p
-         && cp_lexer_next_token_is_not (parser->lexer, CPP_COLON))
+      if (cp_lexer_next_token_is_not (parser->lexer, CPP_COLON)
+          && cp_lexer_next_token_is_not (parser->lexer, CPP_SCOPE))
        {
-         sel_seq = selector;
-         goto finish_selector;
+         /* Detect if we have a unary selector.  */
+         if (maybe_unary_selector_p)
+           {
+             sel_seq = selector;
+             goto finish_selector;
+           }
+         else
+           {
+             cp_parser_error (parser, "expected %<:%>");
+           }
        }
-
       maybe_unary_selector_p = false;
-      cp_parser_require (parser, CPP_COLON, "`:'");
-
-      sel_seq
-       = chainon (sel_seq,
-                  build_tree_list (selector, NULL_TREE));
+      token = cp_lexer_consume_token (parser->lexer);
+      
+      if (token->type == CPP_SCOPE)
+        {
+         sel_seq
+           = chainon (sel_seq,
+                      build_tree_list (selector, NULL_TREE));
+         sel_seq
+           = chainon (sel_seq,
+                      build_tree_list (NULL_TREE, NULL_TREE));
+       }
+      else
+       sel_seq
+         = chainon (sel_seq,
+                    build_tree_list (selector, NULL_TREE));
 
       token = cp_lexer_peek_token (parser->lexer);
     }
index e43b16c87c36e0aac36fc5654ca607a287e265a0..716cd8f187f6d32c5705f6d96e0e543bf3ba0e3d 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-08  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       PR obj-c++/16816
+       * obj-c++.dg/selector-5.mm: New test.
+       * obj-c++.dg/selector-6.mm: New test.
+
 2005-09-08  Andrew Pinski  <pinskia@physics.uc.edu>
 
        PR objc/20574
diff --git a/gcc/testsuite/obj-c++.dg/selector-5.mm b/gcc/testsuite/obj-c++.dg/selector-5.mm
new file mode 100644 (file)
index 0000000..10671a9
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-options "" } */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+int main()
+{
+  SEL foo = @selector(foo::);
+  return 0;
+}
+
+/* { dg-final { scan-assembler  "foo::" } } */
+
diff --git a/gcc/testsuite/obj-c++.dg/selector-6.mm b/gcc/testsuite/obj-c++.dg/selector-6.mm
new file mode 100644 (file)
index 0000000..54a38f8
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-options "" } */
+/* { dg-do compile } */
+
+#include <objc/Object.h>
+
+int main()
+{
+  SEL foo = @selector(foo: a::);
+  return 0;
+}
+
+/* { dg-final { scan-assembler  "foo:a::" } } */
+