// { dg-do assemble  }
// { dg-options "-Wall -Weffc++" }

//1 g++/12952 un-named variables in a catch block
//Wall or Wunused should not give warnings here
template <class T>
void f (void) { 
   try
    {
    }
 
   catch( int)
    {    
    }
}

//
//2 g++/12923 __attribute__((__unused__)) not working for objects
//Weffc++ or Wunused should not report the object as an error
class C {
  public:
  C();
};

void f (void){
  C x __attribute__ ((__unused__));
  int y __attribute__ ((__unused__));
}

//
//3 g++/12982 lock should not give error here, as above
void setLock ();
void clearLock ();

template <class T>
class test {
public:
   class lock
   {
   public:
     lock () { setLock(); }
     ~lock () { clearLock(); }
   };

  static void f (void)
  {
   lock local  __attribute__ ((__unused__));
  } 

};


//
//4 g++/12988 neither Mutex nor AutoMutex varibles should give warnings here
//compile with -Weffc++ or -Wunused depending on post or pre 97r1
class Mutex {
private:
  long counter;
public:
  virtual long retcntr() {return counter;};
  Mutex(int i = 0): counter(i) {};
  virtual ~Mutex() {};
} __attribute__ ((__unused__));

class AutoMutex: public Mutex{
private:
  long counter2;
public:
  long retcntr() {return counter2;};
  AutoMutex(int i = 0): counter2(i) {};
  virtual ~AutoMutex() {};
} __attribute__ ((__unused__));


template <class T>
int foofunc(T x){
  Mutex sm(2);
  AutoMutex m(&sm);
  return 0;
}


//5 sanity check to make sure other attributes cannot be used
class Mutex2 {
private:
  long counter;
public:
  virtual long retcntr() {return counter;};
  Mutex2(int i = 0): counter(i) {};
  virtual ~Mutex2() {};
} __attribute__ ((warn));  // { dg-warning "" } 







