GCC Code Coverage Report


Directory: ../
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 91.4% 234 / 2 / 258
Functions: 100.0% 7 / 0 / 7
Branches: 51.9% 378 / 4 / 733

src/typechecker/TypeCheckMeta.cpp
Line Branch Exec Source
1 // Copyright (c) 2021-2026 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 <model/GenericType.h>
9 #include <symboltablebuilder/Scope.h>
10 #include <typechecker/FunctionManager.h>
11 #include <typechecker/InterfaceManager.h>
12 #include <typechecker/MacroDefs.h>
13 #include <typechecker/StructManager.h>
14
15 namespace spice::compiler {
16
17 48046 std::any TypeChecker::visitParamLst(ParamLstNode *node) {
18 48046 NamedParamList namedParams;
19 48046 bool metOptional = false;
20
21
2/2
✓ Branch 40 → 4 taken 72208 times.
✓ Branch 40 → 41 taken 48046 times.
168300 for (DeclStmtNode *param : node->params) {
22 // Visit param
23
2/4
✓ Branch 6 → 7 taken 72208 times.
✗ Branch 6 → 48 not taken.
✓ Branch 7 → 8 taken 72208 times.
✗ Branch 7 → 46 not taken.
72208 const auto paramType = std::any_cast<QualType>(visit(param));
24
25 // Check if the type could be inferred. Dyn without a default value is forbidden
26
3/4
✓ Branch 9 → 10 taken 72208 times.
✗ Branch 9 → 62 not taken.
✓ Branch 10 → 11 taken 3 times.
✓ Branch 10 → 17 taken 72205 times.
72208 if (paramType.is(TY_DYN)) {
27
3/6
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 53 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 51 not taken.
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 49 not taken.
3 softError(node, FCT_PARAM_IS_TYPE_DYN, "Type of parameter '" + param->varName + "' is invalid");
28 9 continue;
29 }
30
31 // Ensure that no optional param comes after a mandatory param
32
2/2
✓ Branch 17 → 18 taken 7037 times.
✓ Branch 17 → 19 taken 65168 times.
72205 if (param->hasAssignment) {
33 7037 metOptional = true;
34
2/2
✓ Branch 19 → 20 taken 6 times.
✓ Branch 19 → 27 taken 65162 times.
65168 } else if (metOptional) {
35
2/4
✓ Branch 22 → 23 taken 6 times.
✗ Branch 22 → 57 not taken.
✓ Branch 23 → 24 taken 6 times.
✗ Branch 23 → 55 not taken.
6 softError(param, INVALID_PARAM_ORDER, "Mandatory parameters must go before any optional parameters");
36 6 continue;
37 }
38
39 // Add parameter to named param list
40
1/2
✓ Branch 28 → 29 taken 72199 times.
✗ Branch 28 → 61 not taken.
72199 namedParams.push_back({param->varName.c_str(), paramType, metOptional});
41 }
42
43
1/2
✓ Branch 41 → 42 taken 48046 times.
✗ Branch 41 → 64 not taken.
96092 return namedParams;
44 48046 }
45
46 5483 std::any TypeChecker::visitField(FieldNode *node) {
47
2/4
✓ Branch 2 → 3 taken 5483 times.
✗ Branch 2 → 37 not taken.
✓ Branch 3 → 4 taken 5483 times.
✗ Branch 3 → 35 not taken.
5483 auto fieldType = std::any_cast<QualType>(visit(node->dataType));
48
4/6
✓ Branch 5 → 6 taken 5483 times.
✗ Branch 5 → 50 not taken.
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 9 taken 5482 times.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 50 not taken.
5483 HANDLE_UNRESOLVED_TYPE_QT(fieldType)
49
50
2/2
✓ Branch 9 → 10 taken 1710 times.
✓ Branch 9 → 31 taken 3772 times.
5482 if (ExprNode *defaultValueNode = node->defaultValue) {
51
2/4
✓ Branch 10 → 11 taken 1710 times.
✗ Branch 10 → 40 not taken.
✓ Branch 11 → 12 taken 1710 times.
✗ Branch 11 → 38 not taken.
1710 const QualType defaultValueType = std::any_cast<ExprResult>(visit(defaultValueNode)).type;
52
2/6
✓ Branch 13 → 14 taken 1710 times.
✗ Branch 13 → 49 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 17 taken 1710 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 49 not taken.
1711 HANDLE_UNRESOLVED_TYPE_QT(defaultValueType)
53
3/4
✓ Branch 17 → 18 taken 1710 times.
✗ Branch 17 → 49 not taken.
✓ Branch 18 → 19 taken 1 time.
✓ Branch 18 → 29 taken 1709 times.
1710 if (!fieldType.matches(defaultValueType, false, true, true))
54
4/8
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 44 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 42 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 48 not taken.
✓ Branch 26 → 27 taken 1 time.
✗ Branch 26 → 48 not taken.
4 SOFT_ERROR_QT(node, FIELD_TYPE_NOT_MATCHING, "Type of the default values does not match the field type")
55 }
56
57
1/2
✓ Branch 31 → 32 taken 5481 times.
✗ Branch 31 → 50 not taken.
5481 return fieldType;
58 }
59
60 2347 std::any TypeChecker::visitSignature(SignatureNode *node) {
61 2347 const bool isFunction = node->signatureType == SignatureNode::SignatureType::TYPE_FUNCTION;
62
63 // Retrieve function template types
64 2347 std::vector<GenericType> usedGenericTypes;
65
2/2
✓ Branch 2 → 3 taken 237 times.
✓ Branch 2 → 43 taken 2110 times.
2347 if (node->hasTemplateTypes) {
66
2/2
✓ Branch 41 → 5 taken 237 times.
✓ Branch 41 → 42 taken 236 times.
710 for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) {
67 // Visit template type
68
2/4
✓ Branch 7 → 8 taken 237 times.
✗ Branch 7 → 129 not taken.
✓ Branch 8 → 9 taken 237 times.
✗ Branch 8 → 127 not taken.
237 auto templateType = std::any_cast<QualType>(visit(dataType));
69
2/4
✓ Branch 10 → 11 taken 237 times.
✗ Branch 10 → 138 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 237 times.
237 if (templateType.is(TY_UNRESOLVED))
70 return static_cast<std::vector<Function *> *>(nullptr);
71 // Check if it is a generic type
72
3/4
✓ Branch 15 → 16 taken 237 times.
✗ Branch 15 → 138 not taken.
✓ Branch 16 → 17 taken 1 time.
✓ Branch 16 → 26 taken 236 times.
237 if (!templateType.is(TY_GENERIC)) {
73
2/4
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 133 not taken.
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 131 not taken.
1 softError(dataType, EXPECTED_GENERIC_TYPE, "A template list can only contain generic types");
74
1/2
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 137 not taken.
2 return static_cast<std::vector<Function *> *>(nullptr);
75 }
76 // Convert generic symbol type to generic type
77
2/4
✓ Branch 26 → 27 taken 236 times.
✗ Branch 26 → 138 not taken.
✓ Branch 27 → 28 taken 236 times.
✗ Branch 27 → 138 not taken.
236 const GenericType *genericType = rootScope->lookupGenericTypeStrict(templateType.getSubType());
78
1/2
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 236 times.
236 assert(genericType != nullptr);
79
1/2
✓ Branch 30 → 31 taken 236 times.
✗ Branch 30 → 138 not taken.
236 usedGenericTypes.push_back(*genericType);
80 }
81 }
82
83 // Visit return type
84
1/2
✓ Branch 43 → 44 taken 2346 times.
✗ Branch 43 → 182 not taken.
2346 QualType returnType(TY_DYN);
85
2/2
✓ Branch 44 → 45 taken 2220 times.
✓ Branch 44 → 62 taken 126 times.
2346 if (isFunction) {
86
2/4
✓ Branch 45 → 46 taken 2220 times.
✗ Branch 45 → 142 not taken.
✓ Branch 46 → 47 taken 2220 times.
✗ Branch 46 → 140 not taken.
2220 returnType = std::any_cast<QualType>(visit(node->returnType));
87
2/4
✓ Branch 48 → 49 taken 2220 times.
✗ Branch 48 → 182 not taken.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 53 taken 2220 times.
2220 if (returnType.is(TY_UNRESOLVED))
88 return static_cast<std::vector<Function *> *>(nullptr);
89
90
3/4
✓ Branch 53 → 54 taken 2220 times.
✗ Branch 53 → 182 not taken.
✓ Branch 54 → 55 taken 1 time.
✓ Branch 54 → 62 taken 2219 times.
2220 if (!returnType.isCoveredByGenericTypeList(usedGenericTypes))
91
1/2
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 145 not taken.
1 softError(node->returnType, GENERIC_TYPE_NOT_IN_TEMPLATE,
92
1/2
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 147 not taken.
3 "Generic return type not included in the template type list of the function");
93 }
94
95 // Visit params
96 2346 QualTypeList paramTypes;
97 2346 ParamList paramList;
98
2/2
✓ Branch 62 → 63 taken 1442 times.
✓ Branch 62 → 101 taken 904 times.
2346 if (node->hasParams) {
99
1/2
✓ Branch 64 → 65 taken 1442 times.
✗ Branch 64 → 178 not taken.
1442 paramList.reserve(node->paramTypeLst->dataTypes.size());
100
2/2
✓ Branch 99 → 67 taken 1524 times.
✓ Branch 99 → 100 taken 1442 times.
4408 for (DataTypeNode *param : node->paramTypeLst->dataTypes) {
101
2/4
✓ Branch 69 → 70 taken 1524 times.
✗ Branch 69 → 153 not taken.
✓ Branch 70 → 71 taken 1524 times.
✗ Branch 70 → 151 not taken.
1524 auto paramType = std::any_cast<QualType>(visit(param));
102
2/4
✓ Branch 72 → 73 taken 1524 times.
✗ Branch 72 → 162 not taken.
✗ Branch 73 → 74 not taken.
✓ Branch 73 → 77 taken 1524 times.
1524 if (paramType.is(TY_UNRESOLVED))
103 return static_cast<std::vector<Function *> *>(nullptr);
104
105 // Check if the type is present in the template for generic types
106
3/4
✓ Branch 77 → 78 taken 1524 times.
✗ Branch 77 → 162 not taken.
✓ Branch 78 → 79 taken 2 times.
✓ Branch 78 → 86 taken 1522 times.
1524 if (!paramType.isCoveredByGenericTypeList(usedGenericTypes)) {
107
1/2
✓ Branch 82 → 83 taken 2 times.
✗ Branch 82 → 155 not taken.
2 softError(node->paramTypeLst, GENERIC_TYPE_NOT_IN_TEMPLATE,
108
1/2
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 157 not taken.
4 "Generic param type not included in the template type list of the function");
109 2 continue;
110 }
111
112
1/2
✓ Branch 86 → 87 taken 1522 times.
✗ Branch 86 → 162 not taken.
1522 paramTypes.push_back(paramType);
113
1/2
✓ Branch 87 → 88 taken 1522 times.
✗ Branch 87 → 161 not taken.
1522 paramList.push_back({paramType, false});
114 }
115 }
116
117 // Build signature object
118
5/10
✓ Branch 101 → 102 taken 2346 times.
✗ Branch 101 → 173 not taken.
✓ Branch 102 → 103 taken 2346 times.
✗ Branch 102 → 170 not taken.
✓ Branch 103 → 104 taken 2346 times.
✗ Branch 103 → 167 not taken.
✓ Branch 104 → 105 taken 2346 times.
✗ Branch 104 → 166 not taken.
✓ Branch 105 → 106 taken 2346 times.
✗ Branch 105 → 164 not taken.
2346 const Function signature(node->methodName, nullptr, QualType(TY_DYN), returnType, paramList, usedGenericTypes, node);
119
120 // Add signature to current scope
121
1/2
✓ Branch 109 → 110 taken 2346 times.
✗ Branch 109 → 176 not taken.
2346 Function *manifestation = FunctionManager::insert(currentScope, signature, &node->signatureManifestations);
122 2346 manifestation->entry = node->entry;
123 2346 manifestation->used = true;
124
125 // Prepare signature type
126
2/2
✓ Branch 110 → 111 taken 2220 times.
✓ Branch 110 → 112 taken 126 times.
2346 const SuperType superType = isFunction ? TY_FUNCTION : TY_PROCEDURE;
127
2/4
✓ Branch 113 → 114 taken 2346 times.
✗ Branch 113 → 174 not taken.
✓ Branch 114 → 115 taken 2346 times.
✗ Branch 114 → 174 not taken.
2346 QualType signatureType = QualType(superType).getWithFunctionParamAndReturnTypes(returnType, paramTypes);
128 2346 signatureType.setQualifiers(node->signatureQualifiers);
129
130 // Set entry to signature type
131
1/2
✗ Branch 116 → 117 not taken.
✓ Branch 116 → 118 taken 2346 times.
2346 assert(node->entry != nullptr);
132
1/2
✓ Branch 118 → 119 taken 2346 times.
✗ Branch 118 → 176 not taken.
2346 node->entry->updateType(signatureType, false);
133 2346 node->entry->used = true;
134
135
1/2
✓ Branch 119 → 120 taken 2346 times.
✗ Branch 119 → 175 not taken.
2346 return &node->signatureManifestations;
136 2347 }
137
138 180669 std::any TypeChecker::visitDataType(DataTypeNode *node) {
139 // Visit base data type
140
2/4
✓ Branch 2 → 3 taken 180669 times.
✗ Branch 2 → 227 not taken.
✓ Branch 3 → 4 taken 180669 times.
✗ Branch 3 → 225 not taken.
180669 auto type = std::any_cast<QualType>(visit(node->baseDataType));
141
4/6
✓ Branch 5 → 6 taken 180669 times.
✗ Branch 5 → 328 not taken.
✓ Branch 6 → 7 taken 3 times.
✓ Branch 6 → 9 taken 180666 times.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 328 not taken.
180669 HANDLE_UNRESOLVED_TYPE_QT(type)
142
143
1/2
✓ Branch 9 → 10 taken 180666 times.
✗ Branch 9 → 328 not taken.
180666 std::queue<DataTypeNode::TypeModifier> tmQueue = node->tmQueue;
144
2/2
✓ Branch 108 → 11 taken 52999 times.
✓ Branch 108 → 109 taken 180659 times.
233658 while (!tmQueue.empty()) {
145
1/2
✓ Branch 12 → 13 taken 52999 times.
✗ Branch 12 → 277 not taken.
52999 auto [modifierType, hasSize, hardcodedSize, sizeVarName] = tmQueue.front();
146
147 // Only the outermost array can have an unknown size
148
8/10
✓ Branch 13 → 14 taken 52999 times.
✗ Branch 13 → 275 not taken.
✓ Branch 14 → 15 taken 47 times.
✓ Branch 14 → 18 taken 52952 times.
✓ Branch 15 → 16 taken 47 times.
✗ Branch 15 → 275 not taken.
✓ Branch 16 → 17 taken 1 time.
✓ Branch 16 → 18 taken 46 times.
✓ Branch 19 → 20 taken 1 time.
✓ Branch 19 → 30 taken 52998 times.
52999 if (type.isArray() && type.getArraySize() == ARRAY_SIZE_UNKNOWN)
149
4/8
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 230 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 228 not taken.
✓ Branch 26 → 27 taken 1 time.
✗ Branch 26 → 234 not taken.
✓ Branch 27 → 28 taken 1 time.
✗ Branch 27 → 234 not taken.
4 SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID,
150 "Usage of incomplete array type. Only the outermost array type may have unknown size")
151
152
3/4
✓ Branch 30 → 31 taken 29713 times.
✓ Branch 30 → 33 taken 23017 times.
✓ Branch 30 → 35 taken 268 times.
✗ Branch 30 → 92 not taken.
52998 switch (modifierType) {
153 29713 case DataTypeNode::TypeModifierType::TYPE_PTR: {
154
2/2
✓ Branch 31 → 32 taken 29711 times.
✓ Branch 31 → 235 taken 2 times.
29713 type = type.toPtr(node);
155 29711 break;
156 }
157 23017 case DataTypeNode::TypeModifierType::TYPE_REF: {
158
1/2
✓ Branch 33 → 34 taken 23017 times.
✗ Branch 33 → 236 not taken.
23017 type = type.toRef(node);
159 23017 break;
160 }
161 268 case DataTypeNode::TypeModifierType::TYPE_ARRAY: {
162 268 const std::string &varName = sizeVarName;
163
2/2
✓ Branch 36 → 37 taken 52 times.
✓ Branch 36 → 78 taken 216 times.
268 if (!varName.empty()) {
164
1/2
✓ Branch 37 → 38 taken 52 times.
✗ Branch 37 → 275 not taken.
52 const SymbolTableEntry *globalVar = rootScope->lookupStrict(varName);
165
2/2
✓ Branch 40 → 41 taken 1 time.
✓ Branch 40 → 50 taken 51 times.
52 if (!globalVar)
166
5/10
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 241 not taken.
✓ Branch 42 → 43 taken 1 time.
✗ Branch 42 → 239 not taken.
✓ Branch 43 → 44 taken 1 time.
✗ Branch 43 → 237 not taken.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 243 not taken.
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 243 not taken.
2 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_VARIABLE, "Could not find global variable '" + varName + "' ")
167
4/6
✓ Branch 50 → 51 taken 51 times.
✗ Branch 50 → 275 not taken.
✓ Branch 51 → 52 taken 51 times.
✗ Branch 51 → 275 not taken.
✓ Branch 52 → 53 taken 1 time.
✓ Branch 52 → 63 taken 50 times.
51 if (!globalVar->getQualType().isConst())
168
4/8
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 246 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 244 not taken.
✓ Branch 59 → 60 taken 1 time.
✗ Branch 59 → 250 not taken.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 250 not taken.
4 SOFT_ERROR_QT(node, EXPECTED_CONST_VARIABLE, "The size of the array must be known at compile time")
169
4/6
✓ Branch 63 → 64 taken 50 times.
✗ Branch 63 → 275 not taken.
✓ Branch 64 → 65 taken 50 times.
✗ Branch 64 → 275 not taken.
✓ Branch 65 → 66 taken 1 time.
✓ Branch 65 → 76 taken 49 times.
50 if (!globalVar->getQualType().is(TY_INT))
170
4/8
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 253 not taken.
✓ Branch 69 → 70 taken 1 time.
✗ Branch 69 → 251 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 257 not taken.
✓ Branch 73 → 74 taken 1 time.
✗ Branch 73 → 257 not taken.
4 SOFT_ERROR_QT(node, OPERATOR_WRONG_DATA_TYPE, "Expected variable of type int")
171
1/2
✓ Branch 76 → 77 taken 49 times.
✗ Branch 76 → 275 not taken.
49 hardcodedSize = globalVar->declNode->getCompileTimeValue(manIdx).intValue;
172 }
173
174
3/4
✓ Branch 78 → 79 taken 137 times.
✓ Branch 78 → 90 taken 128 times.
✗ Branch 79 → 80 not taken.
✓ Branch 79 → 90 taken 137 times.
265 if (hasSize && hardcodedSize <= 1)
175 SOFT_ERROR_QT(node, ARRAY_SIZE_INVALID, "The size of an array must be > 1 and explicitly stated")
176
2/2
✓ Branch 90 → 91 taken 264 times.
✓ Branch 90 → 265 taken 1 time.
265 type = type.toArr(node, hardcodedSize);
177 264 break;
178 }
179 default: // GCOV_EXCL_LINE
180 throw CompilerError(UNHANDLED_BRANCH, "Modifier type fall-through"); // GCOV_EXCL_LINE
181 }
182 52992 tmQueue.pop();
183
2/2
✓ Branch 103 → 104 taken 52992 times.
✓ Branch 103 → 106 taken 4 times.
52999 }
184
185 // Attach the qualifiers to the type
186
2/2
✓ Branch 109 → 110 taken 68310 times.
✓ Branch 109 → 218 taken 112349 times.
180659 if (node->qualifierLst) {
187
1/2
✓ Branch 110 → 111 taken 68310 times.
✗ Branch 110 → 324 not taken.
68310 const QualType baseType = type.getBase();
188
2/2
✓ Branch 215 → 113 taken 78439 times.
✓ Branch 215 → 216 taken 68308 times.
215057 for (const QualifierNode *qualifier : node->qualifierLst->qualifiers) {
189
2/2
✓ Branch 115 → 116 taken 32821 times.
✓ Branch 115 → 118 taken 45618 times.
78439 if (qualifier->type == QualifierNode::QualifierType::TY_CONST) {
190 32821 type.getQualifiers().isConst = true;
191
2/2
✓ Branch 118 → 119 taken 6 times.
✓ Branch 118 → 133 taken 45612 times.
45618 } else if (qualifier->type == QualifierNode::QualifierType::TY_SIGNED) {
192
2/4
✓ Branch 119 → 120 taken 6 times.
✗ Branch 119 → 278 not taken.
✗ Branch 120 → 121 not taken.
✓ Branch 120 → 130 taken 6 times.
6 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 6 type.getQualifiers().isSigned = true;
195 6 type.getQualifiers().isUnsigned = false;
196
2/2
✓ Branch 133 → 134 taken 26419 times.
✓ Branch 133 → 148 taken 19193 times.
45612 } else if (qualifier->type == QualifierNode::QualifierType::TY_UNSIGNED) {
197
2/4
✓ Branch 134 → 135 taken 26419 times.
✗ Branch 134 → 286 not taken.
✗ Branch 135 → 136 not taken.
✓ Branch 135 → 145 taken 26419 times.
26419 if (!baseType.isOneOf({TY_INT, TY_LONG, TY_SHORT, TY_BYTE, TY_CHAR, TY_GENERIC}))
198 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "Cannot use this qualifier on type " + baseType.getName(false))
199 26419 type.getQualifiers().isSigned = false;
200 26419 type.getQualifiers().isUnsigned = true;
201
2/2
✓ Branch 148 → 149 taken 14501 times.
✓ Branch 148 → 163 taken 4692 times.
19193 } else if (qualifier->type == QualifierNode::QualifierType::TY_HEAP) {
202 // Heap variables can only be pointers
203
4/6
✓ Branch 149 → 150 taken 14501 times.
✗ Branch 149 → 295 not taken.
✓ Branch 150 → 151 taken 14501 times.
✗ Branch 150 → 294 not taken.
✓ Branch 151 → 152 taken 1 time.
✓ Branch 151 → 161 taken 14500 times.
14501 if (!type.removeReferenceWrapper().isOneOf({TY_PTR, TY_ARRAY, TY_STRING}))
204
5/10
✓ Branch 152 → 153 taken 1 time.
✗ Branch 152 → 300 not taken.
✓ Branch 153 → 154 taken 1 time.
✗ Branch 153 → 298 not taken.
✓ Branch 154 → 155 taken 1 time.
✗ Branch 154 → 296 not taken.
✓ Branch 157 → 158 taken 1 time.
✗ Branch 157 → 302 not taken.
✓ Branch 158 → 159 taken 1 time.
✗ Branch 158 → 302 not taken.
2 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT,
205 "The heap qualifier can only be applied to symbols of pointer type, you provided " +
206 baseType.getName(false))
207
208 14500 type.getQualifiers().isHeap = true;
209
3/4
✓ Branch 163 → 164 taken 1258 times.
✓ Branch 163 → 179 taken 3434 times.
✓ Branch 164 → 165 taken 1258 times.
✗ Branch 164 → 179 not taken.
4692 } else if (qualifier->type == QualifierNode::QualifierType::TY_COMPOSITION && node->isFieldType) {
210
3/4
✓ Branch 165 → 166 taken 1258 times.
✗ Branch 165 → 323 not taken.
✓ Branch 166 → 167 taken 1 time.
✓ Branch 166 → 177 taken 1257 times.
1258 if (!type.is(TY_STRUCT))
211
4/8
✓ Branch 169 → 170 taken 1 time.
✗ Branch 169 → 305 not taken.
✓ Branch 170 → 171 taken 1 time.
✗ Branch 170 → 303 not taken.
✓ Branch 173 → 174 taken 1 time.
✗ Branch 173 → 309 not taken.
✓ Branch 174 → 175 taken 1 time.
✗ Branch 174 → 309 not taken.
4 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT, "The compose qualifier can only be used on plain struct fields")
212 1257 type.getQualifiers().isComposition = true;
213
4/6
✓ Branch 179 → 180 taken 3434 times.
✗ Branch 179 → 184 not taken.
✓ Branch 180 → 181 taken 1258 times.
✓ Branch 180 → 182 taken 2176 times.
✓ Branch 181 → 182 taken 1258 times.
✗ Branch 181 → 184 not taken.
3434 } else if (qualifier->type == QualifierNode::QualifierType::TY_PUBLIC && (node->isFieldType || node->isGlobalType)) {
214 3434 type.getQualifiers().isPublic = true;
215 } else {
216 auto entryName = "local variable";
217 if (node->isGlobalType)
218 entryName = "global variable";
219 else if (node->isFieldType)
220 entryName = "field";
221 else if (node->isParamType)
222 entryName = "param";
223 else if (node->isReturnType)
224 entryName = "return variable";
225 SOFT_ERROR_QT(qualifier, QUALIFIER_AT_ILLEGAL_CONTEXT,
226 "Cannot use this qualifier on a " + std::string(entryName) + " definition")
227 }
228 }
229 }
230
231
2/4
✓ Branch 218 → 219 taken 180657 times.
✗ Branch 218 → 325 not taken.
✓ Branch 219 → 220 taken 180657 times.
✗ Branch 219 → 325 not taken.
361314 return node->setEvaluatedSymbolType(type, manIdx);
232 180666 }
233
234 180669 std::any TypeChecker::visitBaseDataType(BaseDataTypeNode *node) {
235
11/11
✓ Branch 2 → 3 taken 2492 times.
✓ Branch 2 → 8 taken 9453 times.
✓ Branch 2 → 13 taken 2523 times.
✓ Branch 2 → 18 taken 26009 times.
✓ Branch 2 → 23 taken 9222 times.
✓ Branch 2 → 28 taken 16918 times.
✓ Branch 2 → 33 taken 15549 times.
✓ Branch 2 → 38 taken 11489 times.
✓ Branch 2 → 43 taken 85242 times.
✓ Branch 2 → 55 taken 287 times.
✓ Branch 2 → 67 taken 1485 times.
180669 switch (node->type) {
236 2492 case BaseDataTypeNode::Type::TYPE_DOUBLE:
237
3/6
✓ Branch 3 → 4 taken 2492 times.
✗ Branch 3 → 73 not taken.
✓ Branch 4 → 5 taken 2492 times.
✗ Branch 4 → 73 not taken.
✓ Branch 5 → 6 taken 2492 times.
✗ Branch 5 → 73 not taken.
4984 return node->setEvaluatedSymbolType(QualType(TY_DOUBLE), manIdx);
238 9453 case BaseDataTypeNode::Type::TYPE_INT:
239
3/6
✓ Branch 8 → 9 taken 9453 times.
✗ Branch 8 → 75 not taken.
✓ Branch 9 → 10 taken 9453 times.
✗ Branch 9 → 75 not taken.
✓ Branch 10 → 11 taken 9453 times.
✗ Branch 10 → 75 not taken.
18906 return node->setEvaluatedSymbolType(QualType(TY_INT), manIdx);
240 2523 case BaseDataTypeNode::Type::TYPE_SHORT:
241
3/6
✓ Branch 13 → 14 taken 2523 times.
✗ Branch 13 → 77 not taken.
✓ Branch 14 → 15 taken 2523 times.
✗ Branch 14 → 77 not taken.
✓ Branch 15 → 16 taken 2523 times.
✗ Branch 15 → 77 not taken.
5046 return node->setEvaluatedSymbolType(QualType(TY_SHORT), manIdx);
242 26009 case BaseDataTypeNode::Type::TYPE_LONG:
243
3/6
✓ Branch 18 → 19 taken 26009 times.
✗ Branch 18 → 79 not taken.
✓ Branch 19 → 20 taken 26009 times.
✗ Branch 19 → 79 not taken.
✓ Branch 20 → 21 taken 26009 times.
✗ Branch 20 → 79 not taken.
52018 return node->setEvaluatedSymbolType(QualType(TY_LONG), manIdx);
244 9222 case BaseDataTypeNode::Type::TYPE_BYTE:
245
3/6
✓ Branch 23 → 24 taken 9222 times.
✗ Branch 23 → 81 not taken.
✓ Branch 24 → 25 taken 9222 times.
✗ Branch 24 → 81 not taken.
✓ Branch 25 → 26 taken 9222 times.
✗ Branch 25 → 81 not taken.
18444 return node->setEvaluatedSymbolType(QualType(TY_BYTE), manIdx);
246 16918 case BaseDataTypeNode::Type::TYPE_CHAR:
247
3/6
✓ Branch 28 → 29 taken 16918 times.
✗ Branch 28 → 83 not taken.
✓ Branch 29 → 30 taken 16918 times.
✗ Branch 29 → 83 not taken.
✓ Branch 30 → 31 taken 16918 times.
✗ Branch 30 → 83 not taken.
33836 return node->setEvaluatedSymbolType(QualType(TY_CHAR), manIdx);
248 15549 case BaseDataTypeNode::Type::TYPE_STRING:
249
3/6
✓ Branch 33 → 34 taken 15549 times.
✗ Branch 33 → 85 not taken.
✓ Branch 34 → 35 taken 15549 times.
✗ Branch 34 → 85 not taken.
✓ Branch 35 → 36 taken 15549 times.
✗ Branch 35 → 85 not taken.
31098 return node->setEvaluatedSymbolType(QualType(TY_STRING), manIdx);
250 11489 case BaseDataTypeNode::Type::TYPE_BOOL:
251
3/6
✓ Branch 38 → 39 taken 11489 times.
✗ Branch 38 → 87 not taken.
✓ Branch 39 → 40 taken 11489 times.
✗ Branch 39 → 87 not taken.
✓ Branch 40 → 41 taken 11489 times.
✗ Branch 40 → 87 not taken.
22978 return node->setEvaluatedSymbolType(QualType(TY_BOOL), manIdx);
252 85242 case BaseDataTypeNode::Type::TYPE_CUSTOM: {
253
2/4
✓ Branch 43 → 44 taken 85242 times.
✗ Branch 43 → 91 not taken.
✓ Branch 44 → 45 taken 85242 times.
✗ Branch 44 → 89 not taken.
85242 const auto customType = std::any_cast<QualType>(visit(node->customDataType));
254
4/6
✓ Branch 46 → 47 taken 85242 times.
✗ Branch 46 → 93 not taken.
✓ Branch 47 → 48 taken 3 times.
✓ Branch 47 → 50 taken 85239 times.
✓ Branch 48 → 49 taken 3 times.
✗ Branch 48 → 93 not taken.
85242 HANDLE_UNRESOLVED_TYPE_QT(customType)
255
2/4
✓ Branch 50 → 51 taken 85239 times.
✗ Branch 50 → 92 not taken.
✓ Branch 51 → 52 taken 85239 times.
✗ Branch 51 → 92 not taken.
170478 return node->setEvaluatedSymbolType(customType, manIdx);
256 }
257 287 case BaseDataTypeNode::Type::TYPE_FUNCTION: {
258
2/4
✓ Branch 55 → 56 taken 287 times.
✗ Branch 55 → 96 not taken.
✓ Branch 56 → 57 taken 287 times.
✗ Branch 56 → 94 not taken.
287 const auto functionType = std::any_cast<QualType>(visit(node->functionDataType));
259
2/6
✓ Branch 58 → 59 taken 287 times.
✗ Branch 58 → 98 not taken.
✗ Branch 59 → 60 not taken.
✓ Branch 59 → 62 taken 287 times.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 98 not taken.
287 HANDLE_UNRESOLVED_TYPE_QT(functionType)
260
2/4
✓ Branch 62 → 63 taken 287 times.
✗ Branch 62 → 97 not taken.
✓ Branch 63 → 64 taken 287 times.
✗ Branch 63 → 97 not taken.
574 return node->setEvaluatedSymbolType(functionType, manIdx);
261 }
262 1485 default:
263
3/6
✓ Branch 67 → 68 taken 1485 times.
✗ Branch 67 → 99 not taken.
✓ Branch 68 → 69 taken 1485 times.
✗ Branch 68 → 99 not taken.
✓ Branch 69 → 70 taken 1485 times.
✗ Branch 69 → 99 not taken.
2970 return node->setEvaluatedSymbolType(QualType(TY_DYN), manIdx);
264 }
265 }
266
267 85242 std::any TypeChecker::visitCustomDataType(CustomDataTypeNode *node) {
268 // It is a struct type -> get the access scope
269
1/2
✓ Branch 3 → 4 taken 85242 times.
✗ Branch 3 → 257 not taken.
85242 const std::string firstFragment = node->typeNameFragments.front();
270
271 // Check this type requires a runtime module
272
2/2
✓ Branch 5 → 6 taken 85102 times.
✓ Branch 5 → 7 taken 140 times.
85242 if (node->typeNameFragments.size() == 1)
273
1/2
✓ Branch 6 → 7 taken 85102 times.
✗ Branch 6 → 255 not taken.
85102 ensureLoadedRuntimeForTypeName(firstFragment);
274
275 // A type can either be a single fragment like "Test" or multiple fragments "a.b.Test", which means it is imported.
276 85242 bool isImported = node->typeNameFragments.size() > 1;
277
3/4
✓ Branch 8 → 9 taken 85242 times.
✗ Branch 8 → 255 not taken.
✓ Branch 9 → 10 taken 33789 times.
✓ Branch 9 → 27 taken 51453 times.
85242 if (const QualType *genericType = rootScope->lookupGenericTypeStrict(firstFragment)) {
278
1/2
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 33789 times.
33789 assert(!isImported);
279 // Take the concrete replacement type for the name of this generic type if available
280
1/2
✓ Branch 12 → 13 taken 33789 times.
✗ Branch 12 → 197 not taken.
33789 const auto it = typeMapping.find(firstFragment);
281
2/2
✓ Branch 15 → 16 taken 18034 times.
✓ Branch 15 → 17 taken 15755 times.
33789 const QualType &symbolType = it != typeMapping.end() ? it->second : *genericType;
282
283 // Check if the replacement requires a runtime module
284
3/4
✓ Branch 19 → 20 taken 33789 times.
✗ Branch 19 → 197 not taken.
✓ Branch 20 → 21 taken 6405 times.
✓ Branch 20 → 23 taken 27384 times.
33789 if (symbolType.is(TY_STRUCT))
285
2/4
✓ Branch 21 → 22 taken 6405 times.
✗ Branch 21 → 197 not taken.
✓ Branch 22 → 23 taken 6405 times.
✗ Branch 22 → 197 not taken.
6405 ensureLoadedRuntimeForTypeName(symbolType.getSubType());
286
287
2/4
✓ Branch 23 → 24 taken 33789 times.
✗ Branch 23 → 196 not taken.
✓ Branch 24 → 25 taken 33789 times.
✗ Branch 24 → 196 not taken.
67578 return node->setEvaluatedSymbolType(symbolType, manIdx);
288 }
289
290 // Check if the type exists in the exported names registry
291
1/2
✓ Branch 27 → 28 taken 51453 times.
✗ Branch 27 → 255 not taken.
51453 const NameRegistryEntry *registryEntry = sourceFile->getNameRegistryEntry(node->fqTypeName);
292
2/2
✓ Branch 28 → 29 taken 2 times.
✓ Branch 28 → 38 taken 51451 times.
51453 if (!registryEntry)
293
5/10
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 202 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 200 not taken.
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 198 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 204 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 204 not taken.
4 SOFT_ERROR_QT(node, UNKNOWN_DATATYPE, "Unknown datatype '" + node->fqTypeName + "'")
294
2/4
✓ Branch 38 → 39 taken 51451 times.
✗ Branch 38 → 41 not taken.
✓ Branch 39 → 40 taken 51451 times.
✗ Branch 39 → 41 not taken.
51451 assert(registryEntry->targetEntry != nullptr && registryEntry->targetScope != nullptr);
295 51451 SymbolTableEntry *entry = registryEntry->targetEntry;
296
1/2
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 51451 times.
51451 assert(entry != nullptr);
297 51451 entry->used = true;
298 51451 Scope *defScope = registryEntry->targetScope->parent;
299
1/2
✓ Branch 44 → 45 taken 51451 times.
✗ Branch 44 → 255 not taken.
51451 QualType entryType = entry->getQualType();
300
301 // With circular imports, two structs/interfaces in mutually importing files can reference each other, so neither can be
302 // prepared strictly before the other. If we reach one here before it has been prepared (its type is still invalid),
303 // assign its opaque type now - an implicit forward declaration. The full prepare pass assigns the identical interned
304 // type later and additionally fills in the body and manifestations.
305
3/4
✓ Branch 45 → 46 taken 51451 times.
✗ Branch 45 → 255 not taken.
✓ Branch 46 → 47 taken 1023 times.
✓ Branch 46 → 50 taken 50428 times.
51451 if (entryType.is(TY_INVALID)) {
306
1/2
✓ Branch 47 → 48 taken 1023 times.
✗ Branch 47 → 255 not taken.
1023 assignDeferredOpaqueType(entry);
307
1/2
✓ Branch 48 → 49 taken 1023 times.
✗ Branch 48 → 255 not taken.
1023 entryType = entry->getQualType();
308 }
309
310 // Enums can early-return
311
3/4
✓ Branch 50 → 51 taken 51451 times.
✗ Branch 50 → 255 not taken.
✓ Branch 51 → 52 taken 1294 times.
✓ Branch 51 → 56 taken 50157 times.
51451 if (entryType.is(TY_ENUM))
312
2/4
✓ Branch 52 → 53 taken 1294 times.
✗ Branch 52 → 205 not taken.
✓ Branch 53 → 54 taken 1294 times.
✗ Branch 53 → 205 not taken.
2588 return QualType(TY_INT);
313
314
3/4
✓ Branch 56 → 57 taken 50157 times.
✗ Branch 56 → 206 not taken.
✓ Branch 57 → 58 taken 44408 times.
✓ Branch 57 → 168 taken 5749 times.
50157 if (entryType.isOneOf({TY_STRUCT, TY_INTERFACE})) {
315
2/4
✓ Branch 58 → 59 taken 44408 times.
✗ Branch 58 → 60 not taken.
✗ Branch 61 → 62 not taken.
✓ Branch 61 → 63 taken 44408 times.
44408 assert(dynamic_cast<DataTypeNode *>(node->parent->parent) != nullptr);
316
317 // Collect the concrete template types
318 44408 bool allTemplateTypesConcrete = true;
319 44408 QualTypeList templateTypes;
320
2/2
✓ Branch 63 → 64 taken 9285 times.
✓ Branch 63 → 104 taken 35123 times.
44408 if (node->templateTypeLst) {
321
1/2
✗ Branch 64 → 65 not taken.
✓ Branch 64 → 66 taken 9285 times.
9285 assert(defScope != nullptr);
322
1/2
✓ Branch 66 → 67 taken 9285 times.
✗ Branch 66 → 237 not taken.
9285 isImported = defScope->isImportedBy(rootScope);
323
324
1/2
✓ Branch 68 → 69 taken 9285 times.
✗ Branch 68 → 237 not taken.
9285 templateTypes.reserve(node->templateTypeLst->dataTypes.size());
325
2/2
✓ Branch 101 → 71 taken 11811 times.
✓ Branch 101 → 102 taken 9285 times.
30381 for (DataTypeNode *dataType : node->templateTypeLst->dataTypes) {
326
2/4
✓ Branch 73 → 74 taken 11811 times.
✗ Branch 73 → 209 not taken.
✓ Branch 74 → 75 taken 11811 times.
✗ Branch 74 → 207 not taken.
11811 auto templateType = std::any_cast<QualType>(visit(dataType));
327
2/6
✓ Branch 76 → 77 taken 11811 times.
✗ Branch 76 → 211 not taken.
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 80 taken 11811 times.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 211 not taken.
11811 HANDLE_UNRESOLVED_TYPE_QT(templateType)
328
2/4
✓ Branch 80 → 81 taken 11811 times.
✗ Branch 80 → 211 not taken.
✗ Branch 81 → 82 not taken.
✓ Branch 81 → 83 taken 11811 times.
11811 if (entryType.is(TY_GENERIC)) {
329 allTemplateTypesConcrete = false;
330
2/2
✓ Branch 83 → 84 taken 4638 times.
✓ Branch 83 → 90 taken 7173 times.
11811 } else if (isImported) {
331 // Introduce the local type to the imported source file
332
1/2
✓ Branch 84 → 85 taken 4638 times.
✗ Branch 84 → 210 not taken.
4638 [[maybe_unused]] QualType importedType = mapLocalTypeToImportedScopeType(defScope, templateType);
333
3/6
✓ Branch 85 → 86 taken 4638 times.
✗ Branch 85 → 210 not taken.
✓ Branch 86 → 87 taken 4638 times.
✗ Branch 86 → 210 not taken.
✗ Branch 87 → 88 not taken.
✓ Branch 87 → 89 taken 4638 times.
4638 assert(importedType.is(templateType.getSuperType()));
334 }
335
1/2
✓ Branch 90 → 91 taken 11811 times.
✗ Branch 90 → 211 not taken.
11811 templateTypes.push_back(templateType);
336 }
337
1/2
✓ Branch 102 → 103 taken 9285 times.
✗ Branch 102 → 213 not taken.
9285 entryType = entryType.getWithTemplateTypes(templateTypes);
338 }
339
340 // Check if struct is defined before the current code location, if defined in the same source file. Across files
341 // (e.g. circular imports) the order does not matter, so the check only applies within the same source file.
342 44408 const CodeLoc &declCodeLoc = entry->declNode->codeLoc;
343 44408 const CodeLoc &codeLoc = node->codeLoc;
344
6/6
✓ Branch 105 → 106 taken 22330 times.
✓ Branch 105 → 113 taken 22078 times.
✓ Branch 111 → 112 taken 1 time.
✓ Branch 111 → 113 taken 22329 times.
✓ Branch 114 → 115 taken 1 time.
✓ Branch 114 → 140 taken 44407 times.
66738 if (declCodeLoc.sourceFile->filePath == codeLoc.sourceFile->filePath && declCodeLoc > codeLoc) {
345
2/4
✓ Branch 115 → 116 taken 1 time.
✗ Branch 115 → 237 not taken.
✓ Branch 116 → 117 taken 1 time.
✗ Branch 116 → 127 not taken.
1 if (entryType.is(TY_STRUCT)) {
346
4/8
✓ Branch 119 → 120 taken 1 time.
✗ Branch 119 → 216 not taken.
✓ Branch 120 → 121 taken 1 time.
✗ Branch 120 → 214 not taken.
✓ Branch 123 → 124 taken 1 time.
✗ Branch 123 → 220 not taken.
✓ Branch 124 → 125 taken 1 time.
✗ Branch 124 → 220 not taken.
4 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_STRUCT, "Structs must be defined before usage")
347 } else {
348 assert(entryType.is(TY_INTERFACE));
349 SOFT_ERROR_QT(node, REFERENCED_UNDEFINED_INTERFACE, "Interfaces must be defined before usage")
350 }
351 }
352
353
1/2
✓ Branch 140 → 141 taken 44407 times.
✗ Branch 140 → 162 not taken.
44407 if (allTemplateTypesConcrete) { // Only do the next step, if we have concrete template types
354 // Set the struct/interface instance to used, if found
355 // Here, it is allowed to accept, that the struct/interface cannot be found, because there are self-referencing ones
356
3/4
✓ Branch 141 → 142 taken 44407 times.
✗ Branch 141 → 237 not taken.
✓ Branch 142 → 143 taken 39662 times.
✓ Branch 142 → 151 taken 4745 times.
44407 if (entryType.is(TY_STRUCT)) {
357
1/2
✓ Branch 144 → 145 taken 39662 times.
✗ Branch 144 → 231 not taken.
39662 const std::string structName = node->typeNameFragments.back();
358
3/4
✓ Branch 145 → 146 taken 39662 times.
✗ Branch 145 → 229 not taken.
✓ Branch 146 → 147 taken 38477 times.
✓ Branch 146 → 149 taken 1185 times.
39662 if (const Struct *spiceStruct = StructManager::match(defScope, structName, templateTypes, node))
359
1/2
✓ Branch 147 → 148 taken 38477 times.
✗ Branch 147 → 228 not taken.
38477 entryType = entryType.getWithBodyScope(spiceStruct->scope);
360 39662 } else {
361
2/4
✓ Branch 151 → 152 taken 4745 times.
✗ Branch 151 → 235 not taken.
✗ Branch 152 → 153 not taken.
✓ Branch 152 → 154 taken 4745 times.
4745 assert(entryType.is(TY_INTERFACE));
362
1/2
✓ Branch 155 → 156 taken 4745 times.
✗ Branch 155 → 235 not taken.
4745 const std::string interfaceName = node->typeNameFragments.back();
363
3/4
✓ Branch 156 → 157 taken 4745 times.
✗ Branch 156 → 233 not taken.
✓ Branch 157 → 158 taken 4430 times.
✓ Branch 157 → 160 taken 315 times.
4745 if (const Interface *spiceInterface = InterfaceManager::match(defScope, interfaceName, templateTypes, node))
364
1/2
✓ Branch 158 → 159 taken 4430 times.
✗ Branch 158 → 232 not taken.
4430 entryType = entryType.getWithBodyScope(spiceInterface->scope);
365 4745 }
366 }
367
368
2/4
✓ Branch 162 → 163 taken 44407 times.
✗ Branch 162 → 236 not taken.
✓ Branch 163 → 164 taken 44407 times.
✗ Branch 163 → 236 not taken.
88814 return node->setEvaluatedSymbolType(entryType, manIdx);
369 44408 }
370
371
2/4
✓ Branch 168 → 169 taken 5749 times.
✗ Branch 168 → 255 not taken.
✓ Branch 169 → 170 taken 5749 times.
✗ Branch 169 → 175 not taken.
5749 if (entryType.is(TY_ALIAS))
372
3/6
✓ Branch 170 → 171 taken 5749 times.
✗ Branch 170 → 240 not taken.
✓ Branch 171 → 172 taken 5749 times.
✗ Branch 171 → 240 not taken.
✓ Branch 172 → 173 taken 5749 times.
✗ Branch 172 → 240 not taken.
11498 return node->setEvaluatedSymbolType(entryType.getAliased(entry), manIdx);
373
374 // We tried everything to resolve it, but this type is still unknown
375 const bool isInvalid = entryType.is(TY_INVALID);
376 SOFT_ERROR_QT(node, EXPECTED_TYPE, isInvalid ? "Used type before declared" : "Expected type, but got " + entryType.getName())
377 85242 }
378
379 287 std::any TypeChecker::visitFunctionDataType(FunctionDataTypeNode *node) {
380 // Visit return type
381
1/2
✓ Branch 2 → 3 taken 287 times.
✗ Branch 2 → 80 not taken.
287 QualType returnType(TY_DYN);
382
2/2
✓ Branch 3 → 4 taken 54 times.
✓ Branch 3 → 23 taken 233 times.
287 if (node->isFunction) {
383
2/4
✓ Branch 4 → 5 taken 54 times.
✗ Branch 4 → 62 not taken.
✓ Branch 5 → 6 taken 54 times.
✗ Branch 5 → 60 not taken.
54 returnType = std::any_cast<QualType>(visit(node->returnType));
384
2/6
✓ Branch 7 → 8 taken 54 times.
✗ Branch 7 → 80 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 11 taken 54 times.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 80 not taken.
54 HANDLE_UNRESOLVED_TYPE_QT(returnType)
385
2/4
✓ Branch 11 → 12 taken 54 times.
✗ Branch 11 → 80 not taken.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 23 taken 54 times.
54 if (returnType.is(TY_DYN))
386 SOFT_ERROR_ER(node->returnType, UNEXPECTED_DYN_TYPE, "Function types cannot have return type dyn")
387 }
388
389 // Visit param types
390 287 QualTypeList paramTypes;
391
2/2
✓ Branch 23 → 24 taken 208 times.
✓ Branch 23 → 48 taken 79 times.
287 if (const TypeLstNode *paramTypeListNode = node->paramTypeLst; paramTypeListNode != nullptr) {
392
2/2
✓ Branch 46 → 26 taken 264 times.
✓ Branch 46 → 47 taken 208 times.
680 for (DataTypeNode *paramTypeNode : paramTypeListNode->dataTypes) {
393
2/4
✓ Branch 28 → 29 taken 264 times.
✗ Branch 28 → 73 not taken.
✓ Branch 29 → 30 taken 264 times.
✗ Branch 29 → 71 not taken.
264 auto paramType = std::any_cast<QualType>(visit(paramTypeNode));
394
2/6
✓ Branch 31 → 32 taken 264 times.
✗ Branch 31 → 74 not taken.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 35 taken 264 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 74 not taken.
264 HANDLE_UNRESOLVED_TYPE_QT(returnType)
395
1/2
✓ Branch 35 → 36 taken 264 times.
✗ Branch 35 → 74 not taken.
264 paramTypes.push_back(paramType);
396 }
397 }
398
399 // Build function type
400
2/2
✓ Branch 48 → 49 taken 54 times.
✓ Branch 48 → 50 taken 233 times.
287 const SuperType superType = node->isFunction ? TY_FUNCTION : TY_PROCEDURE;
401
2/4
✓ Branch 51 → 52 taken 287 times.
✗ Branch 51 → 76 not taken.
✓ Branch 52 → 53 taken 287 times.
✗ Branch 52 → 76 not taken.
287 const QualType functionType = QualType(superType).getWithFunctionParamAndReturnTypes(returnType, paramTypes);
402
403
2/4
✓ Branch 53 → 54 taken 287 times.
✗ Branch 53 → 77 not taken.
✓ Branch 54 → 55 taken 287 times.
✗ Branch 54 → 77 not taken.
574 return node->setEvaluatedSymbolType(functionType, manIdx);
404 287 }
405
406 } // namespace spice::compiler
407