/* This testcase is part of GDB, the GNU debugger.
   Copyright 2017-2019 Free Software Foundation, Inc.
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see .  */
#include 
/* Code for operator() tests.  */
struct test_unique_op_call
{
  void operator() (int);
};
void
test_unique_op_call::operator() (int)
{}
struct test_op_call
{
  void operator() ();
  void operator() (int);
  void operator() (long);
  template
  void operator() (T *);
};
void
test_op_call::operator() (int)
{}
void
test_op_call::operator() ()
{}
void
test_op_call::operator() (long)
{}
template
void
test_op_call::operator() (T *t)
{
}
/* Code for operator[] tests.  */
struct test_unique_op_array
{
  void operator[] (int);
};
void
test_unique_op_array::operator[] (int)
{}
struct test_op_array
{
  void operator[] (int);
  void operator[] (long);
  template
  void operator[] (T *);
};
void
test_op_array::operator[] (int)
{}
void
test_op_array::operator[] (long)
{}
template
void
test_op_array::operator[] (T *t)
{}
/* Code for operator new tests.  */
struct test_op_new
{
  void *operator new (size_t);
};
void *
test_op_new::operator new (size_t)
{
  return NULL;
}
/* Code for operator delete tests.  */
struct test_op_delete
{
  void operator delete (void *);
};
void
test_op_delete::operator delete (void *)
{
}
/* Code for operator new[] tests.  */
struct test_op_new_array
{
  void *operator new[] (size_t);
};
void *
test_op_new_array::operator new[] (size_t)
{
  return NULL;
}
/* Code for operator delete[] tests.  */
struct test_op_delete_array
{
  void operator delete[] (void *);
};
void
test_op_delete_array::operator delete[] (void *)
{
}
/* Code for user-defined conversion tests.  */
struct test_op_conversion_res;
struct test_op_conversion
{
  operator const volatile test_op_conversion_res **() const volatile;
};
test_op_conversion::operator const volatile test_op_conversion_res **()
  const volatile
{
  return NULL;
}
/* Code for the assignment operator tests.  */
struct test_op_assign
{
  test_op_assign operator= (const test_op_assign &);
};
test_op_assign
test_op_assign::operator= (const test_op_assign &)
{
  return test_op_assign ();
}
/* Code for the arrow operator tests.  */
struct test_op_arrow
{
  test_op_arrow operator-> ();
};
test_op_arrow
test_op_arrow::operator-> ()
{
  return test_op_arrow ();
}
/* Code for the logical/arithmetic operators tests.  */
struct E
{
};
#define GEN_OP(NS, ...)				\
  namespace test_ops {				\
    void operator __VA_ARGS__ {}		\
  }						\
  namespace test_op_ ## NS {			\
    void operator __VA_ARGS__ {}		\
  }
GEN_OP (PLUS_A,    +=  (E, E)  )
GEN_OP (PLUS,      +   (E, E)  )
GEN_OP (MINUS_A,   -=  (E, E)  )
GEN_OP (MINUS,     -   (E, E)  )
GEN_OP (MOD_A,     %=  (E, E)  )
GEN_OP (MOD,       %   (E, E)  )
GEN_OP (EQ,        ==  (E, E)  )
GEN_OP (NEQ,       !=  (E, E)  )
GEN_OP (LAND,      &&  (E, E)  )
GEN_OP (LOR,       ||  (E, E)  )
GEN_OP (SL_A,      <<= (E, E)  )
GEN_OP (SR_A,      >>= (E, E)  )
GEN_OP (SL,        <<  (E, E)  )
GEN_OP (SR,        >>  (E, E)  )
GEN_OP (OE,        |=  (E, E)  )
GEN_OP (BIT_O,     |   (E, E)  )
GEN_OP (XOR_A,     ^=  (E, E)  )
GEN_OP (XOR,       ^   (E, E)  )
GEN_OP (BIT_AND_A, &=  (E, E)  )
GEN_OP (BIT_AND,   &   (E, E)  )
GEN_OP (LT,        <   (E, E)  )
GEN_OP (LTE,       <=  (E, E)  )
GEN_OP (GTE,       >=  (E, E)  )
GEN_OP (GT,        >   (E, E)  )
GEN_OP (MUL_A,     *=  (E, E)  )
GEN_OP (MUL,       *   (E, E)  )
GEN_OP (DIV_A,     /=  (E, E)  )
GEN_OP (DIV,       /   (E, E)  )
GEN_OP (NEG,       ~   (E)      )
GEN_OP (NOT,       !   (E)      )
GEN_OP (PRE_INC,   ++  (E)      )
GEN_OP (POST_INC,  ++  (E, int) )
GEN_OP (PRE_DEC,   --  (E)      )
GEN_OP (POST_DEC,  --  (E, int) )
GEN_OP (COMMA,     ,   (E, E)  )
int
main ()
{
  test_op_call opcall;
  opcall ();
  opcall (1);
  opcall (1l);
  opcall ((int *) 0);
  test_unique_op_call opcall2;
  opcall2 (1);
  test_op_array op_array;
  op_array[1];
  op_array[1l];
  op_array[(int *) 0];
  test_unique_op_array unique_op_array;
  unique_op_array[1];
  return 0;
}