parser->colon_corrects_to_scope_p);
cp_debug_print_flag (file, "Colon doesn't start a class definition",
parser->colon_doesnt_start_class_def_p);
+ cp_debug_print_flag (file, "Parsing an Objective-C++ message context",
+ parser->objective_c_message_context_p);
if (parser->type_definition_forbidden_message)
fprintf (file, "Error message for forbidden type definitions: %s %s\n",
parser->type_definition_forbidden_message,
if (token->type == CPP_COLON
&& parser->colon_corrects_to_scope_p
- && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_NAME)
+ && cp_lexer_peek_nth_token (parser->lexer, 3)->type == CPP_NAME
+ /* name:name is a valid sequence in an Objective C message. */
+ && !parser->objective_c_message_context_p)
{
gcc_rich_location richloc (token->location);
richloc.add_fixit_replace ("::");
{
tree receiver, messageargs;
+ parser->objective_c_message_context_p = true;
location_t start_loc = cp_lexer_peek_token (parser->lexer)->location;
cp_lexer_consume_token (parser->lexer); /* Eat '['. */
receiver = cp_parser_objc_message_receiver (parser);
location_t combined_loc = make_location (start_loc, start_loc, end_loc);
protected_set_expr_location (result, combined_loc);
+ parser->objective_c_message_context_p = false;
return result;
}
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. */
--- /dev/null
+/* Only needs to compile. */
+/* { dg-additional-options "-std=c++11" } */
+
+#ifdef __cplusplus
+enum X {
+ x = 5,
+ y
+};
+#endif
+
+__attribute__((__objc_root_class__))
+@interface A
+- (id) :(id)arg0 :(id)arg1;
+- (id) m:(id)arg0 :(id)arg1 :(id)arg2 :(id)arg3;
+#ifdef __cplusplus
+- (id) n:(X)arg0 :(X)arg1 :(id)arg2 :(id)arg3;
+#endif
+@end
+
+@implementation A
+- (id) :(id)arg0 :(id)arg1
+{
+ return arg1;
+}
+- (id) m:(id)arg0 :(id)arg1 :(id)arg2 :(id)arg3
+{
+ return arg2;
+}
+#ifdef __cplusplus
+- (id) n:(X)arg0 :(X)arg1 :(id)arg2 :(id)arg3
+{
+ return arg2;
+}
+#endif
+@end
+
+id f1 (A *x)
+{
+ return [x:x:x];
+}
+
+id f2 (A *x)
+{
+ return [x m:x:x:x:x];
+}
+
+#ifdef __cplusplus
+id f3 (A *x)
+{
+ return [x n:X::x:X::y:x:x];
+}
+#endif
--- /dev/null
+/* Only needs to compile [see PR 49070 for C++ issue]. */
+
+__attribute__((__objc_root_class__))
+@interface A
+- (id) :(id)arg0 :(id)arg1;
+- (id) m:(id)arg0 :(id)arg1 :(id)arg2 :(id)arg3;
+@end
+
+@implementation A
+- (id) :(id)arg0 :(id)arg1
+{
+ return arg1;
+}
+- (id) m:(id)arg0 :(id)arg1 :(id)arg2 :(id)arg3
+{
+ return arg2;
+}
+@end
+
+id f1 (A *x)
+{
+ return [x:x:x];
+}
+
+id f2 (A *x)
+{
+ return [x m:x:x:x:x];
+}