Bug 23624 - [3.4/4.0/4.1 Regression] ICE: internal compiler error: in invert_truthvalue, at fold-const.c:2697
[3.4/4.0/4.1 Regression] ICE: internal compiler error: in invert_truthvalue, ...
Status: RESOLVED FIXED
Product: gcc
Classification: Unclassified
Component: c++
3.4.4
: P2 normal
: 3.4.5
Assigned To: Richard Biener
: ice-on-valid-code, patch
Depends on:
Blocks:
  Show dependency treegraph
 
Reported: 2005-08-29 15:11 UTC by Chris Newbold
Modified: 2005-09-09 10:20 UTC (History)
1 user (show)

See Also:
Host: i686-pc-linux-gnu
Target: i686-pc-linux-gnu
Build:
Known to work: 3.3.3
Known to fail: 3.4.0 4.0.0 4.1.0
Last reconfirmed: 2005-08-30 08:17:22


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Chris Newbold 2005-08-29 15:11:48 UTC
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
Comment 1 Andrew Pinski 2005-08-29 15:35:43 UTC
Reduced testcase:
template<int>
void f()
{
    int *t, i;
    t[i ? 0 : i];
}
Comment 2 Richard Biener 2005-08-30 08:17:21 UTC
Looking into it
Comment 3 Richard Biener 2005-08-30 08:58:09 UTC
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.
Comment 4 Richard Biener 2005-08-30 09:42:32 UTC
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.
Comment 6 CVS Commits 2005-09-09 09:01:01 UTC
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

Comment 7 CVS Commits 2005-09-09 09:25:44 UTC
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

Comment 8 Richard Biener 2005-09-09 10:20:45 UTC
Fixed everywhere.
Comment 9 CVS Commits 2005-09-09 10:21:02 UTC
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

Comment 10 patchapp@dberlin.org 2006-08-11 21:06:18 UTC
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