diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 44 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/selector-5.mm | 13 | ||||
-rw-r--r-- | gcc/testsuite/obj-c++.dg/selector-6.mm | 13 |
5 files changed, 69 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 453140d..89a9656 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-09-08 Andrew Pinski <pinskia@physics.uc.edu> + + PR obj-c++/16816 + * parser.c (cp_parser_objc_selector_expression): Treat CPP_SCOPE as + two CPP_COLON. + 2005-09-07 Richard Guenther <rguenther@suse.de> * cp-gimplify.c (cp_gimplify_expr): Create empty CONSTRUCTOR diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 6feb114..e979e93 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 e43b16c..716cd8f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2005-09-08 Andrew Pinski <pinskia@physics.uc.edu> + 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 <pinskia@physics.uc.edu> + PR objc/20574 PR objc/19324 * objc.dg/error-1.m: New test. 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 0000000..10671a9 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/selector-5.mm @@ -0,0 +1,13 @@ +/* { dg-options "" } */ +/* { dg-do compile } */ + +#include <objc/Object.h> + +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 0000000..54a38f8 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/selector-6.mm @@ -0,0 +1,13 @@ +/* { dg-options "" } */ +/* { dg-do compile } */ + +#include <objc/Object.h> + +int main() +{ + SEL foo = @selector(foo: a::); + return 0; +} + +/* { dg-final { scan-assembler "foo:a::" } } */ + |