aboutsummaryrefslogtreecommitdiff
path: root/test/Import
diff options
context:
space:
mode:
Diffstat (limited to 'test/Import')
-rw-r--r--test/Import/array-init-loop-expr/Inputs/S.cpp8
-rw-r--r--test/Import/array-init-loop-expr/test.cpp10
-rw-r--r--test/Import/call-expr/Inputs/F.cpp10
-rw-r--r--test/Import/call-expr/test.cpp8
-rw-r--r--test/Import/compound-assign-op/Inputs/F.cpp18
-rw-r--r--test/Import/compound-assign-op/test.cpp45
-rw-r--r--test/Import/conversion-decl/Inputs/F.cpp10
-rw-r--r--test/Import/conversion-decl/test.cpp5
-rw-r--r--test/Import/cxx-casts/Inputs/F.cpp12
-rw-r--r--test/Import/cxx-casts/test.cpp21
-rw-r--r--test/Import/cxx-default-init-expr/Inputs/S.cpp9
-rw-r--r--test/Import/cxx-default-init-expr/test.cpp22
-rw-r--r--test/Import/cxx-for-range/Inputs/F.cpp10
-rw-r--r--test/Import/cxx-for-range/test.cpp58
-rw-r--r--test/Import/cxx-member-pointers/Inputs/S.cpp7
-rw-r--r--test/Import/cxx-member-pointers/test.cpp16
-rw-r--r--test/Import/cxx-noexcept-expr/Inputs/F.cpp1
-rw-r--r--test/Import/cxx-noexcept-expr/test.cpp8
-rw-r--r--test/Import/cxx-scalar-value-init/Inputs/S.cpp2
-rw-r--r--test/Import/cxx-scalar-value-init/test.cpp11
-rw-r--r--test/Import/cxx-try-catch/Inputs/F.cpp18
-rw-r--r--test/Import/cxx-try-catch/test.cpp39
-rw-r--r--test/Import/do-stmt/Inputs/F.cpp7
-rw-r--r--test/Import/do-stmt/test.cpp15
-rw-r--r--test/Import/enum/Inputs/S.cpp2
-rw-r--r--test/Import/enum/test.cpp6
-rw-r--r--test/Import/expr-with-cleanups/Inputs/S.cpp8
-rw-r--r--test/Import/expr-with-cleanups/test.cpp8
-rw-r--r--test/Import/for-stmt/Inputs/F.cpp11
-rw-r--r--test/Import/for-stmt/test.cpp50
-rw-r--r--test/Import/if-stmt/Inputs/F.cpp21
-rw-r--r--test/Import/if-stmt/test.cpp36
-rw-r--r--test/Import/indirect-goto/Inputs/F.cpp6
-rw-r--r--test/Import/indirect-goto/test.cpp10
-rw-r--r--test/Import/objc-autoreleasepool/Inputs/F.m5
-rw-r--r--test/Import/objc-autoreleasepool/test.m9
-rw-r--r--test/Import/objc-param-decl/Inputs/S.m5
-rw-r--r--test/Import/objc-param-decl/test.m11
-rw-r--r--test/Import/objc-try-catch/Inputs/F.m28
-rw-r--r--test/Import/objc-try-catch/test.m43
-rw-r--r--test/Import/pack-expansion-expr/Inputs/F.cpp11
-rw-r--r--test/Import/pack-expansion-expr/test.cpp12
-rw-r--r--test/Import/switch-stmt/Inputs/F.cpp23
-rw-r--r--test/Import/switch-stmt/test.cpp57
-rw-r--r--test/Import/while-stmt/Inputs/F.cpp8
-rw-r--r--test/Import/while-stmt/test.cpp21
46 files changed, 760 insertions, 1 deletions
diff --git a/test/Import/array-init-loop-expr/Inputs/S.cpp b/test/Import/array-init-loop-expr/Inputs/S.cpp
new file mode 100644
index 000000000000..5ca3ad47b278
--- /dev/null
+++ b/test/Import/array-init-loop-expr/Inputs/S.cpp
@@ -0,0 +1,8 @@
+class S {
+ int a[10];
+};
+
+void f() {
+ S s;
+ S copy = s;
+}
diff --git a/test/Import/array-init-loop-expr/test.cpp b/test/Import/array-init-loop-expr/test.cpp
new file mode 100644
index 000000000000..7fe109c305dd
--- /dev/null
+++ b/test/Import/array-init-loop-expr/test.cpp
@@ -0,0 +1,10 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s | FileCheck %s
+// CHECK: CXXCtorInitializer
+// CHECK-NEXT: ArrayInitLoopExpr
+// CHECK-SAME: 'int [10]'
+
+// CHECK: ArrayInitIndexExpr
+
+void expr() {
+ f();
+}
diff --git a/test/Import/call-expr/Inputs/F.cpp b/test/Import/call-expr/Inputs/F.cpp
new file mode 100644
index 000000000000..bd88df99ba41
--- /dev/null
+++ b/test/Import/call-expr/Inputs/F.cpp
@@ -0,0 +1,10 @@
+namespace NS {
+struct X {};
+void f(X) {}
+void operator+(X, X) {}
+} // namespace NS
+void f() {
+ NS::X x;
+ f(x);
+ x + x;
+}
diff --git a/test/Import/call-expr/test.cpp b/test/Import/call-expr/test.cpp
new file mode 100644
index 000000000000..86c1b50c47d6
--- /dev/null
+++ b/test/Import/call-expr/test.cpp
@@ -0,0 +1,8 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+void expr() {
+ f();
+}
+
+// CHECK: FunctionDecl 0x{{[^ ]*}} <{{[^>]*}}> line:{{.*}}:{{[^ ]*}} used f 'void ()'
+// CHECK: -CallExpr 0x{{[^ ]*}} <{{[^>]*}}> 'void' adl
+// CHECK: -CXXOperatorCallExpr 0x{{[^ ]*}} <{{[^>]*}}> 'void' adl
diff --git a/test/Import/compound-assign-op/Inputs/F.cpp b/test/Import/compound-assign-op/Inputs/F.cpp
new file mode 100644
index 000000000000..f925ae5ef6ed
--- /dev/null
+++ b/test/Import/compound-assign-op/Inputs/F.cpp
@@ -0,0 +1,18 @@
+void f() {
+ unsigned iadd_eq = 0U;
+ iadd_eq += 1U;
+ unsigned isub_eq = 0U;
+ isub_eq -= 1U;
+ unsigned imul_eq = 0U;
+ imul_eq *= 1U;
+ unsigned idiv_eq = 0U;
+ idiv_eq /= 1U;
+ unsigned iand_eq = 0U;
+ iand_eq &= 1U;
+ unsigned ixor_eq = 0U;
+ ixor_eq ^= 1U;
+ unsigned ilsh_eq = 0U;
+ ilsh_eq <<= 1U;
+ unsigned irsh_eq = 0U;
+ irsh_eq >>= 1U;
+}
diff --git a/test/Import/compound-assign-op/test.cpp b/test/Import/compound-assign-op/test.cpp
new file mode 100644
index 000000000000..415358ddbf99
--- /dev/null
+++ b/test/Import/compound-assign-op/test.cpp
@@ -0,0 +1,45 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '+='
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '-='
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '*='
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '/='
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '&='
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '^='
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '<<='
+
+// CHECK: VarDecl
+// CHECK-NEXT: Integer
+// CHECK-NEXT: CompoundAssignOperator
+// CHECK-SAME: '>>='
+
+void expr() {
+ f();
+}
diff --git a/test/Import/conversion-decl/Inputs/F.cpp b/test/Import/conversion-decl/Inputs/F.cpp
new file mode 100644
index 000000000000..b1776b0b26a5
--- /dev/null
+++ b/test/Import/conversion-decl/Inputs/F.cpp
@@ -0,0 +1,10 @@
+class Y {
+ int M;
+};
+
+class X {
+ int N, M;
+
+public:
+ operator Y();
+};
diff --git a/test/Import/conversion-decl/test.cpp b/test/Import/conversion-decl/test.cpp
new file mode 100644
index 000000000000..dc9e6d85dd34
--- /dev/null
+++ b/test/Import/conversion-decl/test.cpp
@@ -0,0 +1,5 @@
+// RUN: clang-import-test -import %S/Inputs/F.cpp -expression %s
+void expr() {
+ X X1;
+ Y Y1 = X1;
+}
diff --git a/test/Import/cxx-casts/Inputs/F.cpp b/test/Import/cxx-casts/Inputs/F.cpp
new file mode 100644
index 000000000000..79326a7e4b28
--- /dev/null
+++ b/test/Import/cxx-casts/Inputs/F.cpp
@@ -0,0 +1,12 @@
+struct A {
+ virtual ~A() {}
+};
+struct B : public A {};
+
+void f() {
+ const A *b = new B();
+ const B *c1 = dynamic_cast<const B *>(b);
+ const B *c2 = static_cast<const B *>(b);
+ const B *c3 = reinterpret_cast<const B *>(b);
+ A *c4 = const_cast<A *>(b);
+}
diff --git a/test/Import/cxx-casts/test.cpp b/test/Import/cxx-casts/test.cpp
new file mode 100644
index 000000000000..49215ce81c7b
--- /dev/null
+++ b/test/Import/cxx-casts/test.cpp
@@ -0,0 +1,21 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: CXXDynamicCastExpr
+// CHECK-SAME: dynamic_cast
+// CHECK-SAME: <Dynamic>
+
+// CHECK: CXXStaticCastExpr
+// CHECK-SAME: static_cast
+// CHECK-SAME: <BaseToDerived (A)>
+
+// CHECK: CXXReinterpretCastExpr
+// CHECK-SAME: reinterpret_cast
+// CHECK-SAME: <BitCast>
+
+// CHECK: CXXConstCastExpr
+// CHECK-SAME: const_cast
+// CHECK-SAME: <NoOp>
+
+void expr() {
+ f();
+}
diff --git a/test/Import/cxx-default-init-expr/Inputs/S.cpp b/test/Import/cxx-default-init-expr/Inputs/S.cpp
new file mode 100644
index 000000000000..2b83b5d2eedc
--- /dev/null
+++ b/test/Import/cxx-default-init-expr/Inputs/S.cpp
@@ -0,0 +1,9 @@
+struct Foo {
+ int i;
+};
+
+struct S {
+ int int_member = 3;
+ float float_member = 3.0f;
+ Foo class_member = Foo();
+};
diff --git a/test/Import/cxx-default-init-expr/test.cpp b/test/Import/cxx-default-init-expr/test.cpp
new file mode 100644
index 000000000000..a50b12b83e0d
--- /dev/null
+++ b/test/Import/cxx-default-init-expr/test.cpp
@@ -0,0 +1,22 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s | FileCheck %s
+// CHECK: CXXCtorInitializer
+// CHECK-SAME: 'int_member'
+// CHECK-SAME: 'int'
+// CHECK-NEXT: CXXDefaultInitExpr
+// CHECK-SAME: 'int'
+
+// CHECK-NEXT: CXXCtorInitializer
+// CHECK-SAME: 'float_member'
+// CHECK-SAME: 'float'
+// CHECK-NEXT: CXXDefaultInitExpr
+// CHECK-SAME: 'float'
+
+// CHECK-NEXT: CXXCtorInitializer
+// CHECK-SAME: 'class_member'
+// CHECK-SAME: 'Foo'
+// CHECK-NEXT: CXXDefaultInitExpr
+// CHECK-SAME: 'Foo'
+
+void expr() {
+ struct S s;
+}
diff --git a/test/Import/cxx-for-range/Inputs/F.cpp b/test/Import/cxx-for-range/Inputs/F.cpp
new file mode 100644
index 000000000000..26a3a4e1d3fa
--- /dev/null
+++ b/test/Import/cxx-for-range/Inputs/F.cpp
@@ -0,0 +1,10 @@
+struct Container {
+ int *begin();
+ int *end();
+};
+
+void f() {
+ for (Container c; int varname : c) {
+ return;
+ }
+}
diff --git a/test/Import/cxx-for-range/test.cpp b/test/Import/cxx-for-range/test.cpp
new file mode 100644
index 000000000000..019fc20bee1e
--- /dev/null
+++ b/test/Import/cxx-for-range/test.cpp
@@ -0,0 +1,58 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: CXXForRangeStmt
+
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: c 'Container'
+// CHECK-NEXT: CXXConstructExpr
+
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: 'c'
+// CHECK-SAME: Container
+
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: CXXMemberCallExpr
+// CHECK-SAME: 'int *'
+// CHECK-NEXT: MemberExpr
+// CHECK-SAME: .begin
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: '__range1'
+// CHECK-SAME: Container
+
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: CXXMemberCallExpr
+// CHECK-SAME: 'int *'
+// CHECK-NEXT: MemberExpr
+// CHECK-SAME: .end
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: '__range1'
+// CHECK-SAME: Container
+
+// CHECK-NEXT: BinaryOperator
+// CHECK-SAME: '!='
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: '__begin1'
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: '__end1'
+
+// CHECK-NEXT: UnaryOperator
+// CHECK-SAME: '++'
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: '__begin1'
+
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname
+
+// CHECK: ReturnStmt
+
+void expr() {
+ f();
+}
diff --git a/test/Import/cxx-member-pointers/Inputs/S.cpp b/test/Import/cxx-member-pointers/Inputs/S.cpp
new file mode 100644
index 000000000000..afee60de3268
--- /dev/null
+++ b/test/Import/cxx-member-pointers/Inputs/S.cpp
@@ -0,0 +1,7 @@
+struct S {
+ int i;
+};
+
+int S::*iptr() {
+ return &S::i;
+}
diff --git a/test/Import/cxx-member-pointers/test.cpp b/test/Import/cxx-member-pointers/test.cpp
new file mode 100644
index 000000000000..253c90bdcf7e
--- /dev/null
+++ b/test/Import/cxx-member-pointers/test.cpp
@@ -0,0 +1,16 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s | FileCheck %s
+
+// CHECK: VarDecl
+// CHECK-SAME: int S::*
+// CHECK-NEXT: CallExpr
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-SAME: int S::*(*)()
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: int S::*()
+
+void expr() {
+ int S::*p = iptr();
+ S s;
+ s.i = 3;
+ int i = s.*p;
+}
diff --git a/test/Import/cxx-noexcept-expr/Inputs/F.cpp b/test/Import/cxx-noexcept-expr/Inputs/F.cpp
new file mode 100644
index 000000000000..2c48ad652a6e
--- /dev/null
+++ b/test/Import/cxx-noexcept-expr/Inputs/F.cpp
@@ -0,0 +1 @@
+bool f() { return noexcept(1); }
diff --git a/test/Import/cxx-noexcept-expr/test.cpp b/test/Import/cxx-noexcept-expr/test.cpp
new file mode 100644
index 000000000000..090a4eb7e647
--- /dev/null
+++ b/test/Import/cxx-noexcept-expr/test.cpp
@@ -0,0 +1,8 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: CXXNoexceptExpr
+// CHECK-NEXT: IntegerLiteral
+
+void expr() {
+ f();
+}
diff --git a/test/Import/cxx-scalar-value-init/Inputs/S.cpp b/test/Import/cxx-scalar-value-init/Inputs/S.cpp
new file mode 100644
index 000000000000..153d960699b0
--- /dev/null
+++ b/test/Import/cxx-scalar-value-init/Inputs/S.cpp
@@ -0,0 +1,2 @@
+int si() { return int(); }
+float sf() { return float(); }
diff --git a/test/Import/cxx-scalar-value-init/test.cpp b/test/Import/cxx-scalar-value-init/test.cpp
new file mode 100644
index 000000000000..596710911cc8
--- /dev/null
+++ b/test/Import/cxx-scalar-value-init/test.cpp
@@ -0,0 +1,11 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s | FileCheck %s
+// CHECK: CXXScalarValueInitExpr
+// CHECK-SAME: 'int'
+
+// CHECK: CXXScalarValueInitExpr
+// CHECK-SAME: 'float'
+
+void expr() {
+ int i = si();
+ float f = sf();
+}
diff --git a/test/Import/cxx-try-catch/Inputs/F.cpp b/test/Import/cxx-try-catch/Inputs/F.cpp
new file mode 100644
index 000000000000..4e06f3599bb4
--- /dev/null
+++ b/test/Import/cxx-try-catch/Inputs/F.cpp
@@ -0,0 +1,18 @@
+void f() {
+ try {
+ } catch (...) {
+ }
+
+ try {
+ } catch (int) {
+ }
+
+ try {
+ } catch (int varname) {
+ }
+
+ try {
+ } catch (int varname1) {
+ } catch (long varname2) {
+ }
+}
diff --git a/test/Import/cxx-try-catch/test.cpp b/test/Import/cxx-try-catch/test.cpp
new file mode 100644
index 000000000000..079e35b3e7d3
--- /dev/null
+++ b/test/Import/cxx-try-catch/test.cpp
@@ -0,0 +1,39 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: CXXTryStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CXXCatchStmt
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: CompoundStmt
+
+// CHECK: CXXTryStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CXXCatchStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: 'int'
+// CHECK-NEXT: CompoundStmt
+
+// CHECK: CXXTryStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CXXCatchStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname
+// CHECK-SAME: 'int'
+// CHECK-NEXT: CompoundStmt
+
+// CHECK: CXXTryStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CXXCatchStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname1
+// CHECK-SAME: 'int'
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CXXCatchStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname2
+// CHECK-SAME: 'long'
+// CHECK-NEXT: CompoundStmt
+
+void expr() {
+ f();
+}
diff --git a/test/Import/do-stmt/Inputs/F.cpp b/test/Import/do-stmt/Inputs/F.cpp
new file mode 100644
index 000000000000..a58efb3a25ca
--- /dev/null
+++ b/test/Import/do-stmt/Inputs/F.cpp
@@ -0,0 +1,7 @@
+void f() {
+ do
+ ;
+ while (true);
+ do {
+ } while (false);
+}
diff --git a/test/Import/do-stmt/test.cpp b/test/Import/do-stmt/test.cpp
new file mode 100644
index 000000000000..8b1057dae65b
--- /dev/null
+++ b/test/Import/do-stmt/test.cpp
@@ -0,0 +1,15 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: DoStmt
+// CHECK-NEXT: NullStmt
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-SAME: true
+
+// CHECK: DoStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-SAME: false
+
+void expr() {
+ f();
+}
diff --git a/test/Import/enum/Inputs/S.cpp b/test/Import/enum/Inputs/S.cpp
index 8506c68512db..3179da1daacc 100644
--- a/test/Import/enum/Inputs/S.cpp
+++ b/test/Import/enum/Inputs/S.cpp
@@ -2,3 +2,5 @@ enum E {
a = 1,
b = 2
};
+
+enum OpaqueWithType : long;
diff --git a/test/Import/enum/test.cpp b/test/Import/enum/test.cpp
index aa68063cb207..491c3b7cb60d 100644
--- a/test/Import/enum/test.cpp
+++ b/test/Import/enum/test.cpp
@@ -1,4 +1,8 @@
-// RUN: clang-import-test -import %S/Inputs/S.cpp -expression %s
+// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s | FileCheck %s
+
+// CHECK: OpaqueWithType 'long'
+
void expr() {
static_assert(E::a + E::b == 3);
+ static_assert(sizeof(OpaqueWithType) == sizeof(long));
}
diff --git a/test/Import/expr-with-cleanups/Inputs/S.cpp b/test/Import/expr-with-cleanups/Inputs/S.cpp
new file mode 100644
index 000000000000..7b69f48f681e
--- /dev/null
+++ b/test/Import/expr-with-cleanups/Inputs/S.cpp
@@ -0,0 +1,8 @@
+struct RAII {
+ int i = 0;
+ RAII() { i++; }
+ ~RAII() { i--; }
+};
+void f() {
+ RAII();
+}
diff --git a/test/Import/expr-with-cleanups/test.cpp b/test/Import/expr-with-cleanups/test.cpp
new file mode 100644
index 000000000000..79b76f414ecf
--- /dev/null
+++ b/test/Import/expr-with-cleanups/test.cpp
@@ -0,0 +1,8 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/S.cpp -expression %s | FileCheck %s
+// CHECK: ExprWithCleanups
+// CHECK-SAME: 'RAII'
+// CHECK-NEXT: CXXBindTemporaryExpr
+
+void expr() {
+ f();
+}
diff --git a/test/Import/for-stmt/Inputs/F.cpp b/test/Import/for-stmt/Inputs/F.cpp
new file mode 100644
index 000000000000..e93e35dd6b79
--- /dev/null
+++ b/test/Import/for-stmt/Inputs/F.cpp
@@ -0,0 +1,11 @@
+void f() {
+ for (;;)
+ ;
+ for (int i = 0;;)
+ continue;
+ for (; bool j = false;)
+ continue;
+ for (int i = 0; i != 0; ++i) {
+ i++;
+ }
+}
diff --git a/test/Import/for-stmt/test.cpp b/test/Import/for-stmt/test.cpp
new file mode 100644
index 000000000000..95895ce6c1db
--- /dev/null
+++ b/test/Import/for-stmt/test.cpp
@@ -0,0 +1,50 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: ForStmt
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: NullStmt
+
+// CHECK: ForStmt
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: ContinueStmt
+
+// CHECK: ForStmt
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: 'j'
+// CHECK-SAME: 'bool'
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: ContinueStmt
+
+// CHECK: ForStmt
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: <<NULL>>
+
+// CHECK-NEXT: BinaryOperator
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-NEXT: IntegerLiteral
+
+// CHECK-NEXT: UnaryOperator
+// CHECK-SAME: '++'
+// CHECK-NEXT: DeclRefExpr
+
+// CHECK-NEXT: CompoundStmt
+
+void expr() {
+ f();
+}
diff --git a/test/Import/if-stmt/Inputs/F.cpp b/test/Import/if-stmt/Inputs/F.cpp
new file mode 100644
index 000000000000..a7062c94ea76
--- /dev/null
+++ b/test/Import/if-stmt/Inputs/F.cpp
@@ -0,0 +1,21 @@
+void f() {
+ if (true)
+ return;
+
+ if (int j = 3)
+ return;
+
+ if (int j; true)
+ return;
+
+ if (true)
+ return;
+ else
+ return;
+
+ if (true) {
+ return;
+ } else {
+ return;
+ }
+}
diff --git a/test/Import/if-stmt/test.cpp b/test/Import/if-stmt/test.cpp
new file mode 100644
index 000000000000..8c92a72c0129
--- /dev/null
+++ b/test/Import/if-stmt/test.cpp
@@ -0,0 +1,36 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: IfStmt
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: ReturnStmt
+
+// CHECK: IfStmt
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-NEXT: ReturnStmt
+
+// CHECK: IfStmt
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: ReturnStmt
+
+// CHECK: IfStmt
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: ReturnStmt
+// CHECK-NEXT: ReturnStmt
+
+// CHECK: IfStmt
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ReturnStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ReturnStmt
+
+void expr() {
+ f();
+}
diff --git a/test/Import/indirect-goto/Inputs/F.cpp b/test/Import/indirect-goto/Inputs/F.cpp
new file mode 100644
index 000000000000..368b6db40da5
--- /dev/null
+++ b/test/Import/indirect-goto/Inputs/F.cpp
@@ -0,0 +1,6 @@
+void f() {
+ void const *l1_ptr = &&l1;
+ goto *l1_ptr;
+l1:
+ return;
+}
diff --git a/test/Import/indirect-goto/test.cpp b/test/Import/indirect-goto/test.cpp
new file mode 100644
index 000000000000..62be49eea6bc
--- /dev/null
+++ b/test/Import/indirect-goto/test.cpp
@@ -0,0 +1,10 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: IndirectGotoStmt
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: 'l1_ptr'
+
+void expr() {
+ f();
+}
diff --git a/test/Import/objc-autoreleasepool/Inputs/F.m b/test/Import/objc-autoreleasepool/Inputs/F.m
new file mode 100644
index 000000000000..0236cdf8f632
--- /dev/null
+++ b/test/Import/objc-autoreleasepool/Inputs/F.m
@@ -0,0 +1,5 @@
+void f() {
+ @autoreleasepool {
+ return;
+ }
+}
diff --git a/test/Import/objc-autoreleasepool/test.m b/test/Import/objc-autoreleasepool/test.m
new file mode 100644
index 000000000000..f09e7ef4dddf
--- /dev/null
+++ b/test/Import/objc-autoreleasepool/test.m
@@ -0,0 +1,9 @@
+// RUN: clang-import-test -dump-ast -x objective-c++ -import %S/Inputs/F.m -expression %s | FileCheck %s
+
+// CHECK: ObjCAutoreleasePoolStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ReturnStmt
+
+void expr() {
+ f();
+}
diff --git a/test/Import/objc-param-decl/Inputs/S.m b/test/Import/objc-param-decl/Inputs/S.m
new file mode 100644
index 000000000000..6364cfa43381
--- /dev/null
+++ b/test/Import/objc-param-decl/Inputs/S.m
@@ -0,0 +1,5 @@
+@protocol NSString
+@end
+
+@interface Dictionary <FirstParam : id <NSString>, NSString>
+@end
diff --git a/test/Import/objc-param-decl/test.m b/test/Import/objc-param-decl/test.m
new file mode 100644
index 000000000000..ce05b01b0f83
--- /dev/null
+++ b/test/Import/objc-param-decl/test.m
@@ -0,0 +1,11 @@
+// RUN: clang-import-test -dump-ast -x objective-c++ -import %S/Inputs/S.m -expression %s | FileCheck %s
+
+// CHECK: ObjCTypeParamDecl
+// CHECK-SAME: FirstParam
+// CHECK-SAME: 'id<NSString>'
+// CHECK-NEXT: ObjCTypeParamDecl
+// CHECK-SAME: 'id':'id'
+
+void expr() {
+ Dictionary *d;
+}
diff --git a/test/Import/objc-try-catch/Inputs/F.m b/test/Import/objc-try-catch/Inputs/F.m
new file mode 100644
index 000000000000..5b8b67549b33
--- /dev/null
+++ b/test/Import/objc-try-catch/Inputs/F.m
@@ -0,0 +1,28 @@
+@interface Exception
+@end
+@interface OtherException
+@end
+
+void f() {
+ @try {
+ Exception *e;
+ @throw e;
+ }
+ @catch (Exception *varname) {
+ }
+ @finally {
+ }
+
+ @try {
+ }
+ @catch (Exception *varname1) {
+ @throw;
+ }
+ @catch (OtherException *varname2) {
+ }
+
+ @try {
+ }
+ @finally {
+ }
+}
diff --git a/test/Import/objc-try-catch/test.m b/test/Import/objc-try-catch/test.m
new file mode 100644
index 000000000000..216beba4f7fa
--- /dev/null
+++ b/test/Import/objc-try-catch/test.m
@@ -0,0 +1,43 @@
+// RUN: clang-import-test -x objective-c++ -Xcc -fobjc-exceptions -dump-ast -import %S/Inputs/F.m -expression %s | FileCheck %s
+
+// FIXME: Seems that Objective-C try/catch crash codegen on Windows. Reenable once this is fixed.
+// UNSUPPORTED: system-windows
+
+// CHECK: ObjCAtTryStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: ObjCAtThrowStmt
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-NEXT: ObjCAtCatchStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname
+// CHECK-SAME: 'Exception *'
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ObjCAtFinallyStmt
+// CHECK-NEXT: CompoundStmt
+
+// CHECK-NEXT: ObjCAtTryStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ObjCAtCatchStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname1
+// CHECK-SAME: 'Exception *'
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ObjCAtThrowStmt
+// CHECK-NEXT: <<NULL>>
+// CHECK-NEXT: ObjCAtCatchStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname2
+// CHECK-SAME: 'OtherException *'
+// CHECK-NEXT: CompoundStmt
+
+// CHECK-NEXT: ObjCAtTryStmt
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: ObjCAtFinallyStmt
+// CHECK-NEXT: CompoundStmt
+
+void expr() {
+ f();
+}
diff --git a/test/Import/pack-expansion-expr/Inputs/F.cpp b/test/Import/pack-expansion-expr/Inputs/F.cpp
new file mode 100644
index 000000000000..528451c855d8
--- /dev/null
+++ b/test/Import/pack-expansion-expr/Inputs/F.cpp
@@ -0,0 +1,11 @@
+template <typename... T>
+void sink(T... a);
+
+template <typename... T>
+void packfuncT(T... a) {
+ sink(a...);
+}
+
+void f() {
+ packfuncT(1, 2, 3);
+}
diff --git a/test/Import/pack-expansion-expr/test.cpp b/test/Import/pack-expansion-expr/test.cpp
new file mode 100644
index 000000000000..3e9867b1a736
--- /dev/null
+++ b/test/Import/pack-expansion-expr/test.cpp
@@ -0,0 +1,12 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: PackExpansionExpr
+// CHECK-SAME: '<dependent type>'
+// CHECK-NEXT: DeclRefExpr
+// CHECK-SAME: 'T...'
+// CHECK-SAME: ParmVar
+// CHECK-SAME: 'a'
+
+void expr() {
+ f();
+}
diff --git a/test/Import/switch-stmt/Inputs/F.cpp b/test/Import/switch-stmt/Inputs/F.cpp
new file mode 100644
index 000000000000..5d0d8376d462
--- /dev/null
+++ b/test/Import/switch-stmt/Inputs/F.cpp
@@ -0,0 +1,23 @@
+void f() {
+ switch (1) {
+ case 1:
+ case 2:
+ break;
+ case 3 ... 4:
+ case 5 ... 5:
+ break;
+ }
+ switch (int varname; 1) {
+ case 1:
+ break;
+ case 2:
+ break;
+ case 3 ... 5:
+ break;
+ }
+ switch (1)
+ default:
+ break;
+ switch (0)
+ ;
+}
diff --git a/test/Import/switch-stmt/test.cpp b/test/Import/switch-stmt/test.cpp
new file mode 100644
index 000000000000..e274e895c444
--- /dev/null
+++ b/test/Import/switch-stmt/test.cpp
@@ -0,0 +1,57 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: SwitchStmt
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CaseStmt
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: CaseStmt
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: BreakStmt
+// CHECK-NEXT: CaseStmt
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: CaseStmt
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: BreakStmt
+
+// CHECK: SwitchStmt
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-SAME: varname
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: CompoundStmt
+// CHECK-NEXT: CaseStmt
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: BreakStmt
+// CHECK-NEXT: CaseStmt
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: BreakStmt
+// CHECK-NEXT: CaseStmt
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: ConstantExpr
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: BreakStmt
+
+// CHECK: SwitchStmt
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: DefaultStmt
+// CHECK-NEXT: BreakStmt
+
+// CHECK: SwitchStmt
+// CHECK-NEXT: IntegerLiteral
+// CHECK-NEXT: NullStmt
+
+void expr() {
+ f();
+}
diff --git a/test/Import/while-stmt/Inputs/F.cpp b/test/Import/while-stmt/Inputs/F.cpp
new file mode 100644
index 000000000000..6fd2d8753b04
--- /dev/null
+++ b/test/Import/while-stmt/Inputs/F.cpp
@@ -0,0 +1,8 @@
+void f() {
+ while (false)
+ ;
+ while (false) {
+ }
+ while (bool ini = true)
+ ;
+}
diff --git a/test/Import/while-stmt/test.cpp b/test/Import/while-stmt/test.cpp
new file mode 100644
index 000000000000..a0309d431240
--- /dev/null
+++ b/test/Import/while-stmt/test.cpp
@@ -0,0 +1,21 @@
+// RUN: clang-import-test -dump-ast -import %S/Inputs/F.cpp -expression %s | FileCheck %s
+
+// CHECK: WhileStmt
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: NullStmt
+
+// CHECK: WhileStmt
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: CompoundStmt
+
+// CHECK: WhileStmt
+// CHECK-NEXT: DeclStmt
+// CHECK-NEXT: VarDecl
+// CHECK-NEXT: CXXBoolLiteralExpr
+// CHECK-NEXT: ImplicitCastExpr
+// CHECK-NEXT: DeclRefExpr
+// CHECK-NEXT: NullStmt
+
+void expr() {
+ f();
+}