#ifndef __Intro_ah__
#define __Intro_ah__

#include <stdio.h>

class Foo;

aspect Intro {
  pointcut dest () = "C"||"D"||"E"||"F";
public:
  static const int val = 2;
  advice dest () : unsigned long int I1;
  advice dest () : signed short (I2);
  advice dest () : int Foo::*(*I3);
  advice dest () : double Foo::*(* const (*I4(int,long))[47 + 11]);
  advice dest () : void I5(Intro::Int*),(*I6);
  advice dest () : static float pi;
  advice dest () && !"E": struct S1 {
    S1 ();
    ~S1 ();
    void f ();
  } IS1;
  advice dest () : struct { struct Y {}; } IS2, *IS3;
  typedef int Int;
  advice dest () : Intro () {}
  advice dest () : Intro (Intro::Int);
  advice dest () && !"E" : ~Intro ();
  advice dest () : const Intro::Int square (Intro::Int);
  advice dest () : void *operator new (size_t), *pp;
  advice dest () : void g();
  advice dest () : static const int v = (8 + 15 ) * sizeof(int) / Intro::val;
};

advice Intro::dest () : void Intro::g() { printf ("introduced ...::g()\n"); }
advice Intro::dest () : float Intro::pi = 3.14f;
advice Intro::dest () : Intro::Intro (Intro::Int) : I3 (0) {
  printf ("introduced constructor\n");
}
advice Intro::dest () && !"E" : Intro::~Intro () {
  square (Intro::val);
  printf ("introduced destructor\n"); 
}
advice Intro::dest () : const Intro::Int Intro::square (Intro::Int arg) {
  printf ("introduced ...::square(Intro::Int)\n");
  return arg * arg;
}

advice Intro::dest () && !"E" : void Intro::S1::f () {
}

advice Intro::dest () && !"E" : Intro::S1::S1 () {
}

advice Intro::dest () && !"E" : Intro::S1::~S1 () {
}

#endif // __Intro_ah__
