1// RUN: %clang_cc1 -ast-dump %s | FileCheck %s
2
3template<class T>
4class P {
5 public:
6  P(T* t) {}
7};
8
9namespace foo {
10class A { public: A() {} };
11enum B {};
12typedef int C;
13}
14
15// CHECK: VarDecl {{0x[0-9a-fA-F]+}} <line:16:1, col:36> col:15 ImplicitConstrArray 'foo::A [2]'
16static foo::A ImplicitConstrArray[2];
17
18int main() {
19  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::A *'
20  P<foo::A> p14 = new foo::A;
21  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::B *'
22  P<foo::B> p24 = new foo::B;
23  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::C *'
24  P<foo::C> pr4 = new foo::C;
25}
26
27foo::A getName() {
28  // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} <col:10, col:17> 'foo::A'
29  return foo::A();
30}
31
32void destruct(foo::A *a1, foo::A *a2, P<int> *p1) {
33  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:8> '<bound member function type>' ->~A
34  a1->~A();
35  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:16> '<bound member function type>' ->~A
36  a2->foo::A::~A();
37  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:13> '<bound member function type>' ->~P
38  p1->~P<int>();
39}
40