diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-04-19 12:13:33 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-04-19 12:13:33 +0200 |
commit | e1113ffbd619d0568fb3b37e9660d9e0ae7862f5 (patch) | |
tree | 09b934e4b3623821ce9842b128072434f976171b /gcc/c/c-parser.c | |
parent | 8a9ce39f8bbb2ae0798bec0ed2051a5f10b21122 (diff) | |
download | gcc-e1113ffbd619d0568fb3b37e9660d9e0ae7862f5.zip gcc-e1113ffbd619d0568fb3b37e9660d9e0ae7862f5.tar.gz gcc-e1113ffbd619d0568fb3b37e9660d9e0ae7862f5.tar.bz2 |
c, objc: Fix up c_parser_objc_selector_arg after CPP_SCOPE changes [PR94637]
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.
Diffstat (limited to 'gcc/c/c-parser.c')
-rw-r--r-- | gcc/c/c-parser.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 4e90d55..ae354e6 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -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; |