// { dg-do compile }
// { dg-options "-fdollars-in-identifiers" }
// Origin: Giovanni Bajo <giovannibajo at libero dot it>
// Make sure that Java special functions can be called correctly.

extern "Java"
{
  typedef __java_int jint;
  namespace java
  {
    namespace lang
    {
      class Class;
      class Object;
      class Throwable {};
      class Foo;
    }
  }
}

typedef struct java::lang::Object* jobject;
typedef struct java::lang::Throwable* jthrowable;
typedef class java::lang::Class* jclass;
using java::lang::Foo;

class Foo : public java::lang::Throwable
{
public:
  static ::java::lang::Class class$;
};


/*
 * Step 1: no declarations. A declaration for _Jv_Throw is created.
 */

void Bar1(void)
{
  Foo* f = new java::lang::Foo;   // { dg-error "call to Java constructor" }
  throw (f);
}


/*
 * Step 2: constructor declaration
 */

extern "C" jobject _Jv_AllocObject (jclass, jint) __attribute__((__malloc__));

void Bar2(void)
{
  Foo* f = new java::lang::Foo; 
  throw (f);  
}


/*
 * Step 3: overloads
 */

jobject _Jv_AllocObject (jclass, jint, float) __attribute__((__malloc__));
void _Jv_Throw (int, float) __attribute__ ((__noreturn__));

void Bar3(void)
{
  Foo* f = new java::lang::Foo;	  // { dg-error "should never be overloaded" }
  throw (f);			  // { dg-error "should never be overloaded" }
}
