1// Test without serialization:
2// RUN: %clang_cc1 -Wno-unused -fobjc-arc -fblocks -fobjc-exceptions -ast-dump -ast-dump-filter Test %s \
3// RUN: | FileCheck -strict-whitespace %s
4//
5// Test with serialization:
6// RUN: %clang_cc1 -Wno-unused -fobjc-arc -fblocks -fobjc-exceptions -emit-pch -o %t %s
7// RUN: %clang_cc1 -x objective-c -Wno-unused -fobjc-arc -fblocks -fobjc-exceptions -include-pch %t \
8// RUN: -ast-dump-all -ast-dump-filter Test /dev/null \
9// RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \
10// RUN: | FileCheck -strict-whitespace %s
11
12void TestBlockExpr(int x) {
13  ^{ x; };
14}
15// CHECK:      FunctionDecl{{.*}}TestBlockExpr
16// CHECK:      BlockExpr{{.*}} 'void (^)(void)'
17// CHECK-NEXT:   BlockDecl
18
19void TestExprWithCleanup(int x) {
20  ^{ x; };
21}
22// CHECK:      FunctionDecl{{.*}}TestExprWithCleanup
23// CHECK:      ExprWithCleanups
24// CHECK-NEXT:   cleanup Block
25// CHECK-NEXT:   BlockExpr
26
27@interface A
28@end
29
30void TestObjCAtCatchStmt() {
31  @try {
32  } @catch(A *a) {
33  } @catch(...) {
34  } @finally {
35  }
36}
37// CHECK:      FunctionDecl{{.*}}TestObjCAtCatchStmt
38// CHECK:      ObjCAtTryStmt
39// CHECK-NEXT:   CompoundStmt
40// CHECK-NEXT:   ObjCAtCatchStmt{{.*}}
41// CHECK-NEXT:     VarDecl{{.*}}a
42// CHECK-NEXT:     CompoundStmt
43// CHECK-NEXT:   ObjCAtCatchStmt{{.*}} catch all
44// CHECK-NEXT:     CompoundStmt
45// CHECK-NEXT:   ObjCAtFinallyStmt
46
47typedef struct {
48  id f;
49} S;
50
51id TestCompoundLiteral(id a) {
52  return ((S){ .f = a }).f;
53}
54
55// CHECK:     FunctionDecl{{.*}}TestCompoundLiteral
56// CHECK:       ExprWithCleanups
57// CHECK-NEXT:    cleanup CompoundLiteralExpr
58// CHECK:           CompoundLiteralExpr{{.*}}'S':'S' lvalue
59