// { dg-do assemble  }
// GROUPS passed conversions
class GttObject {};
class GctObject: virtual public GttObject {};
class NDAMObject: virtual public GttObject, virtual public GctObject {};
class GctHashObject: virtual public GctObject {};

class GctRef: virtual public GctHashObject
{ public: operator void*() const; };

class NDAMAssemblerObject: virtual public NDAMObject {};
class GctReferenceObject: virtual public GctHashObject {};
class NDAMValue: virtual public NDAMAssemblerObject, public GctReferenceObject {};

class nnyacc;
class NDAMValueRef : virtual public NDAMObject, public GctRef 
{
  NDAMValue *operator->() const;	 
  operator NDAMValue *() const;	 
friend class nnyacc;
};

typedef void* Pix;
class NDAMValueRefSLList
{
public:
  NDAMValueRefSLList();
  NDAMValueRefSLList(const NDAMValueRefSLList& a);
  ~NDAMValueRefSLList();
  NDAMValueRef& operator () (Pix p) const;
};

struct bar
{
  NDAMValueRefSLList *valueList;
};

class nnyacc
{
public:
      static void assign(void*& lval, void*& rval); // { dg-message "nnyacc::assign|no known conversion" }
};

void
foo (bar yylval, bar *yyvsp)
{
  nnyacc::assign(yylval.valueList, yyvsp[0].valueList);// { dg-error "no matching|rvalue" }
}
