Skip to content

Commit 30335ab

Browse files
committed
C++: Add C11 _Generic IR tests
1 parent 89c387c commit 30335ab

File tree

4 files changed

+198
-5
lines changed

4 files changed

+198
-5
lines changed

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4180,7 +4180,7 @@ destructors_for_temps.cpp:
41804180
# 103| ValueCategory = prvalue
41814181
# 104| getStmt(1): [ReturnStmt] return ...
41824182
generic.c:
4183-
# 1| [TopLevelFunction] void c11_generic_test(unsigned int, int)
4183+
# 1| [TopLevelFunction] void c11_generic_test_with_load(unsigned int, int)
41844184
# 1| <params>:
41854185
# 1| getParameter(0): [Parameter] x
41864186
# 1| Type = [IntType] unsigned int
@@ -4213,6 +4213,65 @@ generic.c:
42134213
# 3| Value = [CStyleCast] 1
42144214
# 3| ValueCategory = prvalue
42154215
# 4| getStmt(2): [ReturnStmt] return ...
4216+
# 12| [TopLevelFunction] char const* c11_generic_test_with_constant_and_macro()
4217+
# 12| <params>:
4218+
# 13| getEntryPoint(): [BlockStmt] { ... }
4219+
# 14| getStmt(0): [DeclStmt] declaration
4220+
# 14| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
4221+
# 14| Type = [IntType] int
4222+
# 16| getStmt(1): [ReturnStmt] return ...
4223+
# 16| getExpr(): int
4224+
# 16| Type = [ArrayType] char[4]
4225+
# 16| Value = [StringLiteral] "int"
4226+
# 16| ValueCategory = lvalue
4227+
# 16| getExpr().getFullyConverted(): [CStyleCast] (const char *)...
4228+
# 16| Conversion = [PointerConversion] pointer conversion
4229+
# 16| Type = [PointerType] const char *
4230+
# 16| ValueCategory = prvalue
4231+
# 16| getExpr(): [ArrayToPointerConversion] array to pointer conversion
4232+
# 16| Type = [CharPointerType] char *
4233+
# 16| ValueCategory = prvalue
4234+
# 19| [TopLevelFunction] char const* c11_generic_test_with_constant_and_no_macro()
4235+
# 19| <params>:
4236+
# 20| getEntryPoint(): [BlockStmt] { ... }
4237+
# 21| getStmt(0): [DeclStmt] declaration
4238+
# 21| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
4239+
# 21| Type = [IntType] int
4240+
# 23| getStmt(1): [ReturnStmt] return ...
4241+
# 23| getExpr(): int
4242+
# 23| Type = [ArrayType] char[4]
4243+
# 23| Value = [StringLiteral] "int"
4244+
# 23| ValueCategory = lvalue
4245+
# 23| getExpr().getFullyConverted(): [CStyleCast] (const char *)...
4246+
# 23| Conversion = [PointerConversion] pointer conversion
4247+
# 23| Type = [PointerType] const char *
4248+
# 23| ValueCategory = prvalue
4249+
# 23| getExpr(): [ArrayToPointerConversion] array to pointer conversion
4250+
# 23| Type = [CharPointerType] char *
4251+
# 23| ValueCategory = prvalue
4252+
# 26| [TopLevelFunction] void c11_generic_test_test_with_cast(int)
4253+
# 26| <params>:
4254+
# 26| getParameter(0): [Parameter] y
4255+
# 26| Type = [IntType] int
4256+
# 26| getEntryPoint(): [BlockStmt] { ... }
4257+
# 27| getStmt(0): [DeclStmt] declaration
4258+
# 27| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r
4259+
# 27| Type = [IntType] unsigned int
4260+
# 28| getStmt(1): [ExprStmt] ExprStmt
4261+
# 28| getExpr(): [AssignExpr] ... = ...
4262+
# 28| Type = [IntType] unsigned int
4263+
# 28| ValueCategory = prvalue
4264+
# 28| getLValue(): [VariableAccess] r
4265+
# 28| Type = [IntType] unsigned int
4266+
# 28| ValueCategory = lvalue
4267+
# 28| getRValue(): [VariableAccess] y
4268+
# 28| Type = [IntType] int
4269+
# 28| ValueCategory = prvalue(load)
4270+
# 28| getRValue().getFullyConverted(): [CStyleCast] (unsigned int)...
4271+
# 28| Conversion = [IntegralConversion] integral conversion
4272+
# 28| Type = [IntType] unsigned int
4273+
# 28| ValueCategory = prvalue
4274+
# 29| getStmt(2): [ReturnStmt] return ...
42164275
ir.c:
42174276
# 5| [TopLevelFunction] int getX(MyCoords*)
42184277
# 5| <params>:

cpp/ql/test/library-tests/ir/ir/aliased_ir.expected

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2959,7 +2959,7 @@ destructors_for_temps.cpp:
29592959
# 102| v102_10(void) = ExitFunction :
29602960

29612961
generic.c:
2962-
# 1| void c11_generic_test(unsigned int, int)
2962+
# 1| void c11_generic_test_with_load(unsigned int, int)
29632963
# 1| Block 0
29642964
# 1| v1_1(void) = EnterFunction :
29652965
# 1| m1_2(unknown) = AliasedDefinition :
@@ -2982,6 +2982,62 @@ generic.c:
29822982
# 1| v1_10(void) = AliasedUse : m1_3
29832983
# 1| v1_11(void) = ExitFunction :
29842984

2985+
# 12| char const* c11_generic_test_with_constant_and_macro()
2986+
# 12| Block 0
2987+
# 12| v12_1(void) = EnterFunction :
2988+
# 12| m12_2(unknown) = AliasedDefinition :
2989+
# 12| m12_3(unknown) = InitializeNonLocal :
2990+
# 12| m12_4(unknown) = Chi : total:m12_2, partial:m12_3
2991+
# 14| r14_1(glval<int>) = VariableAddress[i] :
2992+
# 14| m14_2(int) = Uninitialized[i] : &:r14_1
2993+
# 16| r16_1(glval<char *>) = VariableAddress[#return] :
2994+
# 16| r16_2(glval<char[4]>) = StringConstant[int] :
2995+
# 16| r16_3(char *) = Convert : r16_2
2996+
# 16| r16_4(char *) = Convert : r16_3
2997+
# 16| m16_5(char *) = Store[#return] : &:r16_1, r16_4
2998+
# 12| r12_5(glval<char *>) = VariableAddress[#return] :
2999+
# 12| v12_6(void) = ReturnValue : &:r12_5, m16_5
3000+
# 12| v12_7(void) = AliasedUse : m12_3
3001+
# 12| v12_8(void) = ExitFunction :
3002+
3003+
# 19| char const* c11_generic_test_with_constant_and_no_macro()
3004+
# 19| Block 0
3005+
# 19| v19_1(void) = EnterFunction :
3006+
# 19| m19_2(unknown) = AliasedDefinition :
3007+
# 19| m19_3(unknown) = InitializeNonLocal :
3008+
# 19| m19_4(unknown) = Chi : total:m19_2, partial:m19_3
3009+
# 21| r21_1(glval<int>) = VariableAddress[i] :
3010+
# 21| m21_2(int) = Uninitialized[i] : &:r21_1
3011+
# 23| r23_1(glval<char *>) = VariableAddress[#return] :
3012+
# 23| r23_2(glval<char[4]>) = StringConstant["int"] :
3013+
# 23| r23_3(char *) = Convert : r23_2
3014+
# 23| r23_4(char *) = Convert : r23_3
3015+
# 23| m23_5(char *) = Store[#return] : &:r23_1, r23_4
3016+
# 19| r19_5(glval<char *>) = VariableAddress[#return] :
3017+
# 19| v19_6(void) = ReturnValue : &:r19_5, m23_5
3018+
# 19| v19_7(void) = AliasedUse : m19_3
3019+
# 19| v19_8(void) = ExitFunction :
3020+
3021+
# 26| void c11_generic_test_test_with_cast(int)
3022+
# 26| Block 0
3023+
# 26| v26_1(void) = EnterFunction :
3024+
# 26| m26_2(unknown) = AliasedDefinition :
3025+
# 26| m26_3(unknown) = InitializeNonLocal :
3026+
# 26| m26_4(unknown) = Chi : total:m26_2, partial:m26_3
3027+
# 26| r26_5(glval<int>) = VariableAddress[y] :
3028+
# 26| m26_6(int) = InitializeParameter[y] : &:r26_5
3029+
# 27| r27_1(glval<unsigned int>) = VariableAddress[r] :
3030+
# 27| m27_2(unsigned int) = Uninitialized[r] : &:r27_1
3031+
# 28| r28_1(glval<int>) = VariableAddress[y] :
3032+
# 28| r28_2(int) = Load[y] : &:r28_1, m26_6
3033+
# 28| r28_3(unsigned int) = Convert : r28_2
3034+
# 28| r28_4(glval<unsigned int>) = VariableAddress[r] :
3035+
# 28| m28_5(unsigned int) = Store[r] : &:r28_4, r28_3
3036+
# 29| v29_1(void) = NoOp :
3037+
# 26| v26_7(void) = ReturnVoid :
3038+
# 26| v26_8(void) = AliasedUse : m26_3
3039+
# 26| v26_9(void) = ExitFunction :
3040+
29853041
ir.c:
29863042
# 7| void MyCoordsTest(int)
29873043
# 7| Block 0
Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,31 @@
1-
void c11_generic_test(unsigned int x, int y) {
1+
void c11_generic_test_with_load(unsigned int x, int y) {
22
unsigned int r;
33
r = _Generic(r, unsigned int: x, int: y) + 1;
44
}
55

6-
// // semmle-extractor-options: -std=c11
6+
#define describe(val) \
7+
_Generic((val), \
8+
int: "int", \
9+
default: "unknown" \
10+
)
11+
12+
const char *c11_generic_test_with_constant_and_macro()
13+
{
14+
int i;
15+
16+
return describe(i);
17+
}
18+
19+
const char *c11_generic_test_with_constant_and_no_macro()
20+
{
21+
int i;
22+
23+
return _Generic(i, int: "int", default: "unknown");
24+
}
25+
26+
void c11_generic_test_test_with_cast(int y) {
27+
unsigned int r;
28+
r = _Generic(r, unsigned int: (unsigned int)y, int: y);
29+
}
30+
31+
// semmle-extractor-options: -std=c11

cpp/ql/test/library-tests/ir/ir/raw_ir.expected

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2733,7 +2733,7 @@ destructors_for_temps.cpp:
27332733
# 102| v102_8(void) = ExitFunction :
27342734

27352735
generic.c:
2736-
# 1| void c11_generic_test(unsigned int, int)
2736+
# 1| void c11_generic_test_with_load(unsigned int, int)
27372737
# 1| Block 0
27382738
# 1| v1_1(void) = EnterFunction :
27392739
# 1| mu1_2(unknown) = AliasedDefinition :
@@ -2755,6 +2755,59 @@ generic.c:
27552755
# 1| v1_9(void) = AliasedUse : ~m?
27562756
# 1| v1_10(void) = ExitFunction :
27572757

2758+
# 12| char const* c11_generic_test_with_constant_and_macro()
2759+
# 12| Block 0
2760+
# 12| v12_1(void) = EnterFunction :
2761+
# 12| mu12_2(unknown) = AliasedDefinition :
2762+
# 12| mu12_3(unknown) = InitializeNonLocal :
2763+
# 14| r14_1(glval<int>) = VariableAddress[i] :
2764+
# 14| mu14_2(int) = Uninitialized[i] : &:r14_1
2765+
# 16| r16_1(glval<char *>) = VariableAddress[#return] :
2766+
# 16| r16_2(glval<char[4]>) = StringConstant[int] :
2767+
# 16| r16_3(char *) = Convert : r16_2
2768+
# 16| r16_4(char *) = Convert : r16_3
2769+
# 16| mu16_5(char *) = Store[#return] : &:r16_1, r16_4
2770+
# 12| r12_4(glval<char *>) = VariableAddress[#return] :
2771+
# 12| v12_5(void) = ReturnValue : &:r12_4, ~m?
2772+
# 12| v12_6(void) = AliasedUse : ~m?
2773+
# 12| v12_7(void) = ExitFunction :
2774+
2775+
# 19| char const* c11_generic_test_with_constant_and_no_macro()
2776+
# 19| Block 0
2777+
# 19| v19_1(void) = EnterFunction :
2778+
# 19| mu19_2(unknown) = AliasedDefinition :
2779+
# 19| mu19_3(unknown) = InitializeNonLocal :
2780+
# 21| r21_1(glval<int>) = VariableAddress[i] :
2781+
# 21| mu21_2(int) = Uninitialized[i] : &:r21_1
2782+
# 23| r23_1(glval<char *>) = VariableAddress[#return] :
2783+
# 23| r23_2(glval<char[4]>) = StringConstant["int"] :
2784+
# 23| r23_3(char *) = Convert : r23_2
2785+
# 23| r23_4(char *) = Convert : r23_3
2786+
# 23| mu23_5(char *) = Store[#return] : &:r23_1, r23_4
2787+
# 19| r19_4(glval<char *>) = VariableAddress[#return] :
2788+
# 19| v19_5(void) = ReturnValue : &:r19_4, ~m?
2789+
# 19| v19_6(void) = AliasedUse : ~m?
2790+
# 19| v19_7(void) = ExitFunction :
2791+
2792+
# 26| void c11_generic_test_test_with_cast(int)
2793+
# 26| Block 0
2794+
# 26| v26_1(void) = EnterFunction :
2795+
# 26| mu26_2(unknown) = AliasedDefinition :
2796+
# 26| mu26_3(unknown) = InitializeNonLocal :
2797+
# 26| r26_4(glval<int>) = VariableAddress[y] :
2798+
# 26| mu26_5(int) = InitializeParameter[y] : &:r26_4
2799+
# 27| r27_1(glval<unsigned int>) = VariableAddress[r] :
2800+
# 27| mu27_2(unsigned int) = Uninitialized[r] : &:r27_1
2801+
# 28| r28_1(glval<int>) = VariableAddress[y] :
2802+
# 28| r28_2(int) = Load[y] : &:r28_1, ~m?
2803+
# 28| r28_3(unsigned int) = Convert : r28_2
2804+
# 28| r28_4(glval<unsigned int>) = VariableAddress[r] :
2805+
# 28| mu28_5(unsigned int) = Store[r] : &:r28_4, r28_3
2806+
# 29| v29_1(void) = NoOp :
2807+
# 26| v26_6(void) = ReturnVoid :
2808+
# 26| v26_7(void) = AliasedUse : ~m?
2809+
# 26| v26_8(void) = ExitFunction :
2810+
27582811
ir.c:
27592812
# 7| void MyCoordsTest(int)
27602813
# 7| Block 0

0 commit comments

Comments
 (0)