* typeck2.c (build_m_component_ref): Robustify.
authorMark Mitchell <mark@codesourcery.com>
Fri, 16 Feb 2001 01:24:14 +0000 (01:24 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Fri, 16 Feb 2001 01:24:14 +0000 (01:24 +0000)
From-SVN: r39731

gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/testsuite/g++.old-deja/g++.other/ptrmem6.C

index e8119eac4a7797220a199a59a827756a9200fd3d..a65b21edc23656c015eee013789e4b138fda2b5c 100644 (file)
@@ -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
index 1538944ab5cecdcf9815fffaaaee22368e37d876..3c26b1b8ddad7eddf4288bb65b37777ad0b172cc 100644 (file)
@@ -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;
     }
 
index 3e9db8daec968896c93c0153325549ffe20bf586..7e9ab4e701c72d7ab24526623782b76833853ca5 100644 (file)
@@ -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 - .*
 }