From d853ee42d2bd96a3d589e349c57a2e71e4ace38f Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Wed, 12 Jan 2011 09:36:49 +0000 Subject: In gcc/: 2011-01-12 Nicola Pero In gcc/: 2011-01-12 Nicola Pero * c-parser.c (c_parser_objc_at_property_declaration): Improved error message. 2011-01-12 Nicola Pero * c-parser.c (c_lex_one_token): Updated and reindented some comments. No changes in code. In gcc/cp/: 2011-01-12 Nicola Pero * parser.c (cp_parser_objc_at_property_declaration): Improved error message. In gcc/testsuite/: 2011-01-12 Nicola Pero * objc.dg/property/at-property-29.m: New. * obj-c++.dg/property/at-property-29.mm: New. From-SVN: r168698 --- gcc/ChangeLog | 10 +++++++++ gcc/c-parser.c | 24 +++++++++++----------- gcc/cp/ChangeLog | 5 +++++ gcc/cp/parser.c | 14 ++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ .../obj-c++.dg/property/at-property-29.mm | 14 +++++++++++++ gcc/testsuite/objc.dg/property/at-property-29.m | 14 +++++++++++++ 7 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/obj-c++.dg/property/at-property-29.mm create mode 100644 gcc/testsuite/objc.dg/property/at-property-29.m (limited to 'gcc') 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 + + * c-parser.c (c_parser_objc_at_property_declaration): Improved + error message. + +2011-01-12 Nicola Pero + + * c-parser.c (c_lex_one_token): Updated and reindented some + comments. No changes in code. + 2011-01-11 Ian Lance Taylor * 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 % attribute)"); + else + c_parser_error (parser, + "missing %<=%> (after % 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 + + * parser.c (cp_parser_objc_at_property_declaration): Improved + error message. + 2011-01-11 Dodji Seketeli 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 % attribute)"); + else + cp_parser_error (parser, + "missing %<=%> (after % 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 + + * objc.dg/property/at-property-29.m: New. + * obj-c++.dg/property/at-property-29.mm: New. + 2011-01-11 Rainer Orth * 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 , January 2011. */ +/* { dg-do compile } */ + +#include + +@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 , January 2011. */ +/* { dg-do compile } */ + +#include + +@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 -- cgit v1.1