// { dg-do run { target { ! default_packed } } }
// { dg-options "-w" }

// Copyright (C) 2003 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 15 Jul 2003 <nathan@codesourcery.com>

// Packed fields are unsuitable for direct reference binding.

struct Unpacked { int i; };

int ConstRef (int const &p, int const *ptr, int v)
{
  if (p != v)
    return 1;
  if (&p == ptr)
    return 2;
  return 0;
}

int ConstRef (Unpacked const &p, Unpacked const *ptr, int v)
{
  if (p.i != v)
    return 1;
  if (&p == ptr)
    return 2;
  return 0;
}

int Val (int p, int v)
{
  if (p != v)
    return 1;
  return 0;
}
int Val (Unpacked p, int v)
{
  if (p.i != v)
    return 1;
  return 0;
}

struct  __attribute__ ((packed)) Packed
{
  char c;
  int i;
  Unpacked u;
  char t;
};

int Foo (Packed &p, int i, int ui)
{
  int r;
  
  if ((r = Val (p.i, i)))
    return r;
  if ((r = Val (p.u.i, ui)))
    return r + 2;
  if ((r = Val (p.u, ui)))
    return r + 4;
  
  if ((r = ConstRef (p.i, &p.i, i)))
    return r + 6;

  return 0;
}

int main ()
{
  Packed p;

  p.c = 0x12;
  p.i = 0x3456789a;
  p.u.i = 0xbcdef00f;
  p.t = 0xed;

  return Foo (p, 0x3456789a, 0xbcdef00f);
}
