From: Andrew Pinski Date: Thu, 8 Sep 2005 13:14:41 +0000 (+0000) Subject: re PR objc++/16816 (obj-c++ parser error with multi-colon selectors) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d95036e3f8e8548ec9a568748a24db4f20ea65f5;p=gcc.git re PR objc++/16816 (obj-c++ parser error with multi-colon selectors) 2005-09-08 Andrew Pinski 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 PR obj-c++/16816 * parser.c (cp_parser_objc_selector_expression): Treat CPP_SCOPE as two CPP_COLON. From-SVN: r104033 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 453140d2929..89a9656c15f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-09-08 Andrew Pinski + + PR obj-c++/16816 + * parser.c (cp_parser_objc_selector_expression): Treat CPP_SCOPE as + two CPP_COLON. + 2005-09-07 Richard Guenther * cp-gimplify.c (cp_gimplify_expr): Create empty CONSTRUCTOR diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 6feb114436a..e979e939b10 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e43b16c87c3..716cd8f187f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2005-09-08 Andrew Pinski + + 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 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 index 00000000000..10671a9450b --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/selector-5.mm @@ -0,0 +1,13 @@ +/* { dg-options "" } */ +/* { dg-do compile } */ + +#include + +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 index 00000000000..54a38f8f75e --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/selector-6.mm @@ -0,0 +1,13 @@ +/* { dg-options "" } */ +/* { dg-do compile } */ + +#include + +int main() +{ + SEL foo = @selector(foo: a::); + return 0; +} + +/* { dg-final { scan-assembler "foo:a::" } } */ +