@import templates_top;

template<typename T> class Vector { 
public:
  void push_back(const T&);
};

template<typename T> class List;
template<> class List<bool> {
public:
  void push_back(int);
};

namespace N {
  template<typename T> class Set {
  public:
    void insert(T);
  };
}

constexpr unsigned List<int>::*size_right = &List<int>::size;
List<int> list_right = { 0, 12 };
typedef List<int> ListInt_right;

template <typename T>
void pendingInstantiationEmit(T) {}
void triggerPendingInstantiationToo() {
  pendingInstantiationEmit(12);
}

void redeclDefinitionEmit(){}

typedef Outer<int>::Inner OuterIntInner_right;

int defineListDoubleRight() {
  List<double> ld;
  ld.push_back(0.0);
  return ld.size;
}

inline void defineListLongRight() {
  List<long> ll;
}

template<typename T> struct MergePatternDecl;

void outOfLineInlineUseRightF(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::f);
void outOfLineInlineUseRightG(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::g);
void outOfLineInlineUseRightH(void (OutOfLineInline<int>::*)() = &OutOfLineInline<int>::h);

inline int *getStaticDataMemberRight() {
  return WithUndefinedStaticDataMember<int[]>::undefined;
}

inline WithAttributes<int> make_with_attributes_right() { return WithAttributes<int>(); }
