typeck.c (strip_all_pointer_quals): Also strip quals from pointer-to-member types.
authorJason Merrill <jason@redhat.com>
Tue, 2 Jan 2001 15:20:30 +0000 (10:20 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 2 Jan 2001 15:20:30 +0000 (10:20 -0500)
        * typeck.c (strip_all_pointer_quals): Also strip quals from
        pointer-to-member types.

        * Make-lang.in (cp/TAGS): Use --no-globals.  Ignore parse.c, and treat
        parse.y as C.

        * call.c (build_new_method_call): Do evaluate the object parameter
        when accessing a static member.
        * typeck.c (build_component_ref): Likewise.

From-SVN: r38619

gcc/cp/ChangeLog
gcc/cp/Make-lang.in
gcc/cp/call.c
gcc/cp/typeck.c
gcc/testsuite/g++.old-deja/g++.martin/eval1.C
gcc/testsuite/g++.old-deja/g++.other/cast7.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.other/static16.C [new file with mode: 0644]

index a3bf42d..43ca3b4 100644 (file)
@@ -1,3 +1,15 @@
+2001-01-02  Jason Merrill  <jason@redhat.com>
+
+       * typeck.c (strip_all_pointer_quals): Also strip quals from 
+       pointer-to-member types.
+
+       * Make-lang.in (cp/TAGS): Use --no-globals.  Ignore parse.c, and treat
+       parse.y as C.
+
+       * call.c (build_new_method_call): Do evaluate the object parameter
+       when accessing a static member.
+       * typeck.c (build_component_ref): Likewise.
+
 2001-01-02  Andreas Jaeger  <aj@suse.de>
 
        * decl.c (cp_missing_noreturn_ok_p): New.
@@ -32,6 +44,9 @@
 
 2000-12-22  Jason Merrill  <jason@redhat.com>
 
+       * pt.c (more_specialized): Don't optimize len==0.
+       (fn_type_unification): If we're adding the return type, increase len.
+
        * typeck.c (build_binary_op): Fix pmf comparison logic.
 
        * call.c (joust): Use DECL_NONSTATIC_MEMBER_FUNCTION_P, not
index 0c1347a..ba03731 100644 (file)
@@ -279,9 +279,7 @@ cp/parse.o: cp/parse.c $(CXX_TREE_H) flags.h cp/lex.h except.h output.h \
 # Update the tags table.
 cp/TAGS: force
        cd $(srcdir)/cp ;                       \
-       etags *.c *.h ;                         \
-       echo 'l' | tr 'l' '\f' >> TAGS ;        \
-       echo 'parse.y,0' >> TAGS ;              \
-       etags -a ../*.h ../*.c;
+       etags --no-globals -l c `echo *.c | sed 's/parse.c//'` \
+         parse.y *.h ../*.c ../*.h;
 
 .PHONY: cp/TAGS
index c8aed73..3c1f9aa 100644 (file)
@@ -4278,6 +4278,7 @@ build_new_method_call (instance, name, args, basetype_path, flags)
   tree pretty_name;
   tree user_args;
   tree templates = NULL_TREE;
+  tree call;
   int template_only = 0;
 
   if (TREE_CODE (name) == TEMPLATE_ID_EXPR)
@@ -4492,10 +4493,18 @@ build_new_method_call (instance, name, args, basetype_path, flags)
          || resolves_to_fixed_type_p (instance, 0)))
     flags |= LOOKUP_NONVIRTUAL;
 
-  return build_over_call
-    (cand,
-     TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE ? mem_args : args,
-     flags);
+  if (TREE_CODE (TREE_TYPE (cand->fn)) == METHOD_TYPE)
+    call = build_over_call (cand, mem_args, flags);
+  else
+    {
+      call = build_over_call (cand, args, flags);
+      /* Do evaluate the object parameter in a call to a static member
+        function.  */
+      if (TREE_SIDE_EFFECTS (instance))
+       call = build (COMPOUND_EXPR, TREE_TYPE (call), instance, call);
+    }
+
+  return call;
 }
 
 /* Returns non-zero iff standard conversion sequence ICS1 is a proper
index 23efc90..443fb2d 100644 (file)
@@ -2208,6 +2208,11 @@ build_component_ref (datum, component, basetype_path, protect)
            mark_used (field);
          else
            TREE_USED (field) = 1;
+
+         /* Do evaluate the object when accessing a static member.  */
+         if (TREE_SIDE_EFFECTS (datum))
+           field = build (COMPOUND_EXPR, TREE_TYPE (field), datum, field);
+
          return field;
        }
     }
@@ -7131,6 +7136,9 @@ strip_all_pointer_quals (type)
 {
   if (TREE_CODE (type) == POINTER_TYPE)
     return build_pointer_type (strip_all_pointer_quals (TREE_TYPE (type)));
+  else if (TREE_CODE (type) == OFFSET_TYPE)
+    return build_offset_type (TYPE_OFFSET_BASETYPE (type),
+                             strip_all_pointer_quals (TREE_TYPE (type)));
   else
     return TYPE_MAIN_VARIANT (type);
 }
index e8a19f6..6488da5 100644 (file)
@@ -1,5 +1,4 @@
 // Postfix expression must be evaluated even if accessing a static member.
-// execution test - XFAIL *-*-*
 
 struct S
 {
diff --git a/gcc/testsuite/g++.old-deja/g++.other/cast7.C b/gcc/testsuite/g++.old-deja/g++.other/cast7.C
new file mode 100644 (file)
index 0000000..8cdaa99
--- /dev/null
@@ -0,0 +1,11 @@
+// Test that we can add cv-quals in a static cast to a pointer-to-base type.
+
+struct A { int i; };
+struct B : public A {};
+
+int main()
+{
+  int B::* bp = &B::i;
+  const int A::* ap = static_cast<const int A::*>(bp);
+  return ap != bp;
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.other/static16.C b/gcc/testsuite/g++.old-deja/g++.other/static16.C
new file mode 100644 (file)
index 0000000..0fbaea8
--- /dev/null
@@ -0,0 +1,24 @@
+// Test that we properly evaluate the object parameter when accessing static
+// members.
+
+struct A {
+  static void f () {}
+  static int i;
+};
+
+int A::i;
+
+int c = 0;
+
+A g ()
+{
+  ++c;
+  return A();
+}
+
+int main ()
+{
+  g().f();
+  g().i = 42;
+  return (c != 2);
+}