diff options
author | Iain Sandoe <iain@sandoe.co.uk> | 2021-02-26 10:21:02 +0000 |
---|---|---|
committer | Iain Sandoe <iain@sandoe.co.uk> | 2021-03-18 11:47:27 +0000 |
commit | 0cc218d42c241ed286cc5af9fb7d2e45386f7a24 (patch) | |
tree | c678573b7b4061649f125fcc6568d4b8827e6dcc /gcc/cp/parser.h | |
parent | 8f0c9d53ef3a9b8ba2579b53596cc2b7f5d8bf69 (diff) | |
download | gcc-0cc218d42c241ed286cc5af9fb7d2e45386f7a24.zip gcc-0cc218d42c241ed286cc5af9fb7d2e45386f7a24.tar.gz gcc-0cc218d42c241ed286cc5af9fb7d2e45386f7a24.tar.bz2 |
Objective-C++ : Fix handling of unnamed message parms [PR49070].
When we are parsing an Objective-C++ message, a colon is a valid
terminator for a assignment-expression. That is:
[receiver meth:x:x:x:x];
Is a valid, if somewhat unreadable, construction; corresponding
to a method declaration like:
- (id) meth:(id)arg0 :(id)arg1 :(id)arg2 :(id)arg3;
Where three of the message params have no selector name.
If fact, although it might be unintentional, Objective-C/C++ can
accept message selectors with all the parms unnamed (this applies
to the clang implementation too, which is taken as the reference
for the language).
For regular C++, the pattern x:x is not valid in that position an
an error is emitted with a fixit for the expected scope token.
If we simply made that error conditional on !c_dialect_objc()
that would regress Objective-C++ diagnostics for cases outside a
message selector, so we add a state flag for this.
gcc/cp/ChangeLog:
PR objc++/49070
* parser.c (cp_debug_parser): Add Objective-C++ message
state flag.
(cp_parser_nested_name_specifier_opt): Allow colon to
terminate an assignment-expression when parsing Objective-
C++ messages.
(cp_parser_objc_message_expression): Set and clear message
parsing state on entry and exit.
* parser.h (struct cp_parser): Add a context flag for
Objective-C++ message state.
gcc/testsuite/ChangeLog:
PR objc++/49070
* obj-c++.dg/pr49070.mm: New test.
* objc.dg/unnamed-parms.m: New test.
Diffstat (limited to 'gcc/cp/parser.h')
-rw-r--r-- | gcc/cp/parser.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/cp/parser.h b/gcc/cp/parser.h index d587cf2..a468b69 100644 --- a/gcc/cp/parser.h +++ b/gcc/cp/parser.h @@ -350,6 +350,10 @@ struct GTY(()) cp_parser { is terminated by colon. */ bool colon_doesnt_start_class_def_p; + /* TRUE if we are parsing an objective c message, and ':' is permitted + to terminate an assignment-expression. */ + bool objective_c_message_context_p; + /* If non-NULL, then we are parsing a construct where new type definitions are not permitted. The string stored here will be issued as an error message if a type is defined. */ |