Compiling the following code snippet with the German locale enabled causes an ICE: ================================ template<int,int> struct A; template<int> struct A {}; ================================ bug.cc:1: Fehler: previous declaration »template<int <anonymous>, int <anonymous> > struct A« bug.cc:2: Fehler: 2 Template-Parameter bug.cc:2: interner Compiler-Fehler: in pp_base_format_text, bei pretty-print.c:357 Bitte senden Sie einen vollständigen Fehlerbericht auf Englisch ein; bearbeiten Sie die Quellen zunächst mit einem Präprozessor, wenn es dienlich ist. Fehler in der deutschen Übersetzung sind an de@li.org zu melden. Gehen Sie gemäß den Hinweisen in <URL:http://gcc.gnu.org/bugs.html> vor. This is partly due to the fact that the code snippet in cp/pt.c that generates the original message violates the coding conventions (see http://www.gnu.org/prep/standards/standards.html#Internationalization): error ("used %d template parameter%s instead of %d", TREE_VEC_LENGTH (tmpl_parms), TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s", TREE_VEC_LENGTH (parms)); The patch below fixes that by removing the conditional and using "parameter(s)" in the text. This should simplify i18n efforts. ============================================================================= --- gcc/gcc/cp/pt.c 2005-05-25 00:00:57.000000000 +0200 +++ gcc/gcc/cp/pt.c 2005-05-25 00:35:03.000000000 +0200 @@ -3225,10 +3225,9 @@ redeclare_class_template (tree type, tre if (TREE_VEC_LENGTH (parms) != TREE_VEC_LENGTH (tmpl_parms)) { cp_error_at ("previous declaration %qD", tmpl); - error ("used %d template parameter%s instead of %d", - TREE_VEC_LENGTH (tmpl_parms), - TREE_VEC_LENGTH (tmpl_parms) == 1 ? "" : "s", - TREE_VEC_LENGTH (parms)); + error ("used %d template parameter(s) instead of %d", + TREE_VEC_LENGTH (tmpl_parms), + TREE_VEC_LENGTH (parms)); return; } ============================================================================= Alternatively, one could make two messages, one for 1 parameter and one for 0 or more than 1. But I don't think that this is worthwhile. Btw, do all languages use the plural form for 0 parameters? That's an implicit assumption that might not be true. The ICE with the German locale appeared in gcc 3.4.4 (before we did not have a German translation for that error message). Therefore I'd like to apply the patch not only to mainline, but also to the 3.4 and 4.0 branch as a first step towards removing the ICE.
Confirmed.
Subject: Bug 21768 CVSROOT: /cvs/gcc Module name: gcc Changes by: reichelt@gcc.gnu.org 2005-05-26 16:04:45 Modified files: gcc/cp : ChangeLog pt.c Log message: PR c++/21768 * pt.c (redeclare_class_template): Change error message according to coding conventions. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.4757&r2=1.4758 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&r1=1.998&r2=1.999
Subject: Bug 21768 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-4_0-branch Changes by: reichelt@gcc.gnu.org 2005-05-26 16:09:04 Modified files: gcc/cp : ChangeLog pt.c Log message: PR c++/21768 * pt.c (redeclare_class_template): Change error message according to coding conventions. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.4648.2.44&r2=1.4648.2.45 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.978.2.10&r2=1.978.2.11
Subject: Bug 21768 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_4-branch Changes by: reichelt@gcc.gnu.org 2005-05-26 16:13:41 Modified files: gcc/cp : ChangeLog pt.c Log message: PR c++/21768 * pt.c (redeclare_class_template): Change error message according to coding conventions. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3892.2.219&r2=1.3892.2.220 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.816.2.52&r2=1.816.2.53
OK, the original error messages have been fixed for gcc 3.4.5, gcc 4.0.1 and mainline. Let's keep the PR open until the .po files got fixed, too.
For the record: I just notified the translation team.
The .po files have been fixed for GCC 4.0.1 and mainline. We are just missing the .po file for GCC 3.4.5.
Changing component, since we are only missing the updated .po file.
This ought to use ngettext.
Subject: Re: [3.4 regression] ICE in error message due to violation of coding conventions On 31 Aug, bonzini at gcc dot gnu dot org wrote: > This ought to use ngettext. That's not necessary. The trickery with the plural s that would have made ngettext necessary was a violation of the coding conventions, anyway. This is already fixed by using a different error message. We are just waiting for a new .po file with a suitable translation. This won't arrive until close to the release, however. This PR is just a reminder to test whether the translation really got fixed before spinning the release.
The .po file is missing and we haven't received one for a while. This is not a release blocking issue. Closing as essentially fixed.