aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/c-parser.c24
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/obj-c++.dg/property/at-property-29.mm14
-rw-r--r--gcc/testsuite/objc.dg/property/at-property-29.m14
7 files changed, 71 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a9bb4c2..1615efa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2011-01-12 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * c-parser.c (c_parser_objc_at_property_declaration): Improved
+ error message.
+
+2011-01-12 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * c-parser.c (c_lex_one_token): Updated and reindented some
+ comments. No changes in code.
+
2011-01-11 Ian Lance Taylor <iant@google.com>
* godump.c (go_output_var): Don't output the variable if there is
diff --git a/gcc/c-parser.c b/gcc/c-parser.c
index c9b5293..51df188 100644
--- a/gcc/c-parser.c
+++ b/gcc/c-parser.c
@@ -253,8 +253,7 @@ c_lex_one_token (c_parser *parser, c_token *token)
/* We found an Objective-C "pq" keyword (in, out,
inout, bycopy, byref, oneway). They need special
care because the interpretation depends on the
- context.
- */
+ context. */
if (parser->objc_pq_context)
{
token->type = CPP_KEYWORD;
@@ -275,21 +274,19 @@ c_lex_one_token (c_parser *parser, c_token *token)
you can't use 'in' as the name of the running
variable in a C for loop. We could potentially
try to add code here to disambiguate, but it
- seems a reasonable limitation.
- */
+ seems a reasonable limitation. */
token->type = CPP_KEYWORD;
token->keyword = rid_code;
break;
}
/* Else, "pq" keywords outside of the "pq" context are
not keywords, and we fall through to the code for
- normal tokens.
- */
+ normal tokens. */
}
else if (c_dialect_objc () && OBJC_IS_PATTR_KEYWORD (rid_code))
{
- /* We found an Objective-C "property attribute" keyword
- (readonly, copies, getter, setter, ivar). These are
+ /* We found an Objective-C "property attribute"
+ keyword (getter, setter, readonly, etc). These are
only valid in the property context. */
if (parser->objc_property_attr_context)
{
@@ -310,8 +307,7 @@ c_lex_one_token (c_parser *parser, c_token *token)
protected, public, try, catch, throw) without a
preceding '@' sign. Do nothing and fall through to
the code for normal tokens (in C++ we would still
- consider the CXX ones keywords, but not in C).
- */
+ consider the CXX ones keywords, but not in C). */
;
}
else
@@ -7961,8 +7957,12 @@ c_parser_objc_at_property_declaration (c_parser *parser)
case RID_SETTER:
if (c_parser_next_token_is_not (parser, CPP_EQ))
{
- c_parser_error (parser,
- "getter/setter attribute must be followed by %<=%>");
+ if (keyword == RID_GETTER)
+ c_parser_error (parser,
+ "missing %<=%> (after %<getter%> attribute)");
+ else
+ c_parser_error (parser,
+ "missing %<=%> (after %<setter%> attribute)");
syntax_error = true;
break;
}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 95b8d18..0616dcc 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-12 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * parser.c (cp_parser_objc_at_property_declaration): Improved
+ error message.
+
2011-01-11 Dodji Seketeli <dodji@redhat.com>
PR debug/46955
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 2f11f8e..e63d976 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -23087,8 +23087,12 @@ cp_parser_objc_at_property_declaration (cp_parser *parser)
case RID_SETTER:
if (cp_lexer_next_token_is_not (parser->lexer, CPP_EQ))
{
- cp_parser_error (parser,
- "getter/setter/ivar attribute must be followed by %<=%>");
+ if (keyword == RID_GETTER)
+ cp_parser_error (parser,
+ "missing %<=%> (after %<getter%> attribute)");
+ else
+ cp_parser_error (parser,
+ "missing %<=%> (after %<setter%> attribute)");
syntax_error = true;
break;
}
@@ -23128,13 +23132,17 @@ cp_parser_objc_at_property_declaration (cp_parser *parser)
if (syntax_error)
break;
-
+
if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
cp_lexer_consume_token (parser->lexer);
else
break;
}
+ /* FIXME: "@property (setter, assign);" will generate a spurious
+ "error: expected ‘)’ before ‘,’ token". This is because
+ cp_parser_require, unlike the C counterpart, will produce an
+ error even if we are in error recovery. */
if (!cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN))
{
cp_parser_skip_to_closing_parenthesis (parser,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 511ee6e..15ffa93 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-01-12 Nicola Pero <nicola.pero@meta-innovation.com>
+
+ * objc.dg/property/at-property-29.m: New.
+ * obj-c++.dg/property/at-property-29.mm: New.
+
2011-01-11 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* go.test/go-test.exp (go-set-goarch): New proc.
diff --git a/gcc/testsuite/obj-c++.dg/property/at-property-29.mm b/gcc/testsuite/obj-c++.dg/property/at-property-29.mm
new file mode 100644
index 0000000..0f31617
--- /dev/null
+++ b/gcc/testsuite/obj-c++.dg/property/at-property-29.mm
@@ -0,0 +1,14 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, January 2011. */
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+@interface MyRootClass
+{
+ Class isa;
+}
+/* Test missing '=' in setter/getter attributes. */
+@property (getter) int property_a; /* { dg-error "missing .=. .after .getter. attribute." } */
+@property (setter) int property_b; /* { dg-error "missing .=. .after .setter. attribute." } */
+@property (assign, getter) int property_c; /* { dg-error "missing .=. .after .getter. attribute." } */
+@end
diff --git a/gcc/testsuite/objc.dg/property/at-property-29.m b/gcc/testsuite/objc.dg/property/at-property-29.m
new file mode 100644
index 0000000..0f31617
--- /dev/null
+++ b/gcc/testsuite/objc.dg/property/at-property-29.m
@@ -0,0 +1,14 @@
+/* Contributed by Nicola Pero <nicola.pero@meta-innovation.com>, January 2011. */
+/* { dg-do compile } */
+
+#include <objc/objc.h>
+
+@interface MyRootClass
+{
+ Class isa;
+}
+/* Test missing '=' in setter/getter attributes. */
+@property (getter) int property_a; /* { dg-error "missing .=. .after .getter. attribute." } */
+@property (setter) int property_b; /* { dg-error "missing .=. .after .setter. attribute." } */
+@property (assign, getter) int property_c; /* { dg-error "missing .=. .after .getter. attribute." } */
+@end