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 /ar-lib | |
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 'ar-lib')
0 files changed, 0 insertions, 0 deletions