1253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber// RUN: %clang_cc1 -ast-dump %s | FileCheck %s
2253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber
3253e80b019727451edb4cbcad71277fcbe05ff0eNico Webertemplate<class T>
4253e80b019727451edb4cbcad71277fcbe05ff0eNico Weberclass P {
5253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber public:
6253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber  P(T* t) {}
7253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber};
8253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber
9253e80b019727451edb4cbcad71277fcbe05ff0eNico Webernamespace foo {
103a344f9fc7a62ad0a8d26b2a1ccf5e4989720d0cNico Weberclass A { public: A() {} };
11253e80b019727451edb4cbcad71277fcbe05ff0eNico Weberenum B {};
12253e80b019727451edb4cbcad71277fcbe05ff0eNico Webertypedef int C;
13253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber}
14253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// CHECK: VarDecl {{0x[0-9a-fA-F]+}} <line:16:1, col:36> col:15 ImplicitConstrArray 'foo::A [2]'
163a344f9fc7a62ad0a8d26b2a1ccf5e4989720d0cNico Weberstatic foo::A ImplicitConstrArray[2];
173a344f9fc7a62ad0a8d26b2a1ccf5e4989720d0cNico Weber
18253e80b019727451edb4cbcad71277fcbe05ff0eNico Weberint main() {
190daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::A *'
20253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber  P<foo::A> p14 = new foo::A;
210daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::B *'
22253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber  P<foo::B> p24 = new foo::B;
23253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber  // CHECK: CXXNewExpr {{0x[0-9a-fA-F]+}} <col:19, col:28> 'foo::C *'
24253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber  P<foo::C> pr4 = new foo::C;
25253e80b019727451edb4cbcad71277fcbe05ff0eNico Weber}
2676f11c953adb0df7ed4c7776538a592435cd7463Nico Weber
2776f11c953adb0df7ed4c7776538a592435cd7463Nico Weberfoo::A getName() {
280daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  // CHECK: CXXConstructExpr {{0x[0-9a-fA-F]+}} <col:10, col:17> 'foo::A'
2976f11c953adb0df7ed4c7776538a592435cd7463Nico Weber  return foo::A();
3076f11c953adb0df7ed4c7776538a592435cd7463Nico Weber}
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid destruct(foo::A *a1, foo::A *a2, P<int> *p1) {
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:8> '<bound member function type>' ->~A
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a1->~A();
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:16> '<bound member function type>' ->~A
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a2->foo::A::~A();
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: MemberExpr {{0x[0-9a-fA-F]+}} <col:3, col:13> '<bound member function type>' ->~P
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  p1->~P<int>();
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
40