diff options
author | Mark Mitchell <mark@codesourcery.com> | 2001-02-16 01:24:14 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2001-02-16 01:24:14 +0000 |
commit | f1a3f197e1f19c0b439d84d2e3ce11ab21c507a0 (patch) | |
tree | 50359c225572ab1cbda6230552673833ccda35b0 /gcc | |
parent | e2c094827c86cb0cbf71ba3b16b09541e61502c2 (diff) | |
download | gcc-f1a3f197e1f19c0b439d84d2e3ce11ab21c507a0.zip gcc-f1a3f197e1f19c0b439d84d2e3ce11ab21c507a0.tar.gz gcc-f1a3f197e1f19c0b439d84d2e3ce11ab21c507a0.tar.bz2 |
* typeck2.c (build_m_component_ref): Robustify.
From-SVN: r39731
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 15 | ||||
-rw-r--r-- | 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 e8119ea..a65b21e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,7 @@ +2001-02-15 Mark Mitchell <mark@codesourcery.com> + + * typeck2.c (build_m_component_ref): Robustify. + 2001-02-15 Alexandre Oliva <aoliva@redhat.com> * friend.c (do_friend): Don't take the nested [template] class diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 1538944..3c26b1b 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 3e9db8d..7e9ab4e 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 <eford@princeton.edu> 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 - .* } |