From: Nathan Sidwell Date: Wed, 25 Jul 2001 09:00:37 +0000 (+0000) Subject: re PR c++/3543 (gcc-3.0 Internal error #56 in resolve_offset_ref, at cp/init.c:1963) X-Git-Tag: prereleases/libstdc++-3.0.95~3064 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab085207aad52d58945ea30b78c04e050d7b5a9a;p=thirdparty%2Fgcc.git re PR c++/3543 (gcc-3.0 Internal error #56 in resolve_offset_ref, at cp/init.c:1963) cp: PR c++/3543 * typeck.c (condition_conversion): Resolve an OFFSET_REF. * expr.c (cplus_expand_expr): An OFFSET_REF should never get here. testsuite: * g++.old-deja/g++.other/optimize4.C: New test. From-SVN: r44340 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6ae301c5c3a5..9d1844dabb52 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2001-07-25 Nathan Sidwell + + PR c++/3543 + * typeck.c (condition_conversion): Resolve an OFFSET_REF. + * expr.c (cplus_expand_expr): An OFFSET_REF should never get here. + 2001-07-25 Nathan Sidwell * class.c (build_vtbl_or_vbase_field): Remove, move into ... diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c index 6855160fc190..f2fe6ebf4768 100644 --- a/gcc/cp/expr.c +++ b/gcc/cp/expr.c @@ -105,9 +105,10 @@ cplus_expand_expr (exp, target, tmode, modifier) target, tmode, modifier); case OFFSET_REF: - return expand_expr (default_conversion (resolve_offset_ref (exp)), - target, tmode, EXPAND_NORMAL); - + /* Offset refs should not make it through to here. */ + my_friendly_abort (20010724); + return const0_rtx; + case THROW_EXPR: expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode, 0); return NULL; diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 358037332d45..a6ddcf269f76 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4331,6 +4331,8 @@ condition_conversion (expr) tree t; if (processing_template_decl) return expr; + if (TREE_CODE (expr) == OFFSET_REF) + expr = resolve_offset_ref (expr); t = perform_implicit_conversion (boolean_type_node, expr); t = fold (build1 (CLEANUP_POINT_EXPR, boolean_type_node, t)); return t; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bf7fe1c542be..abf5ae4c5e27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-07-25 Nathan Sidwell + + * g++.old-deja/g++.other/optimize4.C: New test. + 2001-07-25 Nathan Sidwell * g++.old-deja/g++.abi/vbase8-5.C: New test. diff --git a/gcc/testsuite/g++.old-deja/g++.other/optimize4.C b/gcc/testsuite/g++.old-deja/g++.other/optimize4.C new file mode 100644 index 000000000000..7082e2cb9512 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/optimize4.C @@ -0,0 +1,31 @@ +// Build don't link: +// +// Copyright (C) 2001 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 24 Jul 2001 + +// Bug 3543. We forgot to resolve an OFFSET_REF + + +struct Writeable { + bool blocking_mode; +}; + + +struct Pipe : Writeable { + void ewrite(); + + void set_write_blocking () + { + if (Writeable::blocking_mode); + } +}; + +void Pipe::ewrite() +{ + set_write_blocking(); +} + +void ewrite(Pipe &p) +{ + p.set_write_blocking(); +}