From f1a3f197e1f19c0b439d84d2e3ce11ab21c507a0 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 16 Feb 2001 01:24:14 +0000 Subject: [PATCH] * typeck2.c (build_m_component_ref): Robustify. From-SVN: r39731 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/typeck2.c | 15 ++++++++------- gcc/testsuite/g++.old-deja/g++.other/ptrmem6.C | 6 +++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e8119eac4a7..a65b21edc23 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2001-02-15 Mark Mitchell + + * typeck2.c (build_m_component_ref): Robustify. + 2001-02-15 Alexandre Oliva * friend.c (do_friend): Don't take the nested [template] class diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 1538944ab5c..3c26b1b8dda 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1093,6 +1093,10 @@ build_m_component_ref (datum, component) return build_min_nt (DOTSTAR_EXPR, datum, component); datum = decay_conversion (datum); + + if (datum == error_mark_node || component == error_mark_node) + return error_mark_node; + objtype = TYPE_MAIN_VARIANT (TREE_TYPE (datum)); if (TYPE_PTRMEMFUNC_P (TREE_TYPE (component))) @@ -1100,18 +1104,15 @@ build_m_component_ref (datum, component) type = TREE_TYPE (TYPE_PTRMEMFUNC_FN_TYPE (TREE_TYPE (component))); field_type = type; } - else + else if (TYPE_PTRMEM_P (TREE_TYPE (component))) { type = TREE_TYPE (TREE_TYPE (component)); field_type = TREE_TYPE (type); } - - if (datum == error_mark_node || component == error_mark_node) - return error_mark_node; - - if (TREE_CODE (type) != OFFSET_TYPE && TREE_CODE (type) != METHOD_TYPE) + else { - cp_error ("`%E' cannot be used as a member pointer, since it is of type `%T'", component, type); + cp_error ("`%E' cannot be used as a member pointer, since it is of type `%T'", + component, TREE_TYPE (component)); return error_mark_node; } diff --git a/gcc/testsuite/g++.old-deja/g++.other/ptrmem6.C b/gcc/testsuite/g++.old-deja/g++.other/ptrmem6.C index 3e9db8daec9..7e9ab4e701c 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/ptrmem6.C +++ b/gcc/testsuite/g++.old-deja/g++.other/ptrmem6.C @@ -1,7 +1,7 @@ // Build don't link: -// crash test - XFAIL *-*-* +// crash test -// Copyright (c) 2000 Free Software Foundation. +// Copyright (c) 2000, 2001 Free Software Foundation. // Distilled from a bug report by Eric Ford extern double *y; @@ -12,5 +12,5 @@ void SetInitCond(void) { int i; for(i = 2; i < nPoints; ++i) - y[i] = y[nPoints] .* (x[i]-x[1]) / (x[nPoints]-x[1]); // ERROR + y[i] = y[nPoints] .* (x[i]-x[1]) / (x[nPoints]-x[1]); // ERROR - .* }