Hi Jakub,

thanks for looking at this.

Jakub Jelinek <ja...@redhat.com> wrote:

Similarly to inline asm, :: (or any other number of consecutive colons) can
appear in ObjC @selector argument and with the introduction of CPP_SCOPE
into the C FE, we need to trat CPP_SCOPE as two CPP_COLON tokens.
The C++ FE does that already that way.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK from Objective-C point of view,
thanks
Iain


2020-04-19  Jakub Jelinek  <ja...@redhat.com>

        PR objc/94637
        * c-parser.c (c_parser_objc_selector_arg): Handle CPP_SCOPE like
        two CPP_COLON tokens.

        * objc.dg/pr94637.m: New test.

--- gcc/c/c-parser.c.jj 2020-04-17 16:59:28.727193750 +0200
+++ gcc/c/c-parser.c    2020-04-18 23:27:04.623963647 +0200
@@ -11782,15 +11782,28 @@ c_parser_objc_selector_arg (c_parser *pa
{
  tree sel = c_parser_objc_selector (parser);
  tree list = NULL_TREE;
-  if (sel && c_parser_next_token_is_not (parser, CPP_COLON))
+  if (sel
+      && c_parser_next_token_is_not (parser, CPP_COLON)
+      && c_parser_next_token_is_not (parser, CPP_SCOPE))
    return sel;
  while (true)
    {
-      if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
-       return list;
-      list = chainon (list, build_tree_list (sel, NULL_TREE));
+      if (c_parser_next_token_is (parser, CPP_SCOPE))
+       {
+         c_parser_consume_token (parser);
+         list = chainon (list, build_tree_list (sel, NULL_TREE));
+         list = chainon (list, build_tree_list (NULL_TREE, NULL_TREE));
+       }
+      else
+       {
+         if (!c_parser_require (parser, CPP_COLON, "expected %<:%>"))
+           return list;
+         list = chainon (list, build_tree_list (sel, NULL_TREE));
+       }
      sel = c_parser_objc_selector (parser);
-      if (!sel && c_parser_next_token_is_not (parser, CPP_COLON))
+      if (!sel
+         && c_parser_next_token_is_not (parser, CPP_COLON)
+         && c_parser_next_token_is_not (parser, CPP_SCOPE))
        break;
    }
  return list;
--- gcc/testsuite/objc.dg/pr94637.m.jj  2020-04-18 23:26:01.925898608 +0200
+++ gcc/testsuite/objc.dg/pr94637.m     2020-04-18 23:25:57.197969111 +0200
@@ -0,0 +1,10 @@
+/* PR objc/94637 */
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+SEL
+foo ()
+{
+  return @selector(example::);
+}

        Jakub


Reply via email to