Subject: bin/2827: gcc 2.7.2.1 fixes compiler bugs
To: None <gnats-bugs@gnats.netbsd.org>
From: Mike Long <mike.long@analog.com>
List: netbsd-bugs
Date: 10/09/1996 23:07:09
>Number: 2827
>Category: bin
>Synopsis: gcc 2.7.2.1 fixes compiler bugs
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: bin-bug-people (Utility Bug People)
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Wed Oct 9 20:20:01 1996
>Last-Modified:
>Originator: Mike Long <mike.long@analog.com>
>Organization:
Church of the Anti-Gates
>Release: 1.2_BETA
>Environment:
System: NetBSD azathoth 1.2_BETA NetBSD 1.2_BETA (AZATHOTH) #100: Mon Sep 2 21:56:30 EDT 1996 root@azathoth:/usr/src/sys/arch/i386/compile/AZATHOTH i386
>Description:
A number of code-generation and other bugs were fixed in gcc
version 2.7.2.1.
>How-To-Repeat:
cd /usr/src; make build
>Fix:
Apply the patches below, most of which were adapted from the
FSF's gcc-2.7.2-2.7.2.1.diff patch file. I've tested these changes on
the i386; other ports' mileage may vary.
*** src/gnu/usr.bin/gcc/gcc2netbsd.orig Fri Jun 7 07:22:58 1996
--- src/gnu/usr.bin/gcc/gcc2netbsd Thu Aug 15 00:55:51 1996
***************
*** 24,28 ****
#
! $version = "2.7.2";
# definitions ...
--- 24,28 ----
#
! $version = "2.7.2.1";
# definitions ...
*** src/gnu/usr.bin/gcc/arch/arm32/config.h.orig Sat May 18 07:15:27 1996
--- src/gnu/usr.bin/gcc/arch/arm32/config.h Thu Aug 15 00:56:26 1996
***************
*** 1,4 ****
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2"
#define DEFAULT_TARGET_MACHINE "NetBSD/arm32"
#include "arm32/xm-netbsd.h"
--- 1,4 ----
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2.1"
#define DEFAULT_TARGET_MACHINE "NetBSD/arm32"
#include "arm32/xm-netbsd.h"
*** src/gnu/usr.bin/gcc/arch/arm32/arm32.md.orig Sat May 18 07:15:26 1996
--- src/gnu/usr.bin/gcc/arch/arm32/arm32.md Thu Aug 15 00:32:53 1996
***************
*** 3317,3323 ****
(define_expand "movsicc"
[(set (match_operand:SI 0 "register_operand" "")
! (if_then_else (match_operand 1 "comparison_operator" "")
! (match_operand:SI 2 "arm_not_operand" "")
! (match_operand:SI 3 "register_operand" "")))]
"0"
"
--- 3317,3323 ----
(define_expand "movsicc"
[(set (match_operand:SI 0 "register_operand" "")
! (if_then_else:SI (match_operand 1 "comparison_operator" "")
! (match_operand:SI 2 "arm_not_operand" "")
! (match_operand:SI 3 "register_operand" "")))]
"0"
"
***************
*** 3332,3338 ****
(define_expand "movsfcc"
[(set (match_operand:SF 0 "register_operand" "")
! (if_then_else (match_operand 1 "comparison_operator" "")
! (match_operand:SF 2 "nonmemory_operand" "")
! (match_operand:SF 3 "register_operand" "")))]
""
"
--- 3332,3338 ----
(define_expand "movsfcc"
[(set (match_operand:SF 0 "register_operand" "")
! (if_then_else:SF (match_operand 1 "comparison_operator" "")
! (match_operand:SF 2 "nonmemory_operand" "")
! (match_operand:SF 3 "register_operand" "")))]
""
"
***************
*** 3347,3353 ****
(define_expand "movdfcc"
[(set (match_operand:DF 0 "register_operand" "")
! (if_then_else (match_operand 1 "comparison_operator" "")
! (match_operand:DF 2 "nonmemory_operand" "")
! (match_operand:DF 3 "register_operand" "")))]
"TARGET_HARD_FLOAT"
"
--- 3347,3353 ----
(define_expand "movdfcc"
[(set (match_operand:DF 0 "register_operand" "")
! (if_then_else:DF (match_operand 1 "comparison_operator" "")
! (match_operand:DF 2 "nonmemory_operand" "")
! (match_operand:DF 3 "register_operand" "")))]
"TARGET_HARD_FLOAT"
"
***************
*** 3362,3369 ****
(define_insn "*movsicc_insn"
[(set (match_operand:SI 0 "register_operand" "=r,r")
! (if_then_else (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:SI 2 "arm_not_operand" "rI,K")
! (match_operand:SI 3 "register_operand" "0,0")))]
""
"@
--- 3362,3369 ----
(define_insn "*movsicc_insn"
[(set (match_operand:SI 0 "register_operand" "=r,r")
! (if_then_else:SI (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:SI 2 "arm_not_operand" "rI,K")
! (match_operand:SI 3 "register_operand" "0,0")))]
""
"@
***************
*** 3375,3382 ****
(define_insn "*movsfcc_hard_insn"
[(set (match_operand:SF 0 "register_operand" "=f")
! (if_then_else (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:SF 2 "register_operand" "f")
! (match_operand:SF 3 "register_operand" "0")))]
"TARGET_HARD_FLOAT"
"mvf%d1s\\t%0, %2"
--- 3375,3382 ----
(define_insn "*movsfcc_hard_insn"
[(set (match_operand:SF 0 "register_operand" "=f")
! (if_then_else:SF (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:SF 2 "register_operand" "f")
! (match_operand:SF 3 "register_operand" "0")))]
"TARGET_HARD_FLOAT"
"mvf%d1s\\t%0, %2"
***************
*** 3386,3393 ****
(define_insn "*movsfcc_soft_insn"
[(set (match_operand:SF 0 "register_operand" "=r")
! (if_then_else (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:SF 2 "register_operand" "r")
! (match_operand:SF 3 "register_operand" "0")))]
"TARGET_SOFT_FLOAT"
"mov%d1\\t%0, %2"
--- 3386,3393 ----
(define_insn "*movsfcc_soft_insn"
[(set (match_operand:SF 0 "register_operand" "=r")
! (if_then_else:SF (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:SF 2 "register_operand" "r")
! (match_operand:SF 3 "register_operand" "0")))]
"TARGET_SOFT_FLOAT"
"mov%d1\\t%0, %2"
***************
*** 3397,3404 ****
(define_insn "*movdfcc_insn"
[(set (match_operand:DF 0 "register_operand" "=f")
! (if_then_else (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:DF 2 "register_operand" "f")
! (match_operand:DF 3 "register_operand" "0")))]
"TARGET_HARD_FLOAT"
"mvf%d1d\\t%0, %2"
--- 3397,3404 ----
(define_insn "*movdfcc_insn"
[(set (match_operand:DF 0 "register_operand" "=f")
! (if_then_else:DF (match_operator 1 "comparison_operator"
! [(reg 24) (const_int 0)])
! (match_operand:DF 2 "register_operand" "f")
! (match_operand:DF 3 "register_operand" "0")))]
"TARGET_HARD_FLOAT"
"mvf%d1d\\t%0, %2"
*** src/gnu/usr.bin/gcc/arch/i386/config.h.orig Mon Dec 11 15:13:55 1995
--- src/gnu/usr.bin/gcc/arch/i386/config.h Thu Aug 15 00:56:33 1996
***************
*** 1,4 ****
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2"
#define DEFAULT_TARGET_MACHINE "NetBSD/i386"
#include "i386/xm-netbsd.h"
--- 1,4 ----
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2.1"
#define DEFAULT_TARGET_MACHINE "NetBSD/i386"
#include "i386/xm-netbsd.h"
*** src/gnu/usr.bin/gcc/arch/m68k/config.h.orig Mon Dec 11 15:14:03 1995
--- src/gnu/usr.bin/gcc/arch/m68k/config.h Thu Aug 15 00:56:38 1996
***************
*** 1,4 ****
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2"
#define DEFAULT_TARGET_MACHINE "NetBSD/m68k"
#include "m68k/xm-netbsd.h"
--- 1,4 ----
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2.1"
#define DEFAULT_TARGET_MACHINE "NetBSD/m68k"
#include "m68k/xm-netbsd.h"
*** src/gnu/usr.bin/gcc/arch/mips/config.h.orig Mon Dec 11 15:14:15 1995
--- src/gnu/usr.bin/gcc/arch/mips/config.h Thu Aug 15 00:56:42 1996
***************
*** 1,4 ****
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2"
#define DEFAULT_TARGET_MACHINE "NetBSD/mips"
#include "mips/xm-netbsd.h"
--- 1,4 ----
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2.1"
#define DEFAULT_TARGET_MACHINE "NetBSD/mips"
#include "mips/xm-netbsd.h"
*** src/gnu/usr.bin/gcc/arch/mips/mips.c.orig Mon Dec 11 15:14:18 1995
--- src/gnu/usr.bin/gcc/arch/mips/mips.c Thu Aug 15 00:32:55 1996
***************
*** 4929,4933 ****
rtx entry_parm;
! if (TYPE_NEEDS_CONSTRUCTING (passed_type))
{
passed_type = build_pointer_type (passed_type);
--- 4929,4933 ----
rtx entry_parm;
! if (TREE_ADDRESSABLE (passed_type))
{
passed_type = build_pointer_type (passed_type);
*** src/gnu/usr.bin/gcc/arch/ns32k/config.h.orig Mon Dec 11 15:14:22 1995
--- src/gnu/usr.bin/gcc/arch/ns32k/config.h Thu Aug 15 00:56:46 1996
***************
*** 1,4 ****
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2"
#define DEFAULT_TARGET_MACHINE "NetBSD/ns32k"
#include "ns32k/xm-netbsd.h"
--- 1,4 ----
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2.1"
#define DEFAULT_TARGET_MACHINE "NetBSD/ns32k"
#include "ns32k/xm-netbsd.h"
*** src/gnu/usr.bin/gcc/arch/sparc/config.h.orig Mon Dec 11 15:14:25 1995
--- src/gnu/usr.bin/gcc/arch/sparc/config.h Thu Aug 15 00:56:51 1996
***************
*** 1,4 ****
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2"
#define DEFAULT_TARGET_MACHINE "NetBSD/sparc"
#include "sparc/xm-netbsd.h"
--- 1,4 ----
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2.1"
#define DEFAULT_TARGET_MACHINE "NetBSD/sparc"
#include "sparc/xm-netbsd.h"
*** src/gnu/usr.bin/gcc/arch/sparc/sparc.h.orig Mon Dec 11 15:14:28 1995
--- src/gnu/usr.bin/gcc/arch/sparc/sparc.h Thu Aug 15 00:32:56 1996
***************
*** 622,637 ****
fixed_regs[regno] = 1; \
} \
! if (! TARGET_APP_REGS) \
! { \
! fixed_regs[2] = 1; \
! fixed_regs[3] = 1; \
! fixed_regs[4] = 1; \
! } \
! else \
! { \
! fixed_regs[2] = 0; \
! fixed_regs[3] = 0; \
! fixed_regs[4] = TARGET_MEDANY != 0; \
! } \
if (TARGET_FLAT) \
{ \
--- 622,629 ----
fixed_regs[regno] = 1; \
} \
! /* Don't unfix g2-g4 if they were fixed with -ffixed-. */ \
! fixed_regs[2] |= ! TARGET_APP_REGS; \
! fixed_regs[3] |= ! TARGET_APP_REGS; \
! fixed_regs[4] |= ! TARGET_APP_REGS || TARGET_MEDANY; \
if (TARGET_FLAT) \
{ \
*** src/gnu/usr.bin/gcc/arch/vax/config.h.orig Mon Dec 11 15:14:34 1995
--- src/gnu/usr.bin/gcc/arch/vax/config.h Thu Aug 15 00:56:55 1996
***************
*** 1,4 ****
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2"
#define DEFAULT_TARGET_MACHINE "NetBSD/vax"
#include "vax/xm-netbsd.h"
--- 1,4 ----
#define NETBSD_NATIVE
! #define DEFAULT_TARGET_VERSION "2.7.2.1"
#define DEFAULT_TARGET_MACHINE "NetBSD/vax"
#include "vax/xm-netbsd.h"
*** src/gnu/usr.bin/gcc/arch/vax/vax.h.orig Mon Dec 11 15:14:35 1995
--- src/gnu/usr.bin/gcc/arch/vax/vax.h Thu Aug 15 00:32:56 1996
***************
*** 964,968 ****
{ if (GET_CODE (SET_SRC (EXP)) == CALL) \
CC_STATUS_INIT; \
! else if (GET_CODE (SET_DEST (EXP)) != PC) \
{ cc_status.flags = 0; \
cc_status.value1 = SET_DEST (EXP); \
--- 964,969 ----
{ if (GET_CODE (SET_SRC (EXP)) == CALL) \
CC_STATUS_INIT; \
! else if (GET_CODE (SET_DEST (EXP)) != ZERO_EXTRACT \
! && GET_CODE (SET_DEST (EXP)) != PC) \
{ cc_status.flags = 0; \
cc_status.value1 = SET_DEST (EXP); \
*** src/gnu/usr.bin/gcc/arch/vax/vax.md.orig Sun Dec 31 07:11:48 1995
--- src/gnu/usr.bin/gcc/arch/vax/vax.md Thu Aug 15 00:32:57 1996
***************
*** 1342,1345 ****
--- 1342,1346 ----
= adj_offsettable_operand (operands[0], INTVAL (operands[2]) / 8);
+ CC_STATUS_INIT;
if (INTVAL (operands[1]) == 8)
return \"movb %3,%0\";
*** src/gnu/usr.bin/gcc/common/c-typeck.c.orig Mon Dec 11 15:15:55 1995
--- src/gnu/usr.bin/gcc/common/c-typeck.c Thu Aug 15 00:32:52 1996
***************
*** 5724,5727 ****
--- 5724,5729 ----
else if (last != 0 && TREE_CODE (last) != INTEGER_CST)
error_init ("nonconstant array index in initializer%s", " for `%s'", NULL);
+ else if (! constructor_unfilled_index)
+ error_init ("array index in non-array initializer%s", " for `%s'", NULL);
else if (tree_int_cst_lt (first, constructor_unfilled_index))
error_init ("duplicate array index in initializer%s", " for `%s'", NULL);
*** src/gnu/usr.bin/gcc/common/expr.c.orig Mon Dec 11 15:16:26 1995
--- src/gnu/usr.bin/gcc/common/expr.c Thu Aug 15 00:32:59 1996
***************
*** 4583,4587 ****
never change. Languages where it can never change should
also set TREE_STATIC. */
! RTX_UNCHANGING_P (temp) = TREE_READONLY (exp) | TREE_STATIC (exp);
return temp;
}
--- 4583,4587 ----
never change. Languages where it can never change should
also set TREE_STATIC. */
! RTX_UNCHANGING_P (temp) = TREE_READONLY (exp) & TREE_STATIC (exp);
return temp;
}
*** src/gnu/usr.bin/gcc/common/loop.c.orig Mon Dec 11 15:17:57 1995
--- src/gnu/usr.bin/gcc/common/loop.c Thu Aug 15 00:34:01 1996
***************
*** 6042,6046 ****
/* Can replace with any giv that was reduced and
that has (MULT_VAL != 0) and (ADD_VAL == 0).
! Require a constant for MULT_VAL, so we know it's nonzero. */
for (v = bl->giv; v; v = v->next_iv)
--- 6042,6048 ----
/* Can replace with any giv that was reduced and
that has (MULT_VAL != 0) and (ADD_VAL == 0).
! Require a constant for MULT_VAL, so we know it's nonzero.
! ??? We disable this optimization to avoid potential
! overflows. */
for (v = bl->giv; v; v = v->next_iv)
***************
*** 6048,6052 ****
&& v->add_val == const0_rtx
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode)
{
if (! eliminate_p)
--- 6050,6055 ----
&& v->add_val == const0_rtx
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode
! && 0)
{
if (! eliminate_p)
***************
*** 6068,6077 ****
/* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
! Require a constant for MULT_VAL, so we know it's nonzero. */
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode)
{
if (! eliminate_p)
--- 6071,6087 ----
/* Look for a giv with (MULT_VAL != 0) and (ADD_VAL != 0);
replace test insn with a compare insn (cmp REDUCED_GIV ADD_VAL).
! Require a constant for MULT_VAL, so we know it's nonzero.
! ??? Do this only if ADD_VAL is a pointer to avoid a potential
! overflow problem. */
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && v->mult_val != const0_rtx
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode
! && (GET_CODE (v->add_val) == SYMBOL_REF
! || GET_CODE (v->add_val) == LABEL_REF
! || GET_CODE (v->add_val) == CONST
! || (GET_CODE (v->add_val) == REG
! && REGNO_POINTER_FLAG (REGNO (v->add_val)))))
{
if (! eliminate_p)
***************
*** 6128,6132 ****
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
! && CONSTANT_P (v->add_val)
&& ! v->ignore && ! v->maybe_dead && v->always_computable
&& v->mode == mode)
--- 6138,6146 ----
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
! && (GET_CODE (v->add_val) == SYMBOL_REF
! || GET_CODE (v->add_val) == LABEL_REF
! || GET_CODE (v->add_val) == CONST
! || (GET_CODE (v->add_val) == REG
! && REGNO_POINTER_FLAG (REGNO (v->add_val))))
&& ! v->ignore && ! v->maybe_dead && v->always_computable
&& v->mode == mode)
***************
*** 6161,6170 ****
/* Look for giv with positive constant mult_val and nonconst add_val.
! Insert insns to calculate new compare value. */
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode)
{
rtx tem;
--- 6175,6186 ----
/* Look for giv with positive constant mult_val and nonconst add_val.
! Insert insns to calculate new compare value.
! ??? Turn this off due to possible overflow. */
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode
! && 0)
{
rtx tem;
***************
*** 6192,6201 ****
{
/* Look for giv with constant positive mult_val and nonconst
! add_val. Insert insns to compute new compare value. */
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode)
{
rtx tem;
--- 6208,6219 ----
{
/* Look for giv with constant positive mult_val and nonconst
! add_val. Insert insns to compute new compare value.
! ??? Turn this off due to possible overflow. */
for (v = bl->giv; v; v = v->next_iv)
if (CONSTANT_P (v->mult_val) && INTVAL (v->mult_val) > 0
&& ! v->ignore && ! v->maybe_dead && v->always_computable
! && v->mode == mode
! && 0)
{
rtx tem;
*** src/gnu/usr.bin/gcc/common/stor-layout.c.orig Mon Dec 11 15:19:02 1995
--- src/gnu/usr.bin/gcc/common/stor-layout.c Thu Aug 15 00:33:12 1996
***************
*** 438,442 ****
or because it exceeds maximum_field_alignment. */
if (const_size / type_align
! != (const_size + field_size - 1) / type_align)
const_size = CEIL (const_size, type_align) * type_align;
}
--- 438,442 ----
or because it exceeds maximum_field_alignment. */
if (const_size / type_align
! != (const_size + (field_size % type_align) - 1) / type_align)
const_size = CEIL (const_size, type_align) * type_align;
}
*** src/gnu/usr.bin/gcc/common/version.c.orig Mon Dec 11 15:19:12 1995
--- src/gnu/usr.bin/gcc/common/version.c Thu Aug 15 00:33:29 1996
***************
*** 1 ****
! char *version_string = "2.7.2";
--- 1 ----
! char *version_string = "2.7.2.1";
*** src/gnu/usr.bin/gcc/cc1plus/decl2.c.orig Mon Dec 11 15:15:02 1995
--- src/gnu/usr.bin/gcc/cc1plus/decl2.c Thu Aug 15 00:32:57 1996
***************
*** 1364,1368 ****
value = grokdeclarator (declarator, declspecs, FIELD, init != 0,
! raises, attrlist);
if (! value)
return value; /* friend or constructor went bad. */
--- 1364,1368 ----
value = grokdeclarator (declarator, declspecs, FIELD, init != 0,
! raises, NULL_TREE);
if (! value)
return value; /* friend or constructor went bad. */
***************
*** 1477,1480 ****
--- 1477,1484 ----
/* The corresponding pop_obstacks is in cp_finish_decl. */
push_obstacks_nochange ();
+
+ if (attrlist)
+ cplus_decl_attributes (value, TREE_PURPOSE (attrlist),
+ TREE_VALUE (attrlist));
if (TREE_CODE (value) == VAR_DECL)
*** src/gnu/usr.bin/gcc/cc1plus/lex.c.orig Mon Dec 11 15:15:06 1995
--- src/gnu/usr.bin/gcc/cc1plus/lex.c Thu Aug 15 00:32:58 1996
***************
*** 3314,3317 ****
--- 3314,3325 ----
token_buffer[1] = 0;
}
+ else if (ptr->token == NAMESPACE)
+ {
+ static int warned;
+ if (! warned)
+ warning ("namespaces are mostly broken in this version of g++");
+
+ warned = 1;
+ }
value = (int) ptr->token;
*** src/gnu/usr.bin/gcc/libobjc/hash.c.orig Mon Dec 11 15:19:33 1995
--- src/gnu/usr.bin/gcc/libobjc/hash.c Thu Aug 15 00:33:11 1996
***************
*** 244,250 ****
if (node)
do {
! if ((*cache->compare_func)(node->key, key))
retval = node->value;
! else
node = node->next;
} while (!retval && node);
--- 244,251 ----
if (node)
do {
! if ((*cache->compare_func)(node->key, key)) {
retval = node->value;
! break;
! } else
node = node->next;
} while (!retval && node);
>Audit-Trail:
>Unformatted: