Hi! As mentioned in the PR, constructing a message from two parts by concatenating them prevents translations, unless one of the parts is a keyword which should be never translated.
The following patch fixes that, ok for trunk? 2023-03-28 Jakub Jelinek <ja...@redhat.com> PR c++/109309 * contracts.cc: Include intl.h. (check_postcondition_result): Don't form diagnostics from two halves of an english message to allow translations. --- gcc/cp/contracts.cc.jj 2023-01-16 11:52:16.063734359 +0100 +++ gcc/cp/contracts.cc 2023-03-28 17:33:42.165326812 +0200 @@ -161,6 +161,7 @@ along with GCC; see the file COPYING3. #include "tree-iterator.h" #include "print-tree.h" #include "stor-layout.h" +#include "intl.h" const int max_custom_roles = 32; static contract_role contract_build_roles[max_custom_roles] = { @@ -636,17 +637,15 @@ bool check_postcondition_result (tree decl, tree type, location_t loc) { if (VOID_TYPE_P (type)) - { - const char* what; - if (DECL_CONSTRUCTOR_P (decl)) - what = "constructor"; - else if (DECL_DESTRUCTOR_P (decl)) - what = "destructor"; - else - what = "function"; - error_at (loc, "%s does not return a value to test", what); - return false; - } + { + error_at (loc, + DECL_CONSTRUCTOR_P (decl) + ? G_("constructor does not return a value to test") + : DECL_DESTRUCTOR_P (decl) + ? G_("destructor does not return a value to test") + : G_("function does not return a value to test")); + return false; + } return true; } Jakub