aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c44
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/obj-c++.dg/selector-5.mm13
-rw-r--r--gcc/testsuite/obj-c++.dg/selector-6.mm13
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::" } } */
+