From 351a0f00dc8747210fa96e1f65574bd52b140713 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 20 Apr 2001 10:17:19 +0200 Subject: [PATCH] call.c (maybe_handle_ref_bind): Copy ICS_USER_FLAG and ICS_BAD_FLAG. * call.c (maybe_handle_ref_bind): Copy ICS_USER_FLAG and ICS_BAD_FLAG. * g++.old-deja/g++.other/overload14.C: New test. From-SVN: r41448 --- gcc/cp/ChangeLog | 5 +++ gcc/cp/call.c | 5 ++- gcc/testsuite/ChangeLog | 4 +++ .../g++.old-deja/g++.other/overload14.C | 31 +++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/overload14.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 24af2b4c4f9..16a03dcf18c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2001-04-20 Jakub Jelinek + + * call.c (maybe_handle_ref_bind): Copy ICS_USER_FLAG and + ICS_BAD_FLAG. + 2001-04-20 Jakub Jelinek * search.c (lookup_field_r): If looking for type and non-TYPE_DECL diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 548bd008fe6..4d4d033c130 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4741,11 +4741,14 @@ maybe_handle_ref_bind (ics, target_type) { if (TREE_CODE (*ics) == REF_BIND) { + tree old_ics = *ics; *target_type = TREE_TYPE (TREE_TYPE (*ics)); *ics = TREE_OPERAND (*ics, 0); + ICS_USER_FLAG (*ics) = ICS_USER_FLAG (old_ics); + ICS_BAD_FLAG (*ics) = ICS_BAD_FLAG (old_ics); return 1; } - + return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ceeb4083c0..2a97b4e6832 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-04-20 Jakub Jelinek + + * g++.old-deja/g++.other/overload14.C: New test. + 2001-04-20 Jakub Jelinek * g++.old-deja/g++.other/lookup23.C: New test. diff --git a/gcc/testsuite/g++.old-deja/g++.other/overload14.C b/gcc/testsuite/g++.old-deja/g++.other/overload14.C new file mode 100644 index 00000000000..8938ef1d7d4 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/overload14.C @@ -0,0 +1,31 @@ +extern "C" void abort(); + +struct A { + typedef double (&B); + typedef const double (&C); + + A() { } + + operator C () const; + operator B (); +}; + +static const double d = 2.0; +static double e = 3.0; + +A::operator A::C () const +{ + abort (); + return d; +} + +A::operator A::B () +{ + return e; +} + +int main () +{ + (A::C) A (); // WARNING - + return 0; +} -- 2.30.2