1 // RUN: %clang_cc1 -fcxx-exceptions -ast-dump -ast-dump-filter Test %s | FileCheck -strict-whitespace %s
2 
3 namespace n {
4 void function() {}
5 int Variable;
6 }
7 using n::function;
8 using n::Variable;
9 void TestFunction() {
10   void (*f)() = &function;
11 // CHECK:       DeclRefExpr{{.*}} (UsingShadow{{.*}}function
12   Variable = 4;
13 // CHECK:       DeclRefExpr{{.*}} (UsingShadow{{.*}}Variable
14 }
15 
16 // CHECK: FunctionDecl {{.*}} TestCatch1
17 void TestCatch1() {
18 // CHECK:       CXXTryStmt
19 // CHECK-NEXT:    CompoundStmt
20   try {
21   }
22 // CHECK-NEXT:    CXXCatchStmt
23 // CHECK-NEXT:      VarDecl {{.*}} x
24 // CHECK-NEXT:      CompoundStmt
25   catch (int x) {
26   }
27 }
28 
29 // CHECK: FunctionDecl {{.*}} TestCatch2
30 void TestCatch2() {
31 // CHECK:       CXXTryStmt
32 // CHECK-NEXT:    CompoundStmt
33   try {
34   }
35 // CHECK-NEXT:    CXXCatchStmt
36 // CHECK-NEXT:      NULL
37 // CHECK-NEXT:      CompoundStmt
38   catch (...) {
39   }
40 }
41 
42 void TestAllocationExprs() {
43   int *p;
44   p = new int;
45   delete p;
46   p = new int[2];
47   delete[] p;
48   p = ::new int;
49   ::delete p;
50 }
51 // CHECK: FunctionDecl {{.*}} TestAllocationExprs
52 // CHECK: CXXNewExpr {{.*}} 'int *' Function {{.*}} 'operator new'
53 // CHECK: CXXDeleteExpr {{.*}} 'void' Function {{.*}} 'operator delete'
54 // CHECK: CXXNewExpr {{.*}} 'int *' array Function {{.*}} 'operator new[]'
55 // CHECK: CXXDeleteExpr {{.*}} 'void' array Function {{.*}} 'operator delete[]'
56 // CHECK: CXXNewExpr {{.*}} 'int *' global Function {{.*}} 'operator new'
57 // CHECK: CXXDeleteExpr {{.*}} 'void' global Function {{.*}} 'operator delete'
58 
59 // Don't crash on dependent exprs that haven't been resolved yet.
60 template <typename T>
61 void TestDependentAllocationExpr() {
62   T *p = new T;
63   delete p;
64 }
65 // CHECK: FunctionTemplateDecl {{.*}} TestDependentAllocationExpr
66 // CHECK: CXXNewExpr {{.*'T \*'$}}
67 // CHECK: CXXDeleteExpr {{.*'void'$}}
68