Attempting to compile the following example (with no explicit command-line arguments) results in an ICE: ----------------------------------- typedef unsigned char RESET_OCCUR_DT; typedef struct { RESET_OCCUR_DT* pResetOccur; } DintgRec; template<typename T> void f() { int i, resetScalar; DintgRec* s; if (s->pResetOccur[resetScalar ? 0 : i] != 0U) { } } void g() { f<int>(); } ------------------------------------------------------ Here's the exact compiler output: ice.C: In function `void f()': ice.C:13: internal compiler error: in invert_truthvalue, at fold-const.c:2697 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions. cnewbold@sarge:~/playpen$ --------------------------------------------- And here's the output of '-v' on the compiler in question: Reading specs from /mathworks/hub/Linux/glibc-2.3.2/i686/apps/gcc-3.4.4/bin/../lib/gcc/i686-pc-linux-gnu/3.4.4/specs Configured with: /home/cnewbold/src/gnu/gcc-3.4.4/configure --enable-__cxa_atexit --prefix=/hub/Linux/glibc-2.3.2/i686/apps/gcc-3.4.4 Thread model: posix gcc version 3.4.4
Reduced testcase: template<int> void f() { int *t, i; t[i ? 0 : i]; }
Looking into it
It's weird we only fail with f being a template function. In fact, only in this case we reach the point where we try the invalid folding. Nevertheless, I have an (obvious) patch. Testing in progress.
While my patch is to the middle-end, the C++ frontend part causing this is build_x_conditional_expr ... expr = build_conditional_expr (ifexp, op1, op2); if (processing_template_decl && expr != error_mark_node) return build_min_non_dep (COND_EXPR, expr, orig_ifexp, orig_op1, orig_op2); where in the case of a template decl, the valid expr i != 0 ? 0 : i is thrown away and rebuilt as i ? 0 : i, where the default conversion is no longer applied. That could be fixed using perform_implicit_conversion (boolean_type_node, orig_ifexp) - but I don't know if that would succeed in case of i being a template param. We use this (potentially dependent) expr later to create a non-dependent expr where we fail to apply the default conversion, too, in pt.c:build_non_dependent_expr we could fix that there, too, performing default conversion if the type is not correct. And later in typeck.c:build_array_ref we happen to call fold on the invalid(?) COND_EXPR. Of course I'm a lot less confident on the C++ fix than on the fold one.
Patches: http://gcc.gnu.org/ml/gcc-patches/2005-08/msg01739.html http://gcc.gnu.org/ml/gcc-patches/2005-08/msg01740.html
Subject: Bug 23624 CVSROOT: /cvs/gcc Module name: gcc Changes by: rguenth@gcc.gnu.org 2005-09-09 09:00:42 Modified files: gcc : ChangeLog fold-const.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/tree-ssa: pr23624.C Log message: 2005-09-09 Richard Guenther <rguenther@suse.de> PR c++/23624 * fold-const.c (fold_ternary): Check truth_value_p before calling invert_truthvalue. * g++.dg/tree-ssa/pr23624.C: New testcase. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.9923&r2=2.9924 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fold-const.c.diff?cvsroot=gcc&r1=1.624&r2=1.625 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.6039&r2=1.6040 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/tree-ssa/pr23624.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
Subject: Bug 23624 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-4_0-branch Changes by: rguenth@gcc.gnu.org 2005-09-09 09:25:25 Modified files: gcc : ChangeLog fold-const.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/tree-ssa: pr23624.C Log message: 2005-09-09 Richard Guenther <rguenther@suse.de> PR c++/23624 * fold-const.c (fold): Check truth_value_p before calling invert_truthvalue. * g++.dg/tree-ssa/pr23624.C: New testcase. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.421&r2=2.7592.2.422 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fold-const.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.517.2.15&r2=1.517.2.16 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.5084.2.395&r2=1.5084.2.396 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/tree-ssa/pr23624.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1
Fixed everywhere.
Subject: Bug 23624 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_4-branch Changes by: rguenth@gcc.gnu.org 2005-09-09 10:20:03 Modified files: gcc : ChangeLog fold-const.c Log message: 2005-09-09 Richard Guenther <rguenther@suse.de> PR c++/23624 * fold-const.c (fold): Check truth_value_p before calling invert_truthvalue. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.915&r2=2.2326.2.916 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/fold-const.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.322.2.18&r2=1.322.2.19
Subject: Bug number PR23624 A patch for this bug has been added to the patch tracker. The mailing list url for the patch is http://gcc.gnu.org/ml/gcc-patches/2005-08/msg01740.html