Skip to content

Commit

Permalink
C++: Add C11 _Generic IR tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jketema committed Aug 30, 2024
1 parent 89c387c commit 30335ab
Show file tree
Hide file tree
Showing 4 changed files with 198 additions and 5 deletions.
61 changes: 60 additions & 1 deletion cpp/ql/test/library-tests/ir/ir/PrintAST.expected
Original file line number Diff line number Diff line change
Expand Up @@ -4180,7 +4180,7 @@ destructors_for_temps.cpp:
# 103| ValueCategory = prvalue
# 104| getStmt(1): [ReturnStmt] return ...
generic.c:
# 1| [TopLevelFunction] void c11_generic_test(unsigned int, int)
# 1| [TopLevelFunction] void c11_generic_test_with_load(unsigned int, int)
# 1| <params>:
# 1| getParameter(0): [Parameter] x
# 1| Type = [IntType] unsigned int
Expand Down Expand Up @@ -4213,6 +4213,65 @@ generic.c:
# 3| Value = [CStyleCast] 1
# 3| ValueCategory = prvalue
# 4| getStmt(2): [ReturnStmt] return ...
# 12| [TopLevelFunction] char const* c11_generic_test_with_constant_and_macro()
# 12| <params>:
# 13| getEntryPoint(): [BlockStmt] { ... }
# 14| getStmt(0): [DeclStmt] declaration
# 14| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
# 14| Type = [IntType] int
# 16| getStmt(1): [ReturnStmt] return ...
# 16| getExpr(): int
# 16| Type = [ArrayType] char[4]
# 16| Value = [StringLiteral] "int"
# 16| ValueCategory = lvalue
# 16| getExpr().getFullyConverted(): [CStyleCast] (const char *)...
# 16| Conversion = [PointerConversion] pointer conversion
# 16| Type = [PointerType] const char *
# 16| ValueCategory = prvalue
# 16| getExpr(): [ArrayToPointerConversion] array to pointer conversion
# 16| Type = [CharPointerType] char *
# 16| ValueCategory = prvalue
# 19| [TopLevelFunction] char const* c11_generic_test_with_constant_and_no_macro()
# 19| <params>:
# 20| getEntryPoint(): [BlockStmt] { ... }
# 21| getStmt(0): [DeclStmt] declaration
# 21| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
# 21| Type = [IntType] int
# 23| getStmt(1): [ReturnStmt] return ...
# 23| getExpr(): int
# 23| Type = [ArrayType] char[4]
# 23| Value = [StringLiteral] "int"
# 23| ValueCategory = lvalue
# 23| getExpr().getFullyConverted(): [CStyleCast] (const char *)...
# 23| Conversion = [PointerConversion] pointer conversion
# 23| Type = [PointerType] const char *
# 23| ValueCategory = prvalue
# 23| getExpr(): [ArrayToPointerConversion] array to pointer conversion
# 23| Type = [CharPointerType] char *
# 23| ValueCategory = prvalue
# 26| [TopLevelFunction] void c11_generic_test_test_with_cast(int)
# 26| <params>:
# 26| getParameter(0): [Parameter] y
# 26| Type = [IntType] int
# 26| getEntryPoint(): [BlockStmt] { ... }
# 27| getStmt(0): [DeclStmt] declaration
# 27| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r
# 27| Type = [IntType] unsigned int
# 28| getStmt(1): [ExprStmt] ExprStmt
# 28| getExpr(): [AssignExpr] ... = ...
# 28| Type = [IntType] unsigned int
# 28| ValueCategory = prvalue
# 28| getLValue(): [VariableAccess] r
# 28| Type = [IntType] unsigned int
# 28| ValueCategory = lvalue
# 28| getRValue(): [VariableAccess] y
# 28| Type = [IntType] int
# 28| ValueCategory = prvalue(load)
# 28| getRValue().getFullyConverted(): [CStyleCast] (unsigned int)...
# 28| Conversion = [IntegralConversion] integral conversion
# 28| Type = [IntType] unsigned int
# 28| ValueCategory = prvalue
# 29| getStmt(2): [ReturnStmt] return ...
ir.c:
# 5| [TopLevelFunction] int getX(MyCoords*)
# 5| <params>:
Expand Down
58 changes: 57 additions & 1 deletion cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
Original file line number Diff line number Diff line change
Expand Up @@ -2959,7 +2959,7 @@ destructors_for_temps.cpp:
# 102| v102_10(void) = ExitFunction :

generic.c:
# 1| void c11_generic_test(unsigned int, int)
# 1| void c11_generic_test_with_load(unsigned int, int)
# 1| Block 0
# 1| v1_1(void) = EnterFunction :
# 1| m1_2(unknown) = AliasedDefinition :
Expand All @@ -2982,6 +2982,62 @@ generic.c:
# 1| v1_10(void) = AliasedUse : m1_3
# 1| v1_11(void) = ExitFunction :

# 12| char const* c11_generic_test_with_constant_and_macro()
# 12| Block 0
# 12| v12_1(void) = EnterFunction :
# 12| m12_2(unknown) = AliasedDefinition :
# 12| m12_3(unknown) = InitializeNonLocal :
# 12| m12_4(unknown) = Chi : total:m12_2, partial:m12_3
# 14| r14_1(glval<int>) = VariableAddress[i] :
# 14| m14_2(int) = Uninitialized[i] : &:r14_1
# 16| r16_1(glval<char *>) = VariableAddress[#return] :
# 16| r16_2(glval<char[4]>) = StringConstant[int] :
# 16| r16_3(char *) = Convert : r16_2
# 16| r16_4(char *) = Convert : r16_3
# 16| m16_5(char *) = Store[#return] : &:r16_1, r16_4
# 12| r12_5(glval<char *>) = VariableAddress[#return] :
# 12| v12_6(void) = ReturnValue : &:r12_5, m16_5
# 12| v12_7(void) = AliasedUse : m12_3
# 12| v12_8(void) = ExitFunction :

# 19| char const* c11_generic_test_with_constant_and_no_macro()
# 19| Block 0
# 19| v19_1(void) = EnterFunction :
# 19| m19_2(unknown) = AliasedDefinition :
# 19| m19_3(unknown) = InitializeNonLocal :
# 19| m19_4(unknown) = Chi : total:m19_2, partial:m19_3
# 21| r21_1(glval<int>) = VariableAddress[i] :
# 21| m21_2(int) = Uninitialized[i] : &:r21_1
# 23| r23_1(glval<char *>) = VariableAddress[#return] :
# 23| r23_2(glval<char[4]>) = StringConstant["int"] :
# 23| r23_3(char *) = Convert : r23_2
# 23| r23_4(char *) = Convert : r23_3
# 23| m23_5(char *) = Store[#return] : &:r23_1, r23_4
# 19| r19_5(glval<char *>) = VariableAddress[#return] :
# 19| v19_6(void) = ReturnValue : &:r19_5, m23_5
# 19| v19_7(void) = AliasedUse : m19_3
# 19| v19_8(void) = ExitFunction :

# 26| void c11_generic_test_test_with_cast(int)
# 26| Block 0
# 26| v26_1(void) = EnterFunction :
# 26| m26_2(unknown) = AliasedDefinition :
# 26| m26_3(unknown) = InitializeNonLocal :
# 26| m26_4(unknown) = Chi : total:m26_2, partial:m26_3
# 26| r26_5(glval<int>) = VariableAddress[y] :
# 26| m26_6(int) = InitializeParameter[y] : &:r26_5
# 27| r27_1(glval<unsigned int>) = VariableAddress[r] :
# 27| m27_2(unsigned int) = Uninitialized[r] : &:r27_1
# 28| r28_1(glval<int>) = VariableAddress[y] :
# 28| r28_2(int) = Load[y] : &:r28_1, m26_6
# 28| r28_3(unsigned int) = Convert : r28_2
# 28| r28_4(glval<unsigned int>) = VariableAddress[r] :
# 28| m28_5(unsigned int) = Store[r] : &:r28_4, r28_3
# 29| v29_1(void) = NoOp :
# 26| v26_7(void) = ReturnVoid :
# 26| v26_8(void) = AliasedUse : m26_3
# 26| v26_9(void) = ExitFunction :

ir.c:
# 7| void MyCoordsTest(int)
# 7| Block 0
Expand Down
29 changes: 27 additions & 2 deletions cpp/ql/test/library-tests/ir/ir/generic.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,31 @@
void c11_generic_test(unsigned int x, int y) {
void c11_generic_test_with_load(unsigned int x, int y) {
unsigned int r;
r = _Generic(r, unsigned int: x, int: y) + 1;
}

// // semmle-extractor-options: -std=c11
#define describe(val) \
_Generic((val), \
int: "int", \
default: "unknown" \
)

const char *c11_generic_test_with_constant_and_macro()
{
int i;

return describe(i);
}

const char *c11_generic_test_with_constant_and_no_macro()
{
int i;

return _Generic(i, int: "int", default: "unknown");
}

void c11_generic_test_test_with_cast(int y) {
unsigned int r;
r = _Generic(r, unsigned int: (unsigned int)y, int: y);
}

// semmle-extractor-options: -std=c11
55 changes: 54 additions & 1 deletion cpp/ql/test/library-tests/ir/ir/raw_ir.expected
Original file line number Diff line number Diff line change
Expand Up @@ -2733,7 +2733,7 @@ destructors_for_temps.cpp:
# 102| v102_8(void) = ExitFunction :

generic.c:
# 1| void c11_generic_test(unsigned int, int)
# 1| void c11_generic_test_with_load(unsigned int, int)
# 1| Block 0
# 1| v1_1(void) = EnterFunction :
# 1| mu1_2(unknown) = AliasedDefinition :
Expand All @@ -2755,6 +2755,59 @@ generic.c:
# 1| v1_9(void) = AliasedUse : ~m?
# 1| v1_10(void) = ExitFunction :

# 12| char const* c11_generic_test_with_constant_and_macro()
# 12| Block 0
# 12| v12_1(void) = EnterFunction :
# 12| mu12_2(unknown) = AliasedDefinition :
# 12| mu12_3(unknown) = InitializeNonLocal :
# 14| r14_1(glval<int>) = VariableAddress[i] :
# 14| mu14_2(int) = Uninitialized[i] : &:r14_1
# 16| r16_1(glval<char *>) = VariableAddress[#return] :
# 16| r16_2(glval<char[4]>) = StringConstant[int] :
# 16| r16_3(char *) = Convert : r16_2
# 16| r16_4(char *) = Convert : r16_3
# 16| mu16_5(char *) = Store[#return] : &:r16_1, r16_4
# 12| r12_4(glval<char *>) = VariableAddress[#return] :
# 12| v12_5(void) = ReturnValue : &:r12_4, ~m?
# 12| v12_6(void) = AliasedUse : ~m?
# 12| v12_7(void) = ExitFunction :

# 19| char const* c11_generic_test_with_constant_and_no_macro()
# 19| Block 0
# 19| v19_1(void) = EnterFunction :
# 19| mu19_2(unknown) = AliasedDefinition :
# 19| mu19_3(unknown) = InitializeNonLocal :
# 21| r21_1(glval<int>) = VariableAddress[i] :
# 21| mu21_2(int) = Uninitialized[i] : &:r21_1
# 23| r23_1(glval<char *>) = VariableAddress[#return] :
# 23| r23_2(glval<char[4]>) = StringConstant["int"] :
# 23| r23_3(char *) = Convert : r23_2
# 23| r23_4(char *) = Convert : r23_3
# 23| mu23_5(char *) = Store[#return] : &:r23_1, r23_4
# 19| r19_4(glval<char *>) = VariableAddress[#return] :
# 19| v19_5(void) = ReturnValue : &:r19_4, ~m?
# 19| v19_6(void) = AliasedUse : ~m?
# 19| v19_7(void) = ExitFunction :

# 26| void c11_generic_test_test_with_cast(int)
# 26| Block 0
# 26| v26_1(void) = EnterFunction :
# 26| mu26_2(unknown) = AliasedDefinition :
# 26| mu26_3(unknown) = InitializeNonLocal :
# 26| r26_4(glval<int>) = VariableAddress[y] :
# 26| mu26_5(int) = InitializeParameter[y] : &:r26_4
# 27| r27_1(glval<unsigned int>) = VariableAddress[r] :
# 27| mu27_2(unsigned int) = Uninitialized[r] : &:r27_1
# 28| r28_1(glval<int>) = VariableAddress[y] :
# 28| r28_2(int) = Load[y] : &:r28_1, ~m?
# 28| r28_3(unsigned int) = Convert : r28_2
# 28| r28_4(glval<unsigned int>) = VariableAddress[r] :
# 28| mu28_5(unsigned int) = Store[r] : &:r28_4, r28_3
# 29| v29_1(void) = NoOp :
# 26| v26_6(void) = ReturnVoid :
# 26| v26_7(void) = AliasedUse : ~m?
# 26| v26_8(void) = ExitFunction :

ir.c:
# 7| void MyCoordsTest(int)
# 7| Block 0
Expand Down

0 comments on commit 30335ab

Please sign in to comment.