| // RUN: %clang_cc1 -fcxx-exceptions -ast-dump -ast-dump-filter Test %s | FileCheck -strict-whitespace %s |
| |
| namespace n { |
| void function() {} |
| int Variable; |
| } |
| using n::function; |
| using n::Variable; |
| void TestFunction() { |
| void (*f)() = &function; |
| // CHECK: DeclRefExpr{{.*}} (UsingShadow{{.*}}function |
| Variable = 4; |
| // CHECK: DeclRefExpr{{.*}} (UsingShadow{{.*}}Variable |
| } |
| |
| // CHECK: FunctionDecl {{.*}} TestCatch1 |
| void TestCatch1() { |
| // CHECK: CXXTryStmt |
| // CHECK-NEXT: CompoundStmt |
| try { |
| } |
| // CHECK-NEXT: CXXCatchStmt |
| // CHECK-NEXT: VarDecl {{.*}} x |
| // CHECK-NEXT: CompoundStmt |
| catch (int x) { |
| } |
| } |
| |
| // CHECK: FunctionDecl {{.*}} TestCatch2 |
| void TestCatch2() { |
| // CHECK: CXXTryStmt |
| // CHECK-NEXT: CompoundStmt |
| try { |
| } |
| // CHECK-NEXT: CXXCatchStmt |
| // CHECK-NEXT: NULL |
| // CHECK-NEXT: CompoundStmt |
| catch (...) { |
| } |
| } |
| |
| void TestAllocationExprs() { |
| int *p; |
| p = new int; |
| delete p; |
| p = new int[2]; |
| delete[] p; |
| p = ::new int; |
| ::delete p; |
| } |
| // CHECK: FunctionDecl {{.*}} TestAllocationExprs |
| // CHECK: CXXNewExpr {{.*}} 'int *' Function {{.*}} 'operator new' |
| // CHECK: CXXDeleteExpr {{.*}} 'void' Function {{.*}} 'operator delete' |
| // CHECK: CXXNewExpr {{.*}} 'int *' array Function {{.*}} 'operator new[]' |
| // CHECK: CXXDeleteExpr {{.*}} 'void' array Function {{.*}} 'operator delete[]' |
| // CHECK: CXXNewExpr {{.*}} 'int *' global Function {{.*}} 'operator new' |
| // CHECK: CXXDeleteExpr {{.*}} 'void' global Function {{.*}} 'operator delete' |
| |
| // Don't crash on dependent exprs that haven't been resolved yet. |
| template <typename T> |
| void TestDependentAllocationExpr() { |
| T *p = new T; |
| delete p; |
| } |
| // CHECK: FunctionTemplateDecl {{.*}} TestDependentAllocationExpr |
| // CHECK: CXXNewExpr {{.*'T \*'$}} |
| // CHECK: CXXDeleteExpr {{.*'void'$}} |
| |
| template <typename T> |
| class DependentScopeMemberExprWrapper { |
| T member; |
| }; |
| |
| template <typename T> |
| void TestDependentScopeMemberExpr() { |
| DependentScopeMemberExprWrapper<T> obj; |
| obj.member = T(); |
| (&obj)->member = T(); |
| } |
| |
| // CHECK: FunctionTemplateDecl {{.*}} TestDependentScopeMemberExpr |
| // CHECK: CXXDependentScopeMemberExpr {{.*}} lvalue .member |
| // CHECK: CXXDependentScopeMemberExpr {{.*}} lvalue ->member |