Commit 657184d0 by Jakub Jelinek Committed by Jakub Jelinek

re PR translation/90035 (Non-translatable C++ parser diagnostics)

	PR translation/90035
	* parser.h (struct cp_parser): Add
	type_definition_forbidden_message_arg member.
	* parser.c (cp_debug_parser): Print it.
	(cp_parser_check_type_definition): Pass
	parser->type_definition_forbidden_message_arg as second argument to
	error.
	(cp_parser_has_attribute_expression, cp_parser_sizeof_operand): Set
	parser->type_definition_forbidden_message_arg and use G_() with
	%qs for parser->type_definition_forbidden_message instead of
	building untranslatable message using concat.

From-SVN: r270286
parent 8f1d8deb
2019-04-11 Jakub Jelinek <jakub@redhat.com>
PR translation/90035
* parser.h (struct cp_parser): Add
type_definition_forbidden_message_arg member.
* parser.c (cp_debug_parser): Print it.
(cp_parser_check_type_definition): Pass
parser->type_definition_forbidden_message_arg as second argument to
error.
(cp_parser_has_attribute_expression, cp_parser_sizeof_operand): Set
parser->type_definition_forbidden_message_arg and use G_() with
%qs for parser->type_definition_forbidden_message instead of
building untranslatable message using concat.
2019-04-09 Jakub Jelinek <jakub@redhat.com> 2019-04-09 Jakub Jelinek <jakub@redhat.com>
PR translation/90011 PR translation/90011
......
...@@ -570,8 +570,10 @@ cp_debug_parser (FILE *file, cp_parser *parser) ...@@ -570,8 +570,10 @@ cp_debug_parser (FILE *file, cp_parser *parser)
cp_debug_print_flag (file, "Colon doesn't start a class definition", cp_debug_print_flag (file, "Colon doesn't start a class definition",
parser->colon_doesnt_start_class_def_p); parser->colon_doesnt_start_class_def_p);
if (parser->type_definition_forbidden_message) if (parser->type_definition_forbidden_message)
fprintf (file, "Error message for forbidden type definitions: %s\n", fprintf (file, "Error message for forbidden type definitions: %s %s\n",
parser->type_definition_forbidden_message); parser->type_definition_forbidden_message,
parser->type_definition_forbidden_message_arg
? parser->type_definition_forbidden_message_arg : "<none>");
cp_debug_print_unparsed_queues (file, parser->unparsed_queues); cp_debug_print_unparsed_queues (file, parser->unparsed_queues);
fprintf (file, "Number of class definitions in progress: %u\n", fprintf (file, "Number of class definitions in progress: %u\n",
parser->num_classes_being_defined); parser->num_classes_being_defined);
...@@ -3054,8 +3056,9 @@ cp_parser_check_type_definition (cp_parser* parser) ...@@ -3054,8 +3056,9 @@ cp_parser_check_type_definition (cp_parser* parser)
if (parser->type_definition_forbidden_message) if (parser->type_definition_forbidden_message)
{ {
/* Don't use `%s' to print the string, because quotations (`%<', `%>') /* Don't use `%s' to print the string, because quotations (`%<', `%>')
in the message need to be interpreted. */ or %qs in the message need to be interpreted. */
error (parser->type_definition_forbidden_message); error (parser->type_definition_forbidden_message,
parser->type_definition_forbidden_message_arg);
return false; return false;
} }
return true; return true;
...@@ -8518,12 +8521,12 @@ cp_parser_has_attribute_expression (cp_parser *parser) ...@@ -8518,12 +8521,12 @@ cp_parser_has_attribute_expression (cp_parser *parser)
/* Types cannot be defined in a `sizeof' expression. Save away the /* Types cannot be defined in a `sizeof' expression. Save away the
old message. */ old message. */
const char *saved_message = parser->type_definition_forbidden_message; const char *saved_message = parser->type_definition_forbidden_message;
/* And create the new one. */ const char *saved_message_arg
const int kwd = RID_BUILTIN_HAS_ATTRIBUTE; = parser->type_definition_forbidden_message_arg;
char *tmp = concat ("types may not be defined in %<", parser->type_definition_forbidden_message
IDENTIFIER_POINTER (ridpointers[kwd]), = G_("types may not be defined in %qs expressions");
"%> expressions", NULL); parser->type_definition_forbidden_message_arg
parser->type_definition_forbidden_message = tmp; = IDENTIFIER_POINTER (ridpointers[RID_BUILTIN_HAS_ATTRIBUTE]);
/* The restrictions on constant-expressions do not apply inside /* The restrictions on constant-expressions do not apply inside
sizeof expressions. */ sizeof expressions. */
...@@ -8562,10 +8565,9 @@ cp_parser_has_attribute_expression (cp_parser *parser) ...@@ -8562,10 +8565,9 @@ cp_parser_has_attribute_expression (cp_parser *parser)
--cp_unevaluated_operand; --cp_unevaluated_operand;
--c_inhibit_evaluation_warnings; --c_inhibit_evaluation_warnings;
/* Free the message we created. */
free (tmp);
/* And restore the old one. */ /* And restore the old one. */
parser->type_definition_forbidden_message = saved_message; parser->type_definition_forbidden_message = saved_message;
parser->type_definition_forbidden_message_arg = saved_message_arg;
parser->integral_constant_expression_p parser->integral_constant_expression_p
= saved_integral_constant_expression_p; = saved_integral_constant_expression_p;
parser->non_integral_constant_expression_p parser->non_integral_constant_expression_p
...@@ -28928,7 +28930,7 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword) ...@@ -28928,7 +28930,7 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
{ {
tree expr = NULL_TREE; tree expr = NULL_TREE;
const char *saved_message; const char *saved_message;
char *tmp; const char *saved_message_arg;
bool saved_integral_constant_expression_p; bool saved_integral_constant_expression_p;
bool saved_non_integral_constant_expression_p; bool saved_non_integral_constant_expression_p;
...@@ -28941,11 +28943,11 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword) ...@@ -28941,11 +28943,11 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
/* Types cannot be defined in a `sizeof' expression. Save away the /* Types cannot be defined in a `sizeof' expression. Save away the
old message. */ old message. */
saved_message = parser->type_definition_forbidden_message; saved_message = parser->type_definition_forbidden_message;
/* And create the new one. */ saved_message_arg = parser->type_definition_forbidden_message_arg;
tmp = concat ("types may not be defined in %<", parser->type_definition_forbidden_message
IDENTIFIER_POINTER (ridpointers[keyword]), = G_("types may not be defined in %qs expressions");
"%> expressions", NULL); parser->type_definition_forbidden_message_arg
parser->type_definition_forbidden_message = tmp; = IDENTIFIER_POINTER (ridpointers[keyword]);
/* The restrictions on constant-expressions do not apply inside /* The restrictions on constant-expressions do not apply inside
sizeof expressions. */ sizeof expressions. */
...@@ -29002,10 +29004,9 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword) ...@@ -29002,10 +29004,9 @@ cp_parser_sizeof_operand (cp_parser* parser, enum rid keyword)
--cp_unevaluated_operand; --cp_unevaluated_operand;
--c_inhibit_evaluation_warnings; --c_inhibit_evaluation_warnings;
/* Free the message we created. */
free (tmp);
/* And restore the old one. */ /* And restore the old one. */
parser->type_definition_forbidden_message = saved_message; parser->type_definition_forbidden_message = saved_message;
parser->type_definition_forbidden_message_arg = saved_message_arg;
parser->integral_constant_expression_p parser->integral_constant_expression_p
= saved_integral_constant_expression_p; = saved_integral_constant_expression_p;
parser->non_integral_constant_expression_p parser->non_integral_constant_expression_p
...@@ -350,6 +350,9 @@ struct GTY(()) cp_parser { ...@@ -350,6 +350,9 @@ struct GTY(()) cp_parser {
issued as an error message if a type is defined. */ issued as an error message if a type is defined. */
const char *type_definition_forbidden_message; const char *type_definition_forbidden_message;
/* Argument for type_definition_forbidden_message if needed. */
const char *type_definition_forbidden_message_arg;
/* A stack used for member functions of local classes. The lists /* A stack used for member functions of local classes. The lists
contained in an individual entry can only be processed once the contained in an individual entry can only be processed once the
outermost class being defined is complete. */ outermost class being defined is complete. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment