// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s

//CHECK: TC<int>
//CHECK: DW_TAG_template_type_parameter

template<typename T>
class TC {
public:
  TC(const TC &) {}
  TC() {}
};

TC<int> tci;

//CHECK: TU<2>
//CHECK: DW_TAG_template_value_parameter
template<unsigned >
class TU {
  int b;
};

TU<2> u2;

// PR9600
template<typename T> class vector {};
class Foo;
typedef vector<Foo*> FooVector[3];
struct Test {
  virtual void foo(FooVector *);
};
static Test test;

// PR9608
template <int i> struct TheTemplate {
  struct Empty2 {};
  typedef const Empty2 DependentType[i];
  TheTemplate() {}
};

class TheTemplateTest : public TheTemplate<42> {
  TheTemplateTest();
  void method(const TheTemplate<42>::DependentType *) {}
};

TheTemplateTest::TheTemplateTest() : TheTemplate<42>() {}

