Skip to content

Commit f0fde55

Browse files
committed
new tests
1 parent d15960d commit f0fde55

File tree

3 files changed

+162
-0
lines changed

3 files changed

+162
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump %s | FileCheck %s
2+
3+
// CHECK-LABEL: increment
4+
void increment(inout int Arr[2]) {
5+
for (int I = 0; I < 2; I++)
6+
Arr[0] += 2;
7+
}
8+
9+
// CHECK-LABEL: call
10+
// CHECK: CallExpr 0x{{.*}} {{.*}} 'void'
11+
// CHECK: ImplicitCastExpr 0x{{.*}} {{.*}} 'void (*)(inout int[2])' <FunctionToPointerDecay>
12+
// CHECK: DeclRefExpr 0x{{.*}} {{.*}} 'void (inout int[2])' lvalue Function 0x{{.*}} 'increment' 'void (inout int[2])'
13+
// CHECK: HLSLOutArgExpr 0x{{.*}} {{.*}} 'int[2]' lvalue inout
14+
// CHECK: OpaqueValueExpr [[A:0x.*]] {{.*}} 'int[2]' lvalue
15+
// CHECK: DeclRefExpr [[B:0x.*]] {{.*}} 'int[2]' lvalue Var [[E:0x.*]] 'A' 'int[2]'
16+
// CHECK: OpaqueValueExpr [[C:0x.*]] {{.*}} 'int[2]' lvalue
17+
// CHECK: ImplicitCastExpr [[D:0x.*]] {{.*}} 'int[2]' <HLSLArrayRValue>
18+
// CHECK: OpaqueValueExpr [[A]] {{.*}} 'int[2]' lvalue
19+
// CHECK: DeclRefExpr [[B]] {{.*}} 'int[2]' lvalue Var [[E]] 'A' 'int[2]'
20+
// CHECK: BinaryOperator 0x{{.*}} {{.*}} 'int[2]' lvalue '='
21+
// CHECK: OpaqueValueExpr [[A]] {{.*}} 'int[2]' lvalue
22+
// CHECK: DeclRefExpr 0x{{.*}} {{.*}} 'int[2]' lvalue Var [[E]] 'A' 'int[2]'
23+
// CHECK: ImplicitCastExpr 0x{{.*}} {{.*}} 'int[2]' <HLSLArrayRValue>
24+
// CHECK: OpaqueValueExpr [[C]] {{.*}} 'int[2]' lvalue
25+
// CHECK: ImplicitCastExpr [[D]] {{.*}} 'int[2]' <HLSLArrayRValue>
26+
// CHECK: OpaqueValueExpr [[A]] {{.*}} 'int[2]' lvalue
27+
// CHECK: DeclRefExpr [[B]] {{.*}} 'int[2]' lvalue Var [[E]] 'A' 'int[2]'
28+
export int call() {
29+
int A[2] = { 0, 1 };
30+
increment(A);
31+
return A[0];
32+
}
33+
34+
// CHECK-LABEL: fn2
35+
void fn2(out int Arr[2]) {
36+
Arr[0] += 5;
37+
Arr[1] += 6;
38+
}
39+
40+
// CHECK-LABEL: call2
41+
// CHECK: CallExpr 0x{{.*}} {{.*}} 'void'
42+
// CHECK: ImplicitCastExpr 0x{{.*}} {{.*}} 'void (*)(out int[2])' <FunctionToPointerDecay>
43+
// CHECK: DeclRefExpr 0x{{.*}} {{.*}} 'void (out int[2])' lvalue Function 0x{{.*}} 'fn2' 'void (out int[2])'
44+
// CHECK: HLSLOutArgExpr 0x{{.*}} {{.*}} 'int[2]' lvalue out
45+
// CHECK: OpaqueValueExpr [[A:0x.*]] {{.*}} 'int[2]' lvalue
46+
// CHECK: DeclRefExpr [[B:0x.*]] {{.*}} 'int[2]' lvalue Var [[E:0x.*]] 'A' 'int[2]'
47+
// CHECK: OpaqueValueExpr [[C:0x.*]] {{.*}} 'int[2]' lvalue
48+
// CHECK: ImplicitCastExpr [[D:0x.*]] {{.*}} 'int[2]' <HLSLArrayRValue>
49+
// CHECK: OpaqueValueExpr [[A]] {{.*}} 'int[2]' lvalue
50+
// CHECK: DeclRefExpr [[B]] {{.*}} 'int[2]' lvalue Var [[E]] 'A' 'int[2]'
51+
// CHECK: BinaryOperator 0x{{.*}} {{.*}} 'int[2]' lvalue '='
52+
// CHECK: OpaqueValueExpr [[A]] {{.*}} 'int[2]' lvalue
53+
// CHECK: DeclRefExpr [[B]] {{.*}} 'int[2]' lvalue Var [[E]] 'A' 'int[2]'
54+
// CHECK: ImplicitCastExpr 0x{{.*}} {{.*}} 'int[2]' <HLSLArrayRValue>
55+
// CHECK: OpaqueValueExpr [[C]] {{.*}} 'int[2]' lvalue
56+
// CHECK: ImplicitCastExpr [[D]] {{.*}} 'int[2]' <HLSLArrayRValue>
57+
// CHECK: OpaqueValueExpr [[A]] {{.*}} 'int[2]' lvalue
58+
// CHECK: DeclRefExpr [[B]] {{.*}} 'int[2]' lvalue Var [[E]] 'A' 'int[2]'
59+
export int call2() {
60+
int A[2] = { 0, 1 };
61+
fn2(A);
62+
return 1;
63+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -disable-llvm-passes -emit-llvm -finclude-default-header -o - %s | FileCheck %s
2+
3+
// CHECK-LABEL: increment
4+
void increment(inout int Arr[2]) {
5+
for (int I = 0; I < 2; I++)
6+
Arr[0] += 2;
7+
}
8+
9+
// CHECK-LABEL: call
10+
// CHECK: [[A:%.*]] = alloca [2 x i32], align 4
11+
// CHECK-NEXT: [[Tmp:%.*]] = alloca [2 x i32], align 4
12+
// CHECK-NEXT: [[Tmp2:%.*]] = alloca [2 x i32], align 4
13+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[A]], ptr align 4 @{{.*}}, i32 8, i1 false)
14+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[Tmp]], ptr align 4 [[A]], i32 8, i1 false)
15+
// CHECK-NEXT: store ptr [[Tmp]], ptr [[Tmp2]], align 4
16+
// CHECK-NEXT: call void @"?increment{{.*}}(ptr noalias noundef byval([2 x i32]) align 4 [[Tmp2]]) #3
17+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[A]], ptr align 4 [[Tmp]], i32 8, i1 false)
18+
// CHECK-NEXT: [[Idx:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i32 0, i32 0
19+
// CHECK-NEXT: [[B:%.*]] = load i32, ptr [[Idx]], align 4
20+
// CHECK-NEXT: ret i32 [[B]]
21+
export int call() {
22+
int A[2] = { 0, 1 };
23+
increment(A);
24+
return A[0];
25+
}
26+
27+
// CHECK-LABEL: fn2
28+
void fn2(out int Arr[2]) {
29+
Arr[0] += 5;
30+
Arr[1] += 6;
31+
}
32+
33+
// CHECK-LABEL: call2
34+
// CHECK: [[A:%.*]] = alloca [2 x i32], align 4
35+
// CHECK-NEXT: [[Tmp:%.*]] = alloca [2 x i32], align 4
36+
// CHECK-NEXT: [[Tmp2:%.*]] = alloca [2 x i32], align 4
37+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[A]], ptr align 4 @{{.*}}, i32 8, i1 false)
38+
// CHECK-NEXT: store ptr [[Tmp]], ptr [[Tmp2]], align 4
39+
// CHECK-NEXT: call void @"?fn2{{.*}}(ptr noalias noundef byval([2 x i32]) align 4 [[Tmp2]]) #3
40+
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[A]], ptr align 4 [[Tmp]], i32 8, i1 false)
41+
// CHECK-NEXT: [[Idx:%.*]] = getelementptr inbounds [2 x i32], ptr [[A]], i32 0, i32 0
42+
// CHECK-NEXT: [[B:%.*]] = load i32, ptr [[Idx]], align 4
43+
// CHECK-NEXT: ret i32 [[B]]
44+
export int call2() {
45+
int A[2] = { 0, 1 };
46+
fn2(A);
47+
return A[0];
48+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -verify
2+
3+
void increment(inout int Arr[2]) {
4+
for (int I = 0; I < 2; I++)
5+
Arr[0] += 2;
6+
}
7+
8+
export int wrongSize() {
9+
int A[3] = { 0, 1, 2 };
10+
increment(A);
11+
// expected-error@-1 {{no matching function for call to 'increment'}}
12+
// expected-note@*:* {{candidate function not viable: no known conversion from 'int[3]' to 'int[2]' for 1st argument}}
13+
return A[0];
14+
}
15+
16+
export int wrongSize2() {
17+
int A[1] = { 0 };
18+
increment(A);
19+
// expected-error@-1 {{no matching function for call to 'increment'}}
20+
// expected-note@*:* {{candidate function not viable: no known conversion from 'int[1]' to 'int[2]' for 1st argument}}
21+
return A[0];
22+
}
23+
24+
export void tooFewArgs() {
25+
increment();
26+
// expected-error@-1 {{no matching function for call to 'increment'}}
27+
// expected-note@*:* {{candidate function not viable: requires single argument 'Arr', but no arguments were provided}}
28+
}
29+
30+
export float wrongType() {
31+
float A[2] = { 0, 1 };
32+
increment(A);
33+
// expected-error@-1 {{no matching function for call to 'increment'}}
34+
// expected-note@*:* {{candidate function not viable: no known conversion from 'float[2]' to 'int[2]' for 1st argument}}
35+
return A[0];
36+
}
37+
38+
export int wrongType2() {
39+
increment(5);
40+
// expected-error@-1 {{no matching function for call to 'increment'}}
41+
// expected-note@*:* {{candidate function not viable: no known conversion from 'int' to 'int[2]' for 1st argument}}
42+
return 1;
43+
}
44+
45+
export void tooManyArgs() {
46+
int A[2] = { 0, 1 };
47+
int B[2] = { 2, 3 };
48+
increment(A, B);
49+
// expected-error@-1 {{no matching function for call to 'increment'}}
50+
// expected-note@*:* {{candidate function not viable: requires single argument 'Arr', but 2 arguments were provided}}
51+
}

0 commit comments

Comments
 (0)