]> gcc.gnu.org Git - gcc.git/commit
Objective-C++ : Fix handling of unnamed message parms [PR49070].
authorIain Sandoe <iain@sandoe.co.uk>
Fri, 26 Feb 2021 10:21:02 +0000 (10:21 +0000)
committerIain Sandoe <iain@sandoe.co.uk>
Thu, 18 Mar 2021 11:47:27 +0000 (11:47 +0000)
commit0cc218d42c241ed286cc5af9fb7d2e45386f7a24
treec678573b7b4061649f125fcc6568d4b8827e6dcc
parent8f0c9d53ef3a9b8ba2579b53596cc2b7f5d8bf69
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.
gcc/cp/parser.c
gcc/cp/parser.h
gcc/testsuite/obj-c++.dg/pr49070.mm [new file with mode: 0644]
gcc/testsuite/objc.dg/unnamed-parms.m [new file with mode: 0644]
This page took 0.067513 seconds and 5 git commands to generate.