GCC Code Coverage Report


Directory: ../
File: src/typechecker/TypeCheckBuiltinFunctions.cpp
Date: 2025-05-08 21:00:15
Exec Total Coverage
Lines: 93 101 92.1%
Functions: 8 8 100.0%
Branches: 178 344 51.7%

Line Branch Exec Source
1 // Copyright (c) 2021-2025 ChilliBits. All rights reserved.
2
3 #include "TypeChecker.h"
4
5 #include <SourceFile.h>
6 #include <ast/ASTNodes.h>
7 #include <global/GlobalResourceManager.h>
8 #include <typechecker/MacroDefs.h>
9
10 namespace spice::compiler {
11
12 1584 std::any TypeChecker::visitBuiltinCall(BuiltinCallNode *node) {
13
2/2
✓ Branch 0 (2→3) taken 783 times.
✓ Branch 1 (2→4) taken 801 times.
1584 if (node->printfCall)
14 783 return visitPrintfCall(node->printfCall);
15
2/2
✓ Branch 0 (4→5) taken 127 times.
✓ Branch 1 (4→6) taken 674 times.
801 if (node->sizeofCall)
16 127 return visitSizeofCall(node->sizeofCall);
17
2/2
✓ Branch 0 (6→7) taken 11 times.
✓ Branch 1 (6→8) taken 663 times.
674 if (node->alignofCall)
18 11 return visitAlignofCall(node->alignofCall);
19
2/2
✓ Branch 0 (8→9) taken 2 times.
✓ Branch 1 (8→10) taken 661 times.
663 if (node->typeidCall)
20 2 return visitTypeidCall(node->typeidCall);
21
2/2
✓ Branch 0 (10→11) taken 50 times.
✓ Branch 1 (10→12) taken 611 times.
661 if (node->lenCall)
22 50 return visitLenCall(node->lenCall);
23
2/2
✓ Branch 0 (12→13) taken 610 times.
✓ Branch 1 (12→14) taken 1 times.
611 if (node->panicCall)
24 610 return visitPanicCall(node->panicCall);
25
1/2
✓ Branch 0 (14→15) taken 1 times.
✗ Branch 1 (14→16) not taken.
1 if (node->sysCall)
26 1 return visitSysCall(node->sysCall);
27 assert_fail("Unknown builtin call"); // LCOV_EXCL_LINE
28 return nullptr; // LCOV_EXCL_LINE
29 }
30
31 783 std::any TypeChecker::visitPrintfCall(PrintfCallNode *node) {
32 // Check if assignment types match placeholder types
33 783 size_t placeholderCount = 0;
34 783 size_t index = node->templatedString.find_first_of('%');
35
5/6
✓ Branch 0 (118→119) taken 664 times.
✓ Branch 1 (118→122) taken 761 times.
✓ Branch 2 (120→121) taken 664 times.
✗ Branch 3 (120→122) not taken.
✓ Branch 4 (123→3) taken 664 times.
✓ Branch 5 (123→124) taken 761 times.
1425 while (index != std::string::npos && index != node->templatedString.size() - 1) {
36 // Check if there is another assignExpr
37
2/2
✓ Branch 0 (4→5) taken 1 times.
✓ Branch 1 (4→15) taken 663 times.
664 if (node->args.size() <= placeholderCount)
38
4/8
✓ Branch 0 (7→8) taken 1 times.
✗ Branch 1 (7→144) not taken.
✓ Branch 2 (8→9) taken 1 times.
✗ Branch 3 (8→142) not taken.
✓ Branch 4 (11→12) taken 1 times.
✗ Branch 5 (11→148) not taken.
✓ Branch 6 (12→13) taken 1 times.
✗ Branch 7 (12→148) not taken.
3 SOFT_ERROR_ER(node, PRINTF_ARG_COUNT_ERROR, "The placeholder string contains more placeholders than arguments")
39
40 // Get next assignment
41
1/2
✓ Branch 0 (15→16) taken 663 times.
✗ Branch 1 (15→198) not taken.
663 AssignExprNode *assignment = node->args.at(placeholderCount);
42 // Visit assignment
43
2/4
✓ Branch 0 (16→17) taken 663 times.
✗ Branch 1 (16→151) not taken.
✓ Branch 2 (17→18) taken 663 times.
✗ Branch 3 (17→149) not taken.
663 QualType argType = std::any_cast<ExprResult>(visit(assignment)).type;
44
5/8
✓ Branch 0 (19→20) taken 663 times.
✗ Branch 1 (19→198) not taken.
✓ Branch 2 (20→21) taken 15 times.
✓ Branch 3 (20→25) taken 648 times.
✓ Branch 4 (21→22) taken 15 times.
✗ Branch 5 (21→153) not taken.
✓ Branch 6 (22→23) taken 15 times.
✗ Branch 7 (22→153) not taken.
663 HANDLE_UNRESOLVED_TYPE_ER(argType)
45
1/2
✓ Branch 0 (25→26) taken 648 times.
✗ Branch 1 (25→154) not taken.
648 argType = argType.removeReferenceWrapper();
46
47
6/8
✓ Branch 0 (26→27) taken 648 times.
✗ Branch 1 (26→198) not taken.
✓ Branch 2 (27→28) taken 17 times.
✓ Branch 3 (27→40) taken 337 times.
✓ Branch 4 (27→52) taken 54 times.
✓ Branch 5 (27→64) taken 235 times.
✓ Branch 6 (27→85) taken 5 times.
✗ Branch 7 (27→104) not taken.
648 switch (node->templatedString.at(index + 1)) {
48 17 case 'c': {
49
3/4
✓ Branch 0 (28→29) taken 17 times.
✗ Branch 1 (28→198) not taken.
✓ Branch 2 (29→30) taken 1 times.
✓ Branch 3 (29→39) taken 16 times.
17 if (!argType.is(TY_CHAR))
50
5/10
✓ Branch 0 (30→31) taken 1 times.
✗ Branch 1 (30→159) not taken.
✓ Branch 2 (31→32) taken 1 times.
✗ Branch 3 (31→157) not taken.
✓ Branch 4 (32→33) taken 1 times.
✗ Branch 5 (32→155) not taken.
✓ Branch 6 (35→36) taken 1 times.
✗ Branch 7 (35→161) not taken.
✓ Branch 8 (36→37) taken 1 times.
✗ Branch 9 (36→161) not taken.
1 SOFT_ERROR_ER(assignment, PRINTF_TYPE_ERROR, "The placeholder string expects char, but got " + argType.getName(false))
51 16 placeholderCount++;
52 16 break;
53 }
54 337 case 'd':
55 case 'i':
56 case 'l':
57 case 'o':
58 case 'u':
59 case 'x':
60 case 'X': {
61
3/4
✓ Branch 0 (40→41) taken 337 times.
✗ Branch 1 (40→162) not taken.
✓ Branch 2 (41→42) taken 2 times.
✓ Branch 3 (41→51) taken 335 times.
337 if (!argType.isOneOf({TY_INT, TY_SHORT, TY_LONG, TY_BYTE, TY_BOOL}))
62
5/10
✓ Branch 0 (42→43) taken 2 times.
✗ Branch 1 (42→167) not taken.
✓ Branch 2 (43→44) taken 2 times.
✗ Branch 3 (43→165) not taken.
✓ Branch 4 (44→45) taken 2 times.
✗ Branch 5 (44→163) not taken.
✓ Branch 6 (47→48) taken 2 times.
✗ Branch 7 (47→169) not taken.
✓ Branch 8 (48→49) taken 2 times.
✗ Branch 9 (48→169) not taken.
2 SOFT_ERROR_ER(assignment, PRINTF_TYPE_ERROR,
63 "The placeholder string expects int, short, long, byte or bool, but got " + argType.getName(false))
64 335 placeholderCount++;
65 335 break;
66 }
67 54 case 'a':
68 case 'A':
69 case 'f':
70 case 'F':
71 case 'e':
72 case 'E':
73 case 'g':
74 case 'G': {
75
3/4
✓ Branch 0 (52→53) taken 54 times.
✗ Branch 1 (52→198) not taken.
✓ Branch 2 (53→54) taken 1 times.
✓ Branch 3 (53→63) taken 53 times.
54 if (!argType.is(TY_DOUBLE))
76
5/10
✓ Branch 0 (54→55) taken 1 times.
✗ Branch 1 (54→174) not taken.
✓ Branch 2 (55→56) taken 1 times.
✗ Branch 3 (55→172) not taken.
✓ Branch 4 (56→57) taken 1 times.
✗ Branch 5 (56→170) not taken.
✓ Branch 6 (59→60) taken 1 times.
✗ Branch 7 (59→176) not taken.
✓ Branch 8 (60→61) taken 1 times.
✗ Branch 9 (60→176) not taken.
1 SOFT_ERROR_ER(assignment, PRINTF_TYPE_ERROR, "The placeholder string expects double, but got " + argType.getName(false))
77 53 placeholderCount++;
78 53 break;
79 }
80 235 case 's': {
81
13/18
✓ Branch 0 (64→65) taken 235 times.
✗ Branch 1 (64→198) not taken.
✓ Branch 2 (65→66) taken 60 times.
✓ Branch 3 (65→73) taken 175 times.
✓ Branch 4 (66→67) taken 60 times.
✗ Branch 5 (66→198) not taken.
✓ Branch 6 (67→68) taken 2 times.
✓ Branch 7 (67→73) taken 58 times.
✓ Branch 8 (68→69) taken 2 times.
✗ Branch 9 (68→198) not taken.
✓ Branch 10 (69→70) taken 1 times.
✓ Branch 11 (69→73) taken 1 times.
✓ Branch 12 (70→71) taken 1 times.
✗ Branch 13 (70→198) not taken.
✓ Branch 14 (71→72) taken 1 times.
✗ Branch 15 (71→73) not taken.
✓ Branch 16 (74→75) taken 1 times.
✓ Branch 17 (74→84) taken 234 times.
235 if (!argType.is(TY_STRING) && !argType.isStringObj() && !argType.isPtrTo(TY_CHAR) && !argType.isArrayOf(TY_CHAR))
82
5/10
✓ Branch 0 (75→76) taken 1 times.
✗ Branch 1 (75→181) not taken.
✓ Branch 2 (76→77) taken 1 times.
✗ Branch 3 (76→179) not taken.
✓ Branch 4 (77→78) taken 1 times.
✗ Branch 5 (77→177) not taken.
✓ Branch 6 (80→81) taken 1 times.
✗ Branch 7 (80→183) not taken.
✓ Branch 8 (81→82) taken 1 times.
✗ Branch 9 (81→183) not taken.
1 SOFT_ERROR_ER(assignment, PRINTF_TYPE_ERROR,
83 "The placeholder string expects string, String, char* or char[], but got " + argType.getName(false))
84 234 placeholderCount++;
85 234 break;
86 }
87 5 case 'p': {
88
9/14
✓ Branch 0 (85→86) taken 5 times.
✗ Branch 1 (85→198) not taken.
✓ Branch 2 (86→87) taken 1 times.
✓ Branch 3 (86→92) taken 4 times.
✓ Branch 4 (87→88) taken 1 times.
✗ Branch 5 (87→198) not taken.
✓ Branch 6 (88→89) taken 1 times.
✗ Branch 7 (88→92) not taken.
✓ Branch 8 (89→90) taken 1 times.
✗ Branch 9 (89→198) not taken.
✓ Branch 10 (90→91) taken 1 times.
✗ Branch 11 (90→92) not taken.
✓ Branch 12 (93→94) taken 1 times.
✓ Branch 13 (93→103) taken 4 times.
5 if (!argType.isPtr() && !argType.isArray() && !argType.is(TY_STRING))
89
5/10
✓ Branch 0 (94→95) taken 1 times.
✗ Branch 1 (94→188) not taken.
✓ Branch 2 (95→96) taken 1 times.
✗ Branch 3 (95→186) not taken.
✓ Branch 4 (96→97) taken 1 times.
✗ Branch 5 (96→184) not taken.
✓ Branch 6 (99→100) taken 1 times.
✗ Branch 7 (99→190) not taken.
✓ Branch 8 (100→101) taken 1 times.
✗ Branch 9 (100→190) not taken.
1 SOFT_ERROR_ER(assignment, PRINTF_TYPE_ERROR,
90 "The placeholder string expects pointer, array or string, but got " + argType.getName(false))
91 4 placeholderCount++;
92 4 break;
93 }
94 default:
95 SOFT_ERROR_ER(node, PRINTF_TYPE_ERROR, "The placeholder string contains an invalid placeholder")
96 }
97 642 index = node->templatedString.find_first_of('%', index + 2); // We can also skip the following char
98 }
99
100 // Check if the number of placeholders matches the number of args
101
2/2
✓ Branch 0 (125→126) taken 1 times.
✓ Branch 1 (125→136) taken 760 times.
761 if (placeholderCount < node->args.size())
102
4/8
✓ Branch 0 (128→129) taken 1 times.
✗ Branch 1 (128→201) not taken.
✓ Branch 2 (129→130) taken 1 times.
✗ Branch 3 (129→199) not taken.
✓ Branch 4 (132→133) taken 1 times.
✗ Branch 5 (132→205) not taken.
✓ Branch 6 (133→134) taken 1 times.
✗ Branch 7 (133→205) not taken.
3 SOFT_ERROR_ER(node, PRINTF_ARG_COUNT_ERROR, "The placeholder string contains less placeholders than arguments")
103
104
3/6
✓ Branch 0 (136→137) taken 760 times.
✗ Branch 1 (136→206) not taken.
✓ Branch 2 (137→138) taken 760 times.
✗ Branch 3 (137→206) not taken.
✓ Branch 4 (138→139) taken 760 times.
✗ Branch 5 (138→206) not taken.
760 return ExprResult{node->setEvaluatedSymbolType(QualType(TY_INT), manIdx)};
105 }
106
107 127 std::any TypeChecker::visitSizeofCall(SizeofCallNode *node) {
108
2/2
✓ Branch 0 (2→3) taken 111 times.
✓ Branch 1 (2→6) taken 16 times.
127 if (node->isType) { // Size of type
109
1/2
✓ Branch 0 (3→4) taken 111 times.
✗ Branch 1 (3→15) not taken.
111 visit(node->dataType);
110 } else { // Size of value
111
1/2
✓ Branch 0 (6→7) taken 16 times.
✗ Branch 1 (6→16) not taken.
16 visit(node->assignExpr);
112 }
113
114
3/6
✓ Branch 0 (9→10) taken 127 times.
✗ Branch 1 (9→17) not taken.
✓ Branch 2 (10→11) taken 127 times.
✗ Branch 3 (10→17) not taken.
✓ Branch 4 (11→12) taken 127 times.
✗ Branch 5 (11→17) not taken.
127 return ExprResult{node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx)};
115 }
116
117 11 std::any TypeChecker::visitAlignofCall(AlignofCallNode *node) {
118
2/2
✓ Branch 0 (2→3) taken 1 times.
✓ Branch 1 (2→6) taken 10 times.
11 if (node->isType) { // Align of type
119
1/2
✓ Branch 0 (3→4) taken 1 times.
✗ Branch 1 (3→15) not taken.
1 visit(node->dataType);
120 } else { // Align of value
121
1/2
✓ Branch 0 (6→7) taken 10 times.
✗ Branch 1 (6→16) not taken.
10 visit(node->assignExpr);
122 }
123
124
3/6
✓ Branch 0 (9→10) taken 11 times.
✗ Branch 1 (9→17) not taken.
✓ Branch 2 (10→11) taken 11 times.
✗ Branch 3 (10→17) not taken.
✓ Branch 4 (11→12) taken 11 times.
✗ Branch 5 (11→17) not taken.
11 return ExprResult{node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx)};
125 }
126
127 2 std::any TypeChecker::visitTypeidCall(TypeidCallNode *node) {
128
2/2
✓ Branch 0 (2→3) taken 1 times.
✓ Branch 1 (2→6) taken 1 times.
2 if (node->isType) { // Align of type
129
1/2
✓ Branch 0 (3→4) taken 1 times.
✗ Branch 1 (3→15) not taken.
1 visit(node->dataType);
130 } else { // Align of value
131
1/2
✓ Branch 0 (6→7) taken 1 times.
✗ Branch 1 (6→16) not taken.
1 visit(node->assignExpr);
132 }
133
134
3/6
✓ Branch 0 (9→10) taken 2 times.
✗ Branch 1 (9→17) not taken.
✓ Branch 2 (10→11) taken 2 times.
✗ Branch 3 (10→17) not taken.
✓ Branch 4 (11→12) taken 2 times.
✗ Branch 5 (11→17) not taken.
2 return ExprResult{node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx)};
135 }
136
137 50 std::any TypeChecker::visitLenCall(LenCallNode *node) {
138
2/4
✓ Branch 0 (2→3) taken 50 times.
✗ Branch 1 (2→48) not taken.
✓ Branch 2 (3→4) taken 50 times.
✗ Branch 3 (3→46) not taken.
50 QualType argType = std::any_cast<ExprResult>(visit(node->assignExpr)).type;
139
2/8
✓ Branch 0 (5→6) taken 50 times.
✗ Branch 1 (5→61) not taken.
✗ Branch 2 (6→7) not taken.
✓ Branch 3 (6→11) taken 50 times.
✗ Branch 4 (7→8) not taken.
✗ Branch 5 (7→50) not taken.
✗ Branch 6 (8→9) not taken.
✗ Branch 7 (8→50) not taken.
50 HANDLE_UNRESOLVED_TYPE_ER(argType)
140
1/2
✓ Branch 0 (11→12) taken 50 times.
✗ Branch 1 (11→51) not taken.
50 argType = argType.removeReferenceWrapper();
141
142 // Check if arg is of type array
143
8/10
✓ Branch 0 (12→13) taken 50 times.
✗ Branch 1 (12→61) not taken.
✓ Branch 2 (13→14) taken 26 times.
✓ Branch 3 (13→17) taken 24 times.
✓ Branch 4 (14→15) taken 26 times.
✗ Branch 5 (14→61) not taken.
✓ Branch 6 (15→16) taken 1 times.
✓ Branch 7 (15→17) taken 25 times.
✓ Branch 8 (18→19) taken 1 times.
✓ Branch 9 (18→29) taken 49 times.
50 if (!argType.isArray() && !argType.is(TY_STRING))
144
4/8
✓ Branch 0 (21→22) taken 1 times.
✗ Branch 1 (21→54) not taken.
✓ Branch 2 (22→23) taken 1 times.
✗ Branch 3 (22→52) not taken.
✓ Branch 4 (25→26) taken 1 times.
✗ Branch 5 (25→58) not taken.
✓ Branch 6 (26→27) taken 1 times.
✗ Branch 7 (26→58) not taken.
3 SOFT_ERROR_ER(node->assignExpr, EXPECTED_ARRAY_TYPE, "The len builtin can only work on arrays or strings")
145
146 // If we want to use the len builtin on a string, we need to import the string runtime module
147
8/10
✓ Branch 0 (29→30) taken 49 times.
✗ Branch 1 (29→61) not taken.
✓ Branch 2 (30→31) taken 25 times.
✓ Branch 3 (30→36) taken 24 times.
✓ Branch 4 (31→32) taken 25 times.
✗ Branch 5 (31→61) not taken.
✓ Branch 6 (34→35) taken 24 times.
✓ Branch 7 (34→36) taken 1 times.
✓ Branch 8 (37→38) taken 24 times.
✓ Branch 9 (37→39) taken 25 times.
74 if (argType.is(TY_STRING) && !sourceFile->isStringRT())
148
1/2
✓ Branch 0 (38→39) taken 24 times.
✗ Branch 1 (38→61) not taken.
24 sourceFile->requestRuntimeModule(STRING_RT);
149
150
3/6
✓ Branch 0 (39→40) taken 49 times.
✗ Branch 1 (39→59) not taken.
✓ Branch 2 (40→41) taken 49 times.
✗ Branch 3 (40→59) not taken.
✓ Branch 4 (41→42) taken 49 times.
✗ Branch 5 (41→59) not taken.
49 return ExprResult{node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx)};
151 }
152
153 610 std::any TypeChecker::visitPanicCall(PanicCallNode *node) {
154
2/4
✓ Branch 0 (2→3) taken 610 times.
✗ Branch 1 (2→33) not taken.
✓ Branch 2 (3→4) taken 610 times.
✗ Branch 3 (3→31) not taken.
610 QualType argType = std::any_cast<ExprResult>(visit(node->assignExpr)).type;
155
2/8
✓ Branch 0 (5→6) taken 610 times.
✗ Branch 1 (5→46) not taken.
✗ Branch 2 (6→7) not taken.
✓ Branch 3 (6→11) taken 610 times.
✗ Branch 4 (7→8) not taken.
✗ Branch 5 (7→35) not taken.
✗ Branch 6 (8→9) not taken.
✗ Branch 7 (8→35) not taken.
610 HANDLE_UNRESOLVED_TYPE_ER(argType)
156
1/2
✓ Branch 0 (11→12) taken 610 times.
✗ Branch 1 (11→36) not taken.
610 argType = argType.removeReferenceWrapper();
157
158 // Check if arg is of type array
159
2/4
✓ Branch 0 (12→13) taken 610 times.
✗ Branch 1 (12→46) not taken.
✗ Branch 2 (13→14) not taken.
✓ Branch 3 (13→24) taken 610 times.
610 if (!argType.isErrorObj())
160 SOFT_ERROR_ER(node->assignExpr, EXPECTED_ERROR_TYPE, "The panic builtin can only work with errors")
161
162
3/6
✓ Branch 0 (24→25) taken 610 times.
✗ Branch 1 (24→44) not taken.
✓ Branch 2 (25→26) taken 610 times.
✗ Branch 3 (25→44) not taken.
✓ Branch 4 (26→27) taken 610 times.
✗ Branch 5 (26→44) not taken.
610 return ExprResult{node->setEvaluatedSymbolType(QualType(TY_DYN), manIdx)};
163 }
164
165 1 std::any TypeChecker::visitSysCall(SysCallNode *node) {
166 // Check if the syscall number if of type short
167
2/4
✓ Branch 0 (3→4) taken 1 times.
✗ Branch 1 (3→62) not taken.
✓ Branch 2 (4→5) taken 1 times.
✗ Branch 3 (4→60) not taken.
1 const QualType sysCallNumberType = std::any_cast<ExprResult>(visit(node->args.front())).type;
168
2/4
✓ Branch 0 (6→7) taken 1 times.
✗ Branch 1 (6→88) not taken.
✗ Branch 2 (7→8) not taken.
✓ Branch 3 (7→19) taken 1 times.
1 if (!sysCallNumberType.is(TY_SHORT))
169 SOFT_ERROR_ER(node->args.front(), INVALID_SYSCALL_NUMBER_TYPE, "Syscall number must be of type short")
170
171 // Check if the syscall number is out of range
172 // According to https://www.chromium.org/chromium-os/developer-library/reference/linux-constants/syscalls/
173
2/4
✓ Branch 0 (19→20) taken 1 times.
✗ Branch 1 (19→88) not taken.
✗ Branch 2 (20→21) not taken.
✓ Branch 3 (20→33) taken 1 times.
1 if (node->hasCompileTimeValue()) {
174 const unsigned short sysCallNumber = node->getCompileTimeValue().shortValue;
175 if (sysCallNumber < 0 || sysCallNumber > 439)
176 SOFT_ERROR_ER(node, SYSCALL_NUMBER_OUT_OF_RANGE, "Only syscall numbers between 0 and 439 are supported")
177 }
178
179 // Check if too many syscall args are given
180 // According to https://www.chromium.org/chromium-os/developer-library/reference/linux-constants/syscalls/
181
1/2
✗ Branch 0 (34→35) not taken.
✓ Branch 1 (34→46) taken 1 times.
1 if (node->args.size() > 6)
182 SOFT_ERROR_ER(node->args.front(), TOO_MANY_SYSCALL_ARGS, "There are no syscalls that support more than 6 arguments")
183
184 // Visit children
185
2/2
✓ Branch 0 (52→47) taken 3 times.
✓ Branch 1 (52→53) taken 1 times.
4 for (size_t i = 1; i < node->args.size(); i++)
186
2/4
✓ Branch 0 (47→48) taken 3 times.
✗ Branch 1 (47→85) not taken.
✓ Branch 2 (48→49) taken 3 times.
✗ Branch 3 (48→85) not taken.
3 visit(node->args.at(i));
187
188
3/6
✓ Branch 0 (53→54) taken 1 times.
✗ Branch 1 (53→86) not taken.
✓ Branch 2 (54→55) taken 1 times.
✗ Branch 3 (54→86) not taken.
✓ Branch 4 (55→56) taken 1 times.
✗ Branch 5 (55→86) not taken.
1 return ExprResult{node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx)};
189 }
190
191 } // namespace spice::compiler
192