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