[gnu.g++.bug] 1.35.0/386 bug fix

jjc@UUNET.UU.NET (James Clark) (09/13/89)

g++ 1.35.0 configured for i386g generates incorrect code for the
following:

struct units {
  int n;
  units(int i);
};

void foo(units);

struct A {
  units u;
  A(int);
  units get();
};

main()
{
  A *p = new A(120);
  foo(p->get());
}

units::units(int i) : n(i)
{
}

units A::get()
{
  return u;
}

A::A(int i) : u(i)
{
}

void foo(units u)
{
  printf("%d\n", u.n);
}

The assembly for main.c (without -O) is

_main:
        pushl %ebp
        movl %esp,%ebp
        subl $4,%esp
        pushl %ebx
        pushl $120
        pushl $0
        call _A_PSA_SI
        movl %eax,-4(%ebp)
        subl $0,%esp
        movl %esp,%eax
        movl -4(%ebp),%ebx
        pushl %ebx
        pushl %eax
        call _get_PSA
        leal 4(%esp),%esp  <** should be leal 8(%esp),%esp
        call _foo
        leal 8(%esp),%esp
L1:
        leal -8(%ebp),%esp
        popl %ebx
        leave
        ret

The fix is to incorporate the following change made in gcc 1.35:

*** expr.c.distrib      Tue Sep 12 19:01:01 1989
--- expr.c      Tue Sep 12 19:01:13 1989
***************
*** 4122,4128 ****
        INIT_CUMULATIVE_ARGS (args_so_far, funtype);
        tem = FUNCTION_ARG (args_so_far, Pmode,
                          build_pointer_type (TREE_TYPE (funtype)), 1);
!       if (tem != 0 && GET_CODE (tem) == MEM)
        {
          actparms = tree_cons (error_mark_node,
                                build (SAVE_EXPR,
--- 4122,4128 ----
        INIT_CUMULATIVE_ARGS (args_so_far, funtype);
        tem = FUNCTION_ARG (args_so_far, Pmode,
                          build_pointer_type (TREE_TYPE (funtype)), 1);
!       if (tem == 0)
        {
          actparms = tree_cons (error_mark_node,
                                build (SAVE_EXPR,

James Clark
jjc@jclark.uucp