c, objc: Fix up c_parser_objc_selector_arg after CPP_SCOPE changes [PR94637]
authorJakub Jelinek <jakub@redhat.com>
Sun, 19 Apr 2020 10:13:33 +0000 (12:13 +0200)
committerJakub Jelinek <jakub@redhat.com>
Sun, 19 Apr 2020 10:13:33 +0000 (12:13 +0200)
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.

2020-04-19  Jakub Jelinek  <jakub@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/ChangeLog
gcc/c/c-parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/objc.dg/pr94637.m [new file with mode: 0644]

index b6af676..83d1ccc 100644 (file)
@@ -1,3 +1,9 @@
+2020-04-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR objc/94637
+       * c-parser.c (c_parser_objc_selector_arg): Handle CPP_SCOPE like
+       two CPP_COLON tokens.
+
 2020-04-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR other/94629
index 4e90d55..ae354e6 100644 (file)
@@ -11782,15 +11782,28 @@ c_parser_objc_selector_arg (c_parser *parser)
 {
   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;
index fb1a153..9f8ae6c 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR objc/94637
+       * objc.dg/pr94637.m: New test.
+
 2020-04-18  Iain Buclaw  <ibuclaw@gdcproject.org>
 
        * lib/gdc-utils.exp (gdc-convert-test): Add dg-skip-if for tests that
diff --git a/gcc/testsuite/objc.dg/pr94637.m b/gcc/testsuite/objc.dg/pr94637.m
new file mode 100644 (file)
index 0000000..10a0ea8
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR objc/94637 */
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+SEL
+foo ()
+{
+  return @selector(example::);
+}