GCC Code Coverage Report


Directory: ../
File: src/typechecker/TypeCheckMeta.cpp
Date: 2025-06-14 23:29:02
Exec Total Coverage
Lines: 228 250 91.2%
Functions: 7 7 100.0%
Branches: 372 721 51.6%

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 14015 std::any TypeChecker::visitParamLst(ParamLstNode *node) {
13 14015 NamedParamList namedParams;
14 14015 bool metOptional = false;
15
16
2/2
✓ Branch 0 (32→4) taken 21833 times.
✓ Branch 1 (32→33) taken 14015 times.
35848 for (DeclStmtNode *param : node->params) {
17 // Visit param
18
2/4
✓ Branch 0 (5→6) taken 21833 times.
✗ Branch 1 (5→40) not taken.
✓ Branch 2 (6→7) taken 21833 times.
✗ Branch 3 (6→38) not taken.
21833 const auto paramType = std::any_cast<QualType>(visit(param));
19
20 // Check if the type could be inferred. Dyn without a default value is forbidden
21
3/4
✓ Branch 0 (8→9) taken 21833 times.
✗ Branch 1 (8→54) not taken.
✓ Branch 2 (9→10) taken 3 times.
✓ Branch 3 (9→16) taken 21830 times.
21833 if (paramType.is(TY_DYN)) {
22
3/6
✓ Branch 0 (10→11) taken 3 times.
✗ Branch 1 (10→45) not taken.
✓ Branch 2 (11→12) taken 3 times.
✗ Branch 3 (11→43) not taken.
✓ Branch 4 (12→13) taken 3 times.
✗ Branch 5 (12→41) not taken.
3 softError(node, FCT_PARAM_IS_TYPE_DYN, "Type of parameter '" + param->varName + "' is invalid");
23 9 continue;
24 }
25
26 // Ensure that no optional param comes after a mandatory param
27
2/2
✓ Branch 0 (16→17) taken 2309 times.
✓ Branch 1 (16→18) taken 19521 times.
21830 if (param->hasAssignment) {
28 2309 metOptional = true;
29
2/2
✓ Branch 0 (18→19) taken 6 times.
✓ Branch 1 (18→26) taken 19515 times.
19521 } else if (metOptional) {
30
2/4
✓ Branch 0 (21→22) taken 6 times.
✗ Branch 1 (21→49) not taken.
✓ Branch 2 (22→23) taken 6 times.
✗ Branch 3 (22→47) not taken.
6 softError(param, INVALID_PARAM_ORDER, "Mandatory parameters must go before any optional parameters");
31 6 continue;
32 }
33
34 // Add parameter to named param list
35
1/2
✓ Branch 0 (27→28) taken 21824 times.
✗ Branch 1 (27→53) not taken.
21824 namedParams.push_back({param->varName.c_str(), paramType, metOptional});
36 }
37
38
1/2
✓ Branch 0 (33→34) taken 14015 times.
✗ Branch 1 (33→56) not taken.
28030 return namedParams;
39 14015 }
40
41 1312 std::any TypeChecker::visitField(FieldNode *node) {
42
2/4
✓ Branch 0 (2→3) taken 1312 times.
✗ Branch 1 (2→37) not taken.
✓ Branch 2 (3→4) taken 1312 times.
✗ Branch 3 (3→35) not taken.
1312 auto fieldType = std::any_cast<QualType>(visit(node->dataType));
43
4/6
✓ Branch 0 (5→6) taken 1312 times.
✗ Branch 1 (5→50) not taken.
✓ Branch 2 (6→7) taken 1 times.
✓ Branch 3 (6→9) taken 1311 times.
✓ Branch 4 (7→8) taken 1 times.
✗ Branch 5 (7→50) not taken.
1312 HANDLE_UNRESOLVED_TYPE_QT(fieldType)
44
45
2/2
✓ Branch 0 (9→10) taken 176 times.
✓ Branch 1 (9→31) taken 1135 times.
1311 if (TernaryExprNode *defaultValueNode = node->defaultValue) {
46
2/4
✓ Branch 0 (10→11) taken 176 times.
✗ Branch 1 (10→40) not taken.
✓ Branch 2 (11→12) taken 176 times.
✗ Branch 3 (11→38) not taken.
176 const QualType defaultValueType = std::any_cast<ExprResult>(visit(defaultValueNode)).type;
47
2/6
✓ Branch 0 (13→14) taken 176 times.
✗ Branch 1 (13→49) not taken.
✗ Branch 2 (14→15) not taken.
✓ Branch 3 (14→17) taken 176 times.
✗ Branch 4 (15→16) not taken.
✗ Branch 5 (15→49) not taken.
177 HANDLE_UNRESOLVED_TYPE_QT(defaultValueType)
48
3/4
✓ Branch 0 (17→18) taken 176 times.
✗ Branch 1 (17→49) not taken.
✓ Branch 2 (18→19) taken 1 times.
✓ Branch 3 (18→29) taken 175 times.
176 if (!fieldType.matches(defaultValueType, false, true, true))
49
4/8
✓ Branch 0 (21→22) taken 1 times.
✗ Branch 1 (21→44) not taken.
✓ Branch 2 (22→23) taken 1 times.
✗ Branch 3 (22→42) not taken.
✓ Branch 4 (25→26) taken 1 times.
✗ Branch 5 (25→48) not taken.
✓ Branch 6 (26→27) taken 1 times.
✗ Branch 7 (26→48) not taken.
3 SOFT_ERROR_QT(node, FIELD_TYPE_NOT_MATCHING, "Type of the default values does not match the field type")
50 }
51
52
1/2
✓ Branch 0 (31→32) taken 1310 times.
✗ Branch 1 (31→50) not taken.
1310 return fieldType;
53 }
54
55 192 std::any TypeChecker::visitSignature(SignatureNode *node) {
56 192 const bool isFunction = node->signatureType == SignatureNode::SignatureType::TYPE_FUNCTION;
57
58 // Retrieve function template types
59 192 std::vector<GenericType> usedGenericTypes;
60
2/2
✓ Branch 0 (2→3) taken 96 times.
✓ Branch 1 (2→33) taken 96 times.
192 if (node->hasTemplateTypes) {
61
2/2
✓ Branch 0 (31→5) taken 96 times.
✓ Branch 1 (31→32) taken 95 times.
191 for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) {
62 // Visit template type
63
2/4
✓ Branch 0 (6→7) taken 96 times.
✗ Branch 1 (6→108) not taken.
✓ Branch 2 (7→8) taken 96 times.
✗ Branch 3 (7→106) not taken.
96 auto templateType = std::any_cast<QualType>(visit(dataType));
64
2/4
✓ Branch 0 (9→10) taken 96 times.
✗ Branch 1 (9→117) not taken.
✗ Branch 2 (10→11) not taken.
✓ Branch 3 (10→13) taken 96 times.
96 if (templateType.is(TY_UNRESOLVED))
65 return static_cast<std::vector<Function *> *>(nullptr);
66 // Check if it is a generic type
67
3/4
✓ Branch 0 (13→14) taken 96 times.
✗ Branch 1 (13→117) not taken.
✓ Branch 2 (14→15) taken 1 times.
✓ Branch 3 (14→23) taken 95 times.
96 if (!templateType.is(TY_GENERIC)) {
68
2/4
✓ Branch 0 (17→18) taken 1 times.
✗ Branch 1 (17→112) not taken.
✓ Branch 2 (18→19) taken 1 times.
✗ Branch 3 (18→110) not taken.
1 softError(dataType, EXPECTED_GENERIC_TYPE, "A template list can only contain generic types");
69
1/2
✓ Branch 0 (21→22) taken 1 times.
✗ Branch 1 (21→116) not taken.
1 return static_cast<std::vector<Function *> *>(nullptr);
70 }
71 // Convert generic symbol type to generic type
72
2/4
✓ Branch 0 (23→24) taken 95 times.
✗ Branch 1 (23→117) not taken.
✓ Branch 2 (24→25) taken 95 times.
✗ Branch 3 (24→117) not taken.
95 const GenericType *genericType = rootScope->lookupGenericTypeStrict(templateType.getSubType());
73
1/2
✗ Branch 0 (25→26) not taken.
✓ Branch 1 (25→27) taken 95 times.
95 assert(genericType != nullptr);
74
1/2
✓ Branch 0 (27→28) taken 95 times.
✗ Branch 1 (27→117) not taken.
95 usedGenericTypes.push_back(*genericType);
75 }
76 }
77
78 // Visit return type
79
1/2
✓ Branch 0 (33→34) taken 191 times.
✗ Branch 1 (33→159) not taken.
191 QualType returnType(TY_DYN);
80
2/2
✓ Branch 0 (34→35) taken 149 times.
✓ Branch 1 (34→51) taken 42 times.
191 if (isFunction) {
81
2/4
✓ Branch 0 (35→36) taken 149 times.
✗ Branch 1 (35→121) not taken.
✓ Branch 2 (36→37) taken 149 times.
✗ Branch 3 (36→119) not taken.
149 returnType = std::any_cast<QualType>(visit(node->returnType));
82
2/4
✓ Branch 0 (38→39) taken 149 times.
✗ Branch 1 (38→159) not taken.
✗ Branch 2 (39→40) not taken.
✓ Branch 3 (39→42) taken 149 times.
149 if (returnType.is(TY_UNRESOLVED))
83 return static_cast<std::vector<Function *> *>(nullptr);
84
85
3/4
✓ Branch 0 (42→43) taken 149 times.
✗ Branch 1 (42→159) not taken.
✓ Branch 2 (43→44) taken 1 times.
✓ Branch 3 (43→51) taken 148 times.
149 if (!returnType.isCoveredByGenericTypeList(usedGenericTypes))
86
2/4
✓ Branch 0 (46→47) taken 1 times.
✗ Branch 1 (46→126) not taken.
✓ Branch 2 (47→48) taken 1 times.
✗ Branch 3 (47→124) not taken.
2 softError(node->returnType, GENERIC_TYPE_NOT_IN_TEMPLATE,
87 "Generic return type not included in the template type list of the function");
88 }
89
90 // Visit params
91 191 QualTypeList paramTypes;
92 191 ParamList paramList;
93
2/2
✓ Branch 0 (51→52) taken 8 times.
✓ Branch 1 (51→80) taken 183 times.
191 if (node->hasParams) {
94
1/2
✓ Branch 0 (53→54) taken 8 times.
✗ Branch 1 (53→155) not taken.
8 paramList.reserve(node->paramTypeLst->dataTypes.size());
95
2/2
✓ Branch 0 (78→56) taken 10 times.
✓ Branch 1 (78→79) taken 8 times.
18 for (DataTypeNode *param : node->paramTypeLst->dataTypes) {
96
2/4
✓ Branch 0 (57→58) taken 10 times.
✗ Branch 1 (57→132) not taken.
✓ Branch 2 (58→59) taken 10 times.
✗ Branch 3 (58→130) not taken.
10 auto paramType = std::any_cast<QualType>(visit(param));
97
2/4
✓ Branch 0 (60→61) taken 10 times.
✗ Branch 1 (60→141) not taken.
✗ Branch 2 (61→62) not taken.
✓ Branch 3 (61→64) taken 10 times.
10 if (paramType.is(TY_UNRESOLVED))
98 return static_cast<std::vector<Function *> *>(nullptr);
99
100 // Check if the type is present in the template for generic types
101
3/4
✓ Branch 0 (64→65) taken 10 times.
✗ Branch 1 (64→141) not taken.
✓ Branch 2 (65→66) taken 2 times.
✓ Branch 3 (65→73) taken 8 times.
10 if (!paramType.isCoveredByGenericTypeList(usedGenericTypes)) {
102
2/4
✓ Branch 0 (68→69) taken 2 times.
✗ Branch 1 (68→136) not taken.
✓ Branch 2 (69→70) taken 2 times.
✗ Branch 3 (69→134) not taken.
2 softError(node->paramTypeLst, GENERIC_TYPE_NOT_IN_TEMPLATE,
103 "Generic param type not included in the template type list of the function");
104 2 continue;
105 }
106
107
1/2
✓ Branch 0 (73→74) taken 8 times.
✗ Branch 1 (73→141) not taken.
8 paramTypes.push_back(paramType);
108
1/2
✓ Branch 0 (74→75) taken 8 times.
✗ Branch 1 (74→140) not taken.
8 paramList.push_back({paramType, false});
109 }
110 }
111
112 // Build signature object
113
4/8
✓ Branch 0 (80→81) taken 191 times.
✗ Branch 1 (80→150) not taken.
✓ Branch 2 (81→82) taken 191 times.
✗ Branch 3 (81→147) not taken.
✓ Branch 4 (82→83) taken 191 times.
✗ Branch 5 (82→144) not taken.
✓ Branch 6 (83→84) taken 191 times.
✗ Branch 7 (83→143) not taken.
191 const Function signature(node->methodName, nullptr, QualType(TY_DYN), returnType, paramList, usedGenericTypes, node);
114
115 // Add signature to current scope
116
1/2
✓ Branch 0 (88→89) taken 191 times.
✗ Branch 1 (88→153) not taken.
191 Function *manifestation = FunctionManager::insert(currentScope, signature, &node->signatureManifestations);
117 191 manifestation->entry = node->entry;
118 191 manifestation->used = true;
119
120 // Prepare signature type
121
2/2
✓ Branch 0 (89→90) taken 149 times.
✓ Branch 1 (89→91) taken 42 times.
191 const SuperType superType = isFunction ? TY_FUNCTION : TY_PROCEDURE;
122
2/4
✓ Branch 0 (92→93) taken 191 times.
✗ Branch 1 (92→151) not taken.
✓ Branch 2 (93→94) taken 191 times.
✗ Branch 3 (93→151) not taken.
191 QualType signatureType = QualType(superType).getWithFunctionParamAndReturnTypes(returnType, paramTypes);
123 191 signatureType.setQualifiers(node->signatureQualifiers);
124
125 // Set entry to signature type
126
1/2
✗ Branch 0 (95→96) not taken.
✓ Branch 1 (95→97) taken 191 times.
191 assert(node->entry != nullptr);
127
1/2
✓ Branch 0 (97→98) taken 191 times.
✗ Branch 1 (97→153) not taken.
191 node->entry->updateType(signatureType, false);
128 191 node->entry->used = true;
129
130
1/2
✓ Branch 0 (98→99) taken 191 times.
✗ Branch 1 (98→152) not taken.
191 return &node->signatureManifestations;
131 192 }
132
133 50773 std::any TypeChecker::visitDataType(DataTypeNode *node) {
134 // Visit base data type
135
2/4
✓ Branch 0 (2→3) taken 50773 times.
✗ Branch 1 (2→219) not taken.
✓ Branch 2 (3→4) taken 50773 times.
✗ Branch 3 (3→217) not taken.
50773 auto type = std::any_cast<QualType>(visit(node->baseDataType));
136
4/6
✓ Branch 0 (5→6) taken 50773 times.
✗ Branch 1 (5→320) not taken.
✓ Branch 2 (6→7) taken 3 times.
✓ Branch 3 (6→9) taken 50770 times.
✓ Branch 4 (7→8) taken 3 times.
✗ Branch 5 (7→320) not taken.
50773 HANDLE_UNRESOLVED_TYPE_QT(type)
137
138
1/2
✓ Branch 0 (9→10) taken 50770 times.
✗ Branch 1 (9→320) not taken.
50770 std::queue<DataTypeNode::TypeModifier> tmQueue = node->tmQueue;
139
2/2
✓ Branch 0 (108→11) taken 12505 times.
✓ Branch 1 (108→109) taken 50763 times.
63268 while (!tmQueue.empty()) {
140
1/2
✓ Branch 0 (12→13) taken 12505 times.
✗ Branch 1 (12→269) not taken.
12505 auto [modifierType, hasSize, hardcodedSize, sizeVarName] = tmQueue.front();
141
142 // Only the outermost array can have an unknown size
143
8/10
✓ Branch 0 (13→14) taken 12505 times.
✗ Branch 1 (13→267) not taken.
✓ Branch 2 (14→15) taken 41 times.
✓ Branch 3 (14→18) taken 12464 times.
✓ Branch 4 (15→16) taken 41 times.
✗ Branch 5 (15→267) not taken.
✓ Branch 6 (16→17) taken 1 times.
✓ Branch 7 (16→18) taken 40 times.
✓ Branch 8 (19→20) taken 1 times.
✓ Branch 9 (19→30) taken 12504 times.
12505 if (type.isArray() && type.getArraySize() == ARRAY_SIZE_UNKNOWN)
144
4/8
✓ Branch 0 (22→23) taken 1 times.
✗ Branch 1 (22→222) not taken.
✓ Branch 2 (23→24) taken 1 times.
✗ Branch 3 (23→220) not taken.
✓ Branch 4 (26→27) taken 1 times.
✗ Branch 5 (26→226) not taken.
✓ Branch 6 (27→28) taken 1 times.
✗ Branch 7 (27→226) not taken.
3 SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID,
145 "Usage of incomplete array type. Only the outermost array type may have unknown size")
146
147
3/4
✓ Branch 0 (30→31) taken 5407 times.
✓ Branch 1 (30→33) taken 6948 times.
✓ Branch 2 (30→35) taken 149 times.
✗ Branch 3 (30→92) not taken.
12504 switch (modifierType) {
148 5407 case DataTypeNode::TypeModifierType::TYPE_PTR: {
149
2/2
✓ Branch 0 (31→32) taken 5405 times.
✓ Branch 1 (31→227) taken 2 times.
5407 type = type.toPtr(node);
150 5405 break;
151 }
152 6948 case DataTypeNode::TypeModifierType::TYPE_REF: {
153
1/2
✓ Branch 0 (33→34) taken 6948 times.
✗ Branch 1 (33→228) not taken.
6948 type = type.toRef(node);
154 6948 break;
155 }
156 149 case DataTypeNode::TypeModifierType::TYPE_ARRAY: {
157 149 const std::string &varName = sizeVarName;
158
2/2
✓ Branch 0 (36→37) taken 35 times.
✓ Branch 1 (36→78) taken 114 times.
149 if (!varName.empty()) {
159
1/2
✓ Branch 0 (37→38) taken 35 times.
✗ Branch 1 (37→267) not taken.
35 const SymbolTableEntry *globalVar = rootScope->lookupStrict(varName);
160
2/2
✓ Branch 0 (40→41) taken 1 times.
✓ Branch 1 (40→50) taken 34 times.
35 if (!globalVar)
161
5/10
✓ Branch 0 (41→42) taken 1 times.
✗ Branch 1 (41→233) not taken.
✓ Branch 2 (42→43) taken 1 times.
✗ Branch 3 (42→231) not taken.
✓ Branch 4 (43→44) taken 1 times.
✗ Branch 5 (43→229) not taken.
✓ Branch 6 (46→47) taken 1 times.
✗ Branch 7 (46→235) not taken.
✓ Branch 8 (47→48) taken 1 times.
✗ Branch 9 (47→235) not taken.
1 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_VARIABLE, "Could not find global variable '" + varName + "' ")
162
4/6
✓ Branch 0 (50→51) taken 34 times.
✗ Branch 1 (50→267) not taken.
✓ Branch 2 (51→52) taken 34 times.
✗ Branch 3 (51→267) not taken.
✓ Branch 4 (52→53) taken 1 times.
✓ Branch 5 (52→63) taken 33 times.
34 if (!globalVar->getQualType().isConst())
163
4/8
✓ Branch 0 (55→56) taken 1 times.
✗ Branch 1 (55→238) not taken.
✓ Branch 2 (56→57) taken 1 times.
✗ Branch 3 (56→236) not taken.
✓ Branch 4 (59→60) taken 1 times.
✗ Branch 5 (59→242) not taken.
✓ Branch 6 (60→61) taken 1 times.
✗ Branch 7 (60→242) not taken.
3 SOFT_ERROR_QT(node, EXPECTED_CONST_VARIABLE, "The size of the array must be known at compile time")
164
4/6
✓ Branch 0 (63→64) taken 33 times.
✗ Branch 1 (63→267) not taken.
✓ Branch 2 (64→65) taken 33 times.
✗ Branch 3 (64→267) not taken.
✓ Branch 4 (65→66) taken 1 times.
✓ Branch 5 (65→76) taken 32 times.
33 if (!globalVar->getQualType().is(TY_INT))
165
4/8
✓ Branch 0 (68→69) taken 1 times.
✗ Branch 1 (68→245) not taken.
✓ Branch 2 (69→70) taken 1 times.
✗ Branch 3 (69→243) not taken.
✓ Branch 4 (72→73) taken 1 times.
✗ Branch 5 (72→249) not taken.
✓ Branch 6 (73→74) taken 1 times.
✗ Branch 7 (73→249) not taken.
3 SOFT_ERROR_QT(node, OPERATOR_WRONG_DATA_TYPE, "Expected variable of type int")
166
1/2
✓ Branch 0 (76→77) taken 32 times.
✗ Branch 1 (76→267) not taken.
32 hardcodedSize = globalVar->declNode->getCompileTimeValue().intValue;
167 }
168
169
3/4
✓ Branch 0 (78→79) taken 91 times.
✓ Branch 1 (78→90) taken 55 times.
✗ Branch 2 (79→80) not taken.
✓ Branch 3 (79→90) taken 91 times.
146 if (hasSize && hardcodedSize <= 1)
170 SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID, "The size of an array must be > 1 and explicitly stated")
171
2/2
✓ Branch 0 (90→91) taken 145 times.
✓ Branch 1 (90→257) taken 1 times.
146 type = type.toArr(node, hardcodedSize);
172 145 break;
173 }
174 default: // GCOV_EXCL_LINE
175 throw CompilerError(UNHANDLED_BRANCH, "Modifier type fall-through"); // GCOV_EXCL_LINE
176 }
177 12498 tmQueue.pop();
178
2/2
✓ Branch 0 (103→104) taken 12498 times.
✓ Branch 1 (103→106) taken 4 times.
12505 }
179
180 // Attach the qualifiers to the type
181
2/2
✓ Branch 0 (109→110) taken 21299 times.
✓ Branch 1 (109→210) taken 29464 times.
50763 if (node->qualifierLst) {
182
1/2
✓ Branch 0 (110→111) taken 21299 times.
✗ Branch 1 (110→316) not taken.
21299 const QualType baseType = type.getBase();
183
2/2
✓ Branch 0 (207→113) taken 24971 times.
✓ Branch 1 (207→208) taken 21297 times.
46268 for (const QualifierNode *qualifier : node->qualifierLst->qualifiers) {
184
2/2
✓ Branch 0 (114→115) taken 10143 times.
✓ Branch 1 (114→117) taken 14828 times.
24971 if (qualifier->type == QualifierNode::QualifierType::TY_CONST) {
185 10143 type.getQualifiers().isConst = true;
186
2/2
✓ Branch 0 (117→118) taken 2 times.
✓ Branch 1 (117→132) taken 14826 times.
14828 } else if (qualifier->type == QualifierNode::QualifierType::TY_SIGNED) {
187
2/4
✓ Branch 0 (118→119) taken 2 times.
✗ Branch 1 (118→270) not taken.
✗ Branch 2 (119→120) not taken.
✓ Branch 3 (119→129) taken 2 times.
2 if (!baseType.isOneOf({TY_INT, TY_LONG, TY_SHORT, TY_BYTE, TY_CHAR, TY_GENERIC}))
188 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "Cannot use this qualifier on type " + baseType.getName(false))
189 2 type.getQualifiers().isSigned = true;
190 2 type.getQualifiers().isUnsigned = false;
191
2/2
✓ Branch 0 (132→133) taken 10324 times.
✓ Branch 1 (132→147) taken 4502 times.
14826 } else if (qualifier->type == QualifierNode::QualifierType::TY_UNSIGNED) {
192
2/4
✓ Branch 0 (133→134) taken 10324 times.
✗ Branch 1 (133→278) not taken.
✗ Branch 2 (134→135) not taken.
✓ Branch 3 (134→144) taken 10324 times.
10324 if (!baseType.isOneOf({TY_INT, TY_LONG, TY_SHORT, TY_BYTE, TY_CHAR, TY_GENERIC}))
193 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "Cannot use this qualifier on type " + baseType.getName(false))
194 10324 type.getQualifiers().isSigned = false;
195 10324 type.getQualifiers().isUnsigned = true;
196
2/2
✓ Branch 0 (147→148) taken 3632 times.
✓ Branch 1 (147→162) taken 870 times.
4502 } else if (qualifier->type == QualifierNode::QualifierType::TY_HEAP) {
197 // Heap variables can only be pointers
198
4/6
✓ Branch 0 (148→149) taken 3632 times.
✗ Branch 1 (148→287) not taken.
✓ Branch 2 (149→150) taken 3632 times.
✗ Branch 3 (149→286) not taken.
✓ Branch 4 (150→151) taken 1 times.
✓ Branch 5 (150→160) taken 3631 times.
3632 if (!type.removeReferenceWrapper().isOneOf({TY_PTR, TY_ARRAY, TY_STRING}))
199
5/10
✓ Branch 0 (151→152) taken 1 times.
✗ Branch 1 (151→292) not taken.
✓ Branch 2 (152→153) taken 1 times.
✗ Branch 3 (152→290) not taken.
✓ Branch 4 (153→154) taken 1 times.
✗ Branch 5 (153→288) not taken.
✓ Branch 6 (156→157) taken 1 times.
✗ Branch 7 (156→294) not taken.
✓ Branch 8 (157→158) taken 1 times.
✗ Branch 9 (157→294) not taken.
1 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT,
200 "The heap qualifier can only be applied to symbols of pointer type, you provided " +
201 baseType.getName(false))
202
203 3631 type.getQualifiers().isHeap = true;
204
3/4
✓ Branch 0 (162→163) taken 7 times.
✓ Branch 1 (162→178) taken 863 times.
✓ Branch 2 (163→164) taken 7 times.
✗ Branch 3 (163→178) not taken.
870 } else if (qualifier->type == QualifierNode::QualifierType::TY_COMPOSITION && node->isFieldType) {
205
3/4
✓ Branch 0 (164→165) taken 7 times.
✗ Branch 1 (164→315) not taken.
✓ Branch 2 (165→166) taken 1 times.
✓ Branch 3 (165→176) taken 6 times.
7 if (!type.is(TY_STRUCT))
206
4/8
✓ Branch 0 (168→169) taken 1 times.
✗ Branch 1 (168→297) not taken.
✓ Branch 2 (169→170) taken 1 times.
✗ Branch 3 (169→295) not taken.
✓ Branch 4 (172→173) taken 1 times.
✗ Branch 5 (172→301) not taken.
✓ Branch 6 (173→174) taken 1 times.
✗ Branch 7 (173→301) not taken.
3 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "The compose qualifier can only be used on plain struct fields")
207 6 type.getQualifiers().isComposition = true;
208
4/6
✓ Branch 0 (178→179) taken 863 times.
✗ Branch 1 (178→183) not taken.
✓ Branch 2 (179→180) taken 653 times.
✓ Branch 3 (179→181) taken 210 times.
✓ Branch 4 (180→181) taken 653 times.
✗ Branch 5 (180→183) not taken.
863 } else if (qualifier->type == QualifierNode::QualifierType::TY_PUBLIC && (node->isFieldType || node->isGlobalType)) {
209 863 type.getQualifiers().isPublic = true;
210 } else {
211 auto entryName = "local variable";
212 if (node->isGlobalType)
213 entryName = "global variable";
214 else if (node->isFieldType)
215 entryName = "field";
216 else if (node->isParamType)
217 entryName = "param";
218 else if (node->isReturnType)
219 entryName = "return variable";
220 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT,
221 "Cannot use this qualifier on a " + std::string(entryName) + " definition")
222 }
223 }
224 }
225
226
2/4
✓ Branch 0 (210→211) taken 50761 times.
✗ Branch 1 (210→317) not taken.
✓ Branch 2 (211→212) taken 50761 times.
✗ Branch 3 (211→317) not taken.
50761 return node->setEvaluatedSymbolType(type, manIdx);
227 50770 }
228
229 50773 std::any TypeChecker::visitBaseDataType(BaseDataTypeNode *node) {
230
11/11
✓ Branch 0 (2→3) taken 328 times.
✓ Branch 1 (2→8) taken 2941 times.
✓ Branch 2 (2→13) taken 728 times.
✓ Branch 3 (2→18) taken 9476 times.
✓ Branch 4 (2→23) taken 1919 times.
✓ Branch 5 (2→28) taken 7165 times.
✓ Branch 6 (2→33) taken 6485 times.
✓ Branch 7 (2→38) taken 3398 times.
✓ Branch 8 (2→43) taken 17838 times.
✓ Branch 9 (2→55) taken 112 times.
✓ Branch 10 (2→67) taken 383 times.
50773 switch (node->type) {
231 328 case BaseDataTypeNode::Type::TYPE_DOUBLE:
232
3/6
✓ Branch 0 (3→4) taken 328 times.
✗ Branch 1 (3→73) not taken.
✓ Branch 2 (4→5) taken 328 times.
✗ Branch 3 (4→73) not taken.
✓ Branch 4 (5→6) taken 328 times.
✗ Branch 5 (5→73) not taken.
328 return node->setEvaluatedSymbolType(QualType(TY_DOUBLE), manIdx);
233 2941 case BaseDataTypeNode::Type::TYPE_INT:
234
3/6
✓ Branch 0 (8→9) taken 2941 times.
✗ Branch 1 (8→75) not taken.
✓ Branch 2 (9→10) taken 2941 times.
✗ Branch 3 (9→75) not taken.
✓ Branch 4 (10→11) taken 2941 times.
✗ Branch 5 (10→75) not taken.
2941 return node->setEvaluatedSymbolType(QualType(TY_INT), manIdx);
235 728 case BaseDataTypeNode::Type::TYPE_SHORT:
236
3/6
✓ Branch 0 (13→14) taken 728 times.
✗ Branch 1 (13→77) not taken.
✓ Branch 2 (14→15) taken 728 times.
✗ Branch 3 (14→77) not taken.
✓ Branch 4 (15→16) taken 728 times.
✗ Branch 5 (15→77) not taken.
728 return node->setEvaluatedSymbolType(QualType(TY_SHORT), manIdx);
237 9476 case BaseDataTypeNode::Type::TYPE_LONG:
238
3/6
✓ Branch 0 (18→19) taken 9476 times.
✗ Branch 1 (18→79) not taken.
✓ Branch 2 (19→20) taken 9476 times.
✗ Branch 3 (19→79) not taken.
✓ Branch 4 (20→21) taken 9476 times.
✗ Branch 5 (20→79) not taken.
9476 return node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx);
239 1919 case BaseDataTypeNode::Type::TYPE_BYTE:
240
3/6
✓ Branch 0 (23→24) taken 1919 times.
✗ Branch 1 (23→81) not taken.
✓ Branch 2 (24→25) taken 1919 times.
✗ Branch 3 (24→81) not taken.
✓ Branch 4 (25→26) taken 1919 times.
✗ Branch 5 (25→81) not taken.
1919 return node->setEvaluatedSymbolType(QualType(TY_BYTE), manIdx);
241 7165 case BaseDataTypeNode::Type::TYPE_CHAR:
242
3/6
✓ Branch 0 (28→29) taken 7165 times.
✗ Branch 1 (28→83) not taken.
✓ Branch 2 (29→30) taken 7165 times.
✗ Branch 3 (29→83) not taken.
✓ Branch 4 (30→31) taken 7165 times.
✗ Branch 5 (30→83) not taken.
7165 return node->setEvaluatedSymbolType(QualType(TY_CHAR), manIdx);
243 6485 case BaseDataTypeNode::Type::TYPE_STRING:
244
3/6
✓ Branch 0 (33→34) taken 6485 times.
✗ Branch 1 (33→85) not taken.
✓ Branch 2 (34→35) taken 6485 times.
✗ Branch 3 (34→85) not taken.
✓ Branch 4 (35→36) taken 6485 times.
✗ Branch 5 (35→85) not taken.
6485 return node->setEvaluatedSymbolType(QualType(TY_STRING), manIdx);
245 3398 case BaseDataTypeNode::Type::TYPE_BOOL:
246
3/6
✓ Branch 0 (38→39) taken 3398 times.
✗ Branch 1 (38→87) not taken.
✓ Branch 2 (39→40) taken 3398 times.
✗ Branch 3 (39→87) not taken.
✓ Branch 4 (40→41) taken 3398 times.
✗ Branch 5 (40→87) not taken.
3398 return node->setEvaluatedSymbolType(QualType(TY_BOOL), manIdx);
247 17838 case BaseDataTypeNode::Type::TYPE_CUSTOM: {
248
2/4
✓ Branch 0 (43→44) taken 17838 times.
✗ Branch 1 (43→91) not taken.
✓ Branch 2 (44→45) taken 17838 times.
✗ Branch 3 (44→89) not taken.
17838 const auto customType = std::any_cast<QualType>(visit(node->customDataType));
249
4/6
✓ Branch 0 (46→47) taken 17838 times.
✗ Branch 1 (46→93) not taken.
✓ Branch 2 (47→48) taken 3 times.
✓ Branch 3 (47→50) taken 17835 times.
✓ Branch 4 (48→49) taken 3 times.
✗ Branch 5 (48→93) not taken.
17838 HANDLE_UNRESOLVED_TYPE_QT(customType)
250
2/4
✓ Branch 0 (50→51) taken 17835 times.
✗ Branch 1 (50→92) not taken.
✓ Branch 2 (51→52) taken 17835 times.
✗ Branch 3 (51→92) not taken.
17835 return node->setEvaluatedSymbolType(customType, manIdx);
251 }
252 112 case BaseDataTypeNode::Type::TYPE_FUNCTION: {
253
2/4
✓ Branch 0 (55→56) taken 112 times.
✗ Branch 1 (55→96) not taken.
✓ Branch 2 (56→57) taken 112 times.
✗ Branch 3 (56→94) not taken.
112 const auto functionType = std::any_cast<QualType>(visit(node->functionDataType));
254
2/6
✓ Branch 0 (58→59) taken 112 times.
✗ Branch 1 (58→98) not taken.
✗ Branch 2 (59→60) not taken.
✓ Branch 3 (59→62) taken 112 times.
✗ Branch 4 (60→61) not taken.
✗ Branch 5 (60→98) not taken.
112 HANDLE_UNRESOLVED_TYPE_QT(functionType)
255
2/4
✓ Branch 0 (62→63) taken 112 times.
✗ Branch 1 (62→97) not taken.
✓ Branch 2 (63→64) taken 112 times.
✗ Branch 3 (63→97) not taken.
112 return node->setEvaluatedSymbolType(functionType, manIdx);
256 }
257 383 default:
258
3/6
✓ Branch 0 (67→68) taken 383 times.
✗ Branch 1 (67→99) not taken.
✓ Branch 2 (68→69) taken 383 times.
✗ Branch 3 (68→99) not taken.
✓ Branch 4 (69→70) taken 383 times.
✗ Branch 5 (69→99) not taken.
383 return node->setEvaluatedSymbolType(QualType(TY_DYN), manIdx);
259 }
260 }
261
262 17838 std::any TypeChecker::visitCustomDataType(CustomDataTypeNode *node) {
263 // It is a struct type -> get the access scope
264
1/2
✓ Branch 0 (3→4) taken 17838 times.
✗ Branch 1 (3→241) not taken.
17838 const std::string firstFragment = node->typeNameFragments.front();
265
266 // Check this type requires a runtime module
267
2/2
✓ Branch 0 (5→6) taken 17812 times.
✓ Branch 1 (5→7) taken 26 times.
17838 if (node->typeNameFragments.size() == 1)
268
1/2
✓ Branch 0 (6→7) taken 17812 times.
✗ Branch 1 (6→239) not taken.
17812 ensureLoadedRuntimeForTypeName(firstFragment);
269
270 // A type can either be a single fragment like "Test" or multiple fragments "a.b.Test", which means it is imported.
271 17838 bool isImported = node->typeNameFragments.size() > 1;
272
3/4
✓ Branch 0 (8→9) taken 17838 times.
✗ Branch 1 (8→239) not taken.
✓ Branch 2 (9→10) taken 8440 times.
✓ Branch 3 (9→25) taken 9398 times.
17838 if (const QualType *genericType = rootScope->lookupGenericTypeStrict(firstFragment)) {
273
1/2
✗ Branch 0 (10→11) not taken.
✓ Branch 1 (10→12) taken 8440 times.
8440 assert(!isImported);
274 // Take the concrete replacement type for the name of this generic type if available
275
4/6
✓ Branch 0 (12→13) taken 8440 times.
✗ Branch 1 (12→239) not taken.
✓ Branch 2 (13→14) taken 1933 times.
✓ Branch 3 (13→16) taken 6507 times.
✓ Branch 4 (14→15) taken 1933 times.
✗ Branch 5 (14→239) not taken.
8440 const QualType &symbolType = typeMapping.contains(firstFragment) ? typeMapping.at(firstFragment) : *genericType;
276
277 // Check if the replacement requires a runtime module
278
3/4
✓ Branch 0 (17→18) taken 8440 times.
✗ Branch 1 (17→239) not taken.
✓ Branch 2 (18→19) taken 565 times.
✓ Branch 3 (18→21) taken 7875 times.
8440 if (symbolType.is(TY_STRUCT))
279
2/4
✓ Branch 0 (19→20) taken 565 times.
✗ Branch 1 (19→239) not taken.
✓ Branch 2 (20→21) taken 565 times.
✗ Branch 3 (20→239) not taken.
565 ensureLoadedRuntimeForTypeName(symbolType.getSubType());
280
281
2/4
✓ Branch 0 (21→22) taken 8440 times.
✗ Branch 1 (21→181) not taken.
✓ Branch 2 (22→23) taken 8440 times.
✗ Branch 3 (22→181) not taken.
8440 return node->setEvaluatedSymbolType(symbolType, manIdx);
282 }
283
284 // Check if the type exists in the exported names registry
285
1/2
✓ Branch 0 (25→26) taken 9398 times.
✗ Branch 1 (25→239) not taken.
9398 const NameRegistryEntry *registryEntry = sourceFile->getNameRegistryEntry(node->fqTypeName);
286
2/2
✓ Branch 0 (26→27) taken 2 times.
✓ Branch 1 (26→36) taken 9396 times.
9398 if (!registryEntry)
287
5/10
✓ Branch 0 (27→28) taken 2 times.
✗ Branch 1 (27→186) not taken.
✓ Branch 2 (28→29) taken 2 times.
✗ Branch 3 (28→184) not taken.
✓ Branch 4 (29→30) taken 2 times.
✗ Branch 5 (29→182) not taken.
✓ Branch 6 (32→33) taken 2 times.
✗ Branch 7 (32→188) not taken.
✓ Branch 8 (33→34) taken 2 times.
✗ Branch 9 (33→188) not taken.
2 SOFT_ERROR_QT(node, UNKNOWN_DATATYPE, "Unknown datatype '" + node->fqTypeName + "'")
288
2/4
✓ Branch 0 (36→37) taken 9396 times.
✗ Branch 1 (36→39) not taken.
✓ Branch 2 (37→38) taken 9396 times.
✗ Branch 3 (37→39) not taken.
9396 assert(registryEntry->targetEntry != nullptr && registryEntry->targetScope != nullptr);
289 9396 SymbolTableEntry *entry = registryEntry->targetEntry;
290
1/2
✗ Branch 0 (40→41) not taken.
✓ Branch 1 (40→42) taken 9396 times.
9396 assert(entry != nullptr);
291 9396 entry->used = true;
292 9396 Scope *defScope = registryEntry->targetScope->parent;
293
1/2
✓ Branch 0 (42→43) taken 9396 times.
✗ Branch 1 (42→239) not taken.
9396 QualType entryType = entry->getQualType();
294
295 // Enums can early-return
296
3/4
✓ Branch 0 (43→44) taken 9396 times.
✗ Branch 1 (43→239) not taken.
✓ Branch 2 (44→45) taken 112 times.
✓ Branch 3 (44→49) taken 9284 times.
9396 if (entryType.is(TY_ENUM))
297
2/4
✓ Branch 0 (45→46) taken 112 times.
✗ Branch 1 (45→189) not taken.
✓ Branch 2 (46→47) taken 112 times.
✗ Branch 3 (46→189) not taken.
224 return QualType(TY_INT);
298
299
3/4
✓ Branch 0 (49→50) taken 9284 times.
✗ Branch 1 (49→190) not taken.
✓ Branch 2 (50→51) taken 8350 times.
✓ Branch 3 (50→153) taken 934 times.
9284 if (entryType.isOneOf({TY_STRUCT, TY_INTERFACE})) {
300
2/4
✓ Branch 0 (51→52) taken 8350 times.
✗ Branch 1 (51→53) not taken.
✗ Branch 2 (54→55) not taken.
✓ Branch 3 (54→56) taken 8350 times.
8350 assert(dynamic_cast<DataTypeNode *>(node->parent->parent) != nullptr);
301
302 // Collect the concrete template types
303 8350 bool allTemplateTypesConcrete = true;
304 8350 QualTypeList templateTypes;
305
2/2
✓ Branch 0 (56→57) taken 2035 times.
✓ Branch 1 (56→89) taken 6315 times.
8350 if (node->templateTypeLst) {
306
1/2
✗ Branch 0 (57→58) not taken.
✓ Branch 1 (57→59) taken 2035 times.
2035 assert(defScope != nullptr);
307
1/2
✓ Branch 0 (59→60) taken 2035 times.
✗ Branch 1 (59→221) not taken.
2035 isImported = defScope->isImportedBy(rootScope);
308
309
1/2
✓ Branch 0 (61→62) taken 2035 times.
✗ Branch 1 (61→221) not taken.
2035 templateTypes.reserve(node->templateTypeLst->dataTypes.size());
310
2/2
✓ Branch 0 (86→64) taken 2672 times.
✓ Branch 1 (86→87) taken 2035 times.
4707 for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) {
311
2/4
✓ Branch 0 (65→66) taken 2672 times.
✗ Branch 1 (65→193) not taken.
✓ Branch 2 (66→67) taken 2672 times.
✗ Branch 3 (66→191) not taken.
2672 auto templateType = std::any_cast<QualType>(visit(dataType));
312
2/6
✓ Branch 0 (68→69) taken 2672 times.
✗ Branch 1 (68→195) not taken.
✗ Branch 2 (69→70) not taken.
✓ Branch 3 (69→72) taken 2672 times.
✗ Branch 4 (70→71) not taken.
✗ Branch 5 (70→195) not taken.
2672 HANDLE_UNRESOLVED_TYPE_QT(templateType)
313
2/4
✓ Branch 0 (72→73) taken 2672 times.
✗ Branch 1 (72→195) not taken.
✗ Branch 2 (73→74) not taken.
✓ Branch 3 (73→75) taken 2672 times.
2672 if (entryType.is(TY_GENERIC)) {
314 allTemplateTypesConcrete = false;
315
2/2
✓ Branch 0 (75→76) taken 950 times.
✓ Branch 1 (75→82) taken 1722 times.
2672 } else if (isImported) {
316 // Introduce the local type to the imported source file
317
1/2
✓ Branch 0 (76→77) taken 950 times.
✗ Branch 1 (76→194) not taken.
950 [[maybe_unused]] QualType importedType = mapLocalTypeToImportedScopeType(defScope, templateType);
318
3/6
✓ Branch 0 (77→78) taken 950 times.
✗ Branch 1 (77→194) not taken.
✓ Branch 2 (78→79) taken 950 times.
✗ Branch 3 (78→194) not taken.
✗ Branch 4 (79→80) not taken.
✓ Branch 5 (79→81) taken 950 times.
950 assert(importedType.is(templateType.getSuperType()));
319 }
320
1/2
✓ Branch 0 (82→83) taken 2672 times.
✗ Branch 1 (82→195) not taken.
2672 templateTypes.push_back(templateType);
321 }
322
1/2
✓ Branch 0 (87→88) taken 2035 times.
✗ Branch 1 (87→197) not taken.
2035 entryType = entryType.getWithTemplateTypes(templateTypes);
323 }
324
325 // Check if struct is defined before the current code location, if defined in the same source file
326 8350 const CodeLoc &declCodeLoc = entry->declNode->codeLoc;
327 8350 const CodeLoc &codeLoc = node->codeLoc;
328
6/6
✓ Branch 0 (90→91) taken 6600 times.
✓ Branch 1 (90→98) taken 1750 times.
✓ Branch 2 (96→97) taken 1 times.
✓ Branch 3 (96→98) taken 6599 times.
✓ Branch 4 (99→100) taken 1 times.
✓ Branch 5 (99→125) taken 8349 times.
14950 if (declCodeLoc.sourceFile->filePath == codeLoc.sourceFile->filePath && declCodeLoc > codeLoc) {
329
2/4
✓ Branch 0 (100→101) taken 1 times.
✗ Branch 1 (100→221) not taken.
✓ Branch 2 (101→102) taken 1 times.
✗ Branch 3 (101→112) not taken.
1 if (entryType.is(TY_STRUCT)) {
330
4/8
✓ Branch 0 (104→105) taken 1 times.
✗ Branch 1 (104→200) not taken.
✓ Branch 2 (105→106) taken 1 times.
✗ Branch 3 (105→198) not taken.
✓ Branch 4 (108→109) taken 1 times.
✗ Branch 5 (108→204) not taken.
✓ Branch 6 (109→110) taken 1 times.
✗ Branch 7 (109→204) not taken.
3 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_STRUCT, "Structs must be defined before usage")
331 } else {
332 assert(entryType.is(TY_INTERFACE));
333 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_INTERFACE, "Interfaces must be defined before usage")
334 }
335 }
336
337
1/2
✓ Branch 0 (125→126) taken 8349 times.
✗ Branch 1 (125→147) not taken.
8349 if (allTemplateTypesConcrete) { // Only do the next step, if we have concrete template types
338 // Set the struct/interface instance to used, if found
339 // Here, it is allowed to accept, that the struct/interface cannot be found, because there are self-referencing ones
340
3/4
✓ Branch 0 (126→127) taken 8349 times.
✗ Branch 1 (126→221) not taken.
✓ Branch 2 (127→128) taken 8191 times.
✓ Branch 3 (127→136) taken 158 times.
8349 if (entryType.is(TY_STRUCT)) {
341
1/2
✓ Branch 0 (129→130) taken 8191 times.
✗ Branch 1 (129→215) not taken.
8191 const std::string structName = node->typeNameFragments.back();
342
3/4
✓ Branch 0 (130→131) taken 8191 times.
✗ Branch 1 (130→213) not taken.
✓ Branch 2 (131→132) taken 8155 times.
✓ Branch 3 (131→134) taken 36 times.
8191 if (const Struct *spiceStruct = StructManager::match(defScope, structName, templateTypes, node))
343
1/2
✓ Branch 0 (132→133) taken 8155 times.
✗ Branch 1 (132→212) not taken.
8155 entryType = entryType.getWithBodyScope(spiceStruct->scope);
344 8191 } else {
345
2/4
✓ Branch 0 (136→137) taken 158 times.
✗ Branch 1 (136→219) not taken.
✗ Branch 2 (137→138) not taken.
✓ Branch 3 (137→139) taken 158 times.
158 assert(entryType.is(TY_INTERFACE));
346
1/2
✓ Branch 0 (140→141) taken 158 times.
✗ Branch 1 (140→219) not taken.
158 const std::string interfaceName = node->typeNameFragments.back();
347
2/4
✓ Branch 0 (141→142) taken 158 times.
✗ Branch 1 (141→217) not taken.
✓ Branch 2 (142→143) taken 158 times.
✗ Branch 3 (142→145) not taken.
158 if (const Interface *spiceInterface = InterfaceManager::match(defScope, interfaceName, templateTypes, node))
348
1/2
✓ Branch 0 (143→144) taken 158 times.
✗ Branch 1 (143→216) not taken.
158 entryType = entryType.getWithBodyScope(spiceInterface->scope);
349 158 }
350 }
351
352
2/4
✓ Branch 0 (147→148) taken 8349 times.
✗ Branch 1 (147→220) not taken.
✓ Branch 2 (148→149) taken 8349 times.
✗ Branch 3 (148→220) not taken.
8349 return node->setEvaluatedSymbolType(entryType, manIdx);
353 8350 }
354
355
2/4
✓ Branch 0 (153→154) taken 934 times.
✗ Branch 1 (153→239) not taken.
✓ Branch 2 (154→155) taken 934 times.
✗ Branch 3 (154→160) not taken.
934 if (entryType.is(TY_ALIAS))
356
3/6
✓ Branch 0 (155→156) taken 934 times.
✗ Branch 1 (155→224) not taken.
✓ Branch 2 (156→157) taken 934 times.
✗ Branch 3 (156→224) not taken.
✓ Branch 4 (157→158) taken 934 times.
✗ Branch 5 (157→224) not taken.
934 return node->setEvaluatedSymbolType(entryType.getAliased(entry), manIdx);
357
358 // We tried everything to resolve it, but this type is still unknown
359 const bool isInvalid = entryType.is(TY_INVALID);
360 SOFT_ERROR_QT(node, EXPECTED_TYPE, isInvalid ? "Used type before declared" : "Expected type, but got " + entryType.getName())
361 17838 }
362
363 112 std::any TypeChecker::visitFunctionDataType(FunctionDataTypeNode *node) {
364 // Visit return type
365
1/2
✓ Branch 0 (2→3) taken 112 times.
✗ Branch 1 (2→72) not taken.
112 QualType returnType(TY_DYN);
366
2/2
✓ Branch 0 (3→4) taken 29 times.
✓ Branch 1 (3→23) taken 83 times.
112 if (node->isFunction) {
367
2/4
✓ Branch 0 (4→5) taken 29 times.
✗ Branch 1 (4→54) not taken.
✓ Branch 2 (5→6) taken 29 times.
✗ Branch 3 (5→52) not taken.
29 returnType = std::any_cast<QualType>(visit(node->returnType));
368
2/6
✓ Branch 0 (7→8) taken 29 times.
✗ Branch 1 (7→72) not taken.
✗ Branch 2 (8→9) not taken.
✓ Branch 3 (8→11) taken 29 times.
✗ Branch 4 (9→10) not taken.
✗ Branch 5 (9→72) not taken.
29 HANDLE_UNRESOLVED_TYPE_QT(returnType)
369
2/4
✓ Branch 0 (11→12) taken 29 times.
✗ Branch 1 (11→72) not taken.
✗ Branch 2 (12→13) not taken.
✓ Branch 3 (12→23) taken 29 times.
29 if (returnType.is(TY_DYN))
370 SOFT_ERROR_ER(node->returnType, UNEXPECTED_DYN_TYPE, "Function types cannot have return type dyn")
371 }
372
373 // Visit param types
374 112 QualTypeList paramTypes;
375
2/2
✓ Branch 0 (23→24) taken 67 times.
✓ Branch 1 (23→40) taken 45 times.
112 if (const TypeLstNode *paramTypeListNode = node->paramTypeLst; paramTypeListNode != nullptr) {
376
2/2
✓ Branch 0 (38→26) taken 80 times.
✓ Branch 1 (38→39) taken 67 times.
147 for (DataTypeNode *paramTypeNode : paramTypeListNode->dataTypes) {
377
2/4
✓ Branch 0 (27→28) taken 80 times.
✗ Branch 1 (27→65) not taken.
✓ Branch 2 (28→29) taken 80 times.
✗ Branch 3 (28→63) not taken.
80 auto paramType = std::any_cast<QualType>(visit(paramTypeNode));
378
2/6
✓ Branch 0 (30→31) taken 80 times.
✗ Branch 1 (30→66) not taken.
✗ Branch 2 (31→32) not taken.
✓ Branch 3 (31→34) taken 80 times.
✗ Branch 4 (32→33) not taken.
✗ Branch 5 (32→66) not taken.
80 HANDLE_UNRESOLVED_TYPE_QT(returnType)
379
1/2
✓ Branch 0 (34→35) taken 80 times.
✗ Branch 1 (34→66) not taken.
80 paramTypes.push_back(paramType);
380 }
381 }
382
383 // Build function type
384
2/2
✓ Branch 0 (40→41) taken 29 times.
✓ Branch 1 (40→42) taken 83 times.
112 const SuperType superType = node->isFunction ? TY_FUNCTION : TY_PROCEDURE;
385
2/4
✓ Branch 0 (43→44) taken 112 times.
✗ Branch 1 (43→68) not taken.
✓ Branch 2 (44→45) taken 112 times.
✗ Branch 3 (44→68) not taken.
112 const QualType functionType = QualType(superType).getWithFunctionParamAndReturnTypes(returnType, paramTypes);
386
387
2/4
✓ Branch 0 (45→46) taken 112 times.
✗ Branch 1 (45→69) not taken.
✓ Branch 2 (46→47) taken 112 times.
✗ Branch 3 (46→69) not taken.
112 return node->setEvaluatedSymbolType(functionType, manIdx);
388 112 }
389
390 } // namespace spice::compiler
391