• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

rieske / trans / 28460339749

30 Jun 2026 04:35PM UTC coverage: 90.401% (-0.1%) from 90.53%
28460339749

Pull #44

github

rieske
Simplify struct field codegen to FieldAddress only

Drop FieldLoad/FieldStore; materialize the field address then reuse
Dereference for reads and LvalueAssign for writes. Keep a single
baseIsPointer flag on FieldAddress for dot vs arrow.
Pull Request #44: Implement C structs with member access

236 of 282 new or added lines in 12 files covered. (83.69%)

7 existing lines in 2 files now uncovered.

5349 of 5917 relevant lines covered (90.4%)

235740.3 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.11
/src/ast/AbstractSyntaxTreeBuilderContext.cpp
1
#include "AbstractSyntaxTreeBuilderContext.h"
2

3
namespace ast {
4

5
AbstractSyntaxTreeBuilderContext::AbstractSyntaxTreeBuilderContext() {
384 ✔
6
}
384 ✔
7

8
void AbstractSyntaxTreeBuilderContext::pushTerminal(TerminalSymbol terminal) {
17,324 ✔
9
    terminalSymbols.push(terminal);
17,324 ✔
10
}
17,324 ✔
11

12
TerminalSymbol AbstractSyntaxTreeBuilderContext::popTerminal() {
17,254 ✔
13
    auto terminal = terminalSymbols.top();
17,254 ✔
14
    terminalSymbols.pop();
17,254 ✔
15
    return terminal;
17,254 ✔
16
}
17

18
void AbstractSyntaxTreeBuilderContext::pushTypeSpecifier(TypeSpecifier typeSpecifier) {
1,162 ✔
19
    typeSpecifiers.push(typeSpecifier);
1,162 ✔
20
}
1,162 ✔
21

22
TypeSpecifier AbstractSyntaxTreeBuilderContext::popTypeSpecifier() {
1,162 ✔
23
    auto typeSpecifier = typeSpecifiers.top();
1,162 ✔
24
    typeSpecifiers.pop();
1,162 ✔
25
    return typeSpecifier;
1,162 ✔
26
}
27

28
void AbstractSyntaxTreeBuilderContext::pushStorageSpecifier(StorageSpecifier storageSpecifier) {
×
29
    storageSpecifiers.push(storageSpecifier);
×
30
}
×
31

32
StorageSpecifier AbstractSyntaxTreeBuilderContext::popStorageSpecifier() {
×
33
    auto storageSpecifier = storageSpecifiers.top();
×
34
    storageSpecifiers.pop();
×
35
    return storageSpecifier;
×
36
}
37

38
void AbstractSyntaxTreeBuilderContext::pushTypeQualifier(type::Qualifier typeQualifier) {
×
39
    typeQualifiers.push(typeQualifier);
×
40
}
×
41

42
type::Qualifier AbstractSyntaxTreeBuilderContext::popTypeQualifier() {
×
43
    auto typeQualifier = typeQualifiers.top();
×
44
    typeQualifiers.pop();
×
45
    return typeQualifier;
×
46
}
47

48
void AbstractSyntaxTreeBuilderContext::pushConstant(Constant constant) {
1,260 ✔
49
    constants.push(constant);
1,260 ✔
50
}
1,260 ✔
51

52
Constant AbstractSyntaxTreeBuilderContext::popConstant() {
1,260 ✔
53
    auto constant = constants.top();
1,260 ✔
54
    constants.pop();
1,260 ✔
55
    return constant;
1,260 ✔
56
}
57

58
void AbstractSyntaxTreeBuilderContext::pushExpression(std::unique_ptr<Expression> expression) {
7,122 ✔
59
    expressionStack.push(std::move(expression));
7,122 ✔
60
}
7,122 ✔
61

62
std::unique_ptr<Expression> AbstractSyntaxTreeBuilderContext::popExpression() {
7,120 ✔
63
    auto expression = std::move(expressionStack.top());
7,120 ✔
64
    expressionStack.pop();
7,120 ✔
65
    return expression;
7,120 ✔
66
}
67

68
void AbstractSyntaxTreeBuilderContext::newActualArgumentsList(std::unique_ptr<Expression> argument) {
888 ✔
69
    std::vector<std::unique_ptr<Expression>> arguments;
888 ✔
70
    arguments.push_back(std::move(argument));
888 ✔
71
    actualArgumentLists.push(std::move(arguments));
888 ✔
72
}
888 ✔
73

74
void AbstractSyntaxTreeBuilderContext::addToActualArgumentsList(std::unique_ptr<Expression> argument) {
1,094 ✔
75
    actualArgumentLists.top().push_back(std::move(argument));
1,094 ✔
76
}
1,094 ✔
77

78
std::vector<std::unique_ptr<Expression>> AbstractSyntaxTreeBuilderContext::popActualArgumentsList() {
888 ✔
79
    auto arguments = std::move(actualArgumentLists.top());
888 ✔
80
    actualArgumentLists.pop();
888 ✔
81
    return arguments;
888 ✔
82
}
83

84
void AbstractSyntaxTreeBuilderContext::newPointer(Pointer pointer) {
68 ✔
85
    pointerStack.push(std::vector<Pointer> { pointer });
204 ✔
86
}
136 ✔
87

88
void AbstractSyntaxTreeBuilderContext::pointerToPointer(Pointer pointer) {
×
89
    pointerStack.top().push_back(pointer);
×
90
}
×
91

92
std::vector<Pointer> AbstractSyntaxTreeBuilderContext::popPointers() {
68 ✔
93
    auto pointers = pointerStack.top();
68 ✔
94
    pointerStack.pop();
68 ✔
95
    return pointers;
68 ✔
96
}
97

98
void AbstractSyntaxTreeBuilderContext::pushStatement(std::unique_ptr<AbstractSyntaxTreeNode> statement) {
2,938 ✔
99
    statementStack.push(std::move(statement));
2,938 ✔
100
}
2,938 ✔
101

102
std::unique_ptr<AbstractSyntaxTreeNode> AbstractSyntaxTreeBuilderContext::popStatement() {
2,938 ✔
103
    auto statement = std::move(statementStack.top());
2,938 ✔
104
    statementStack.pop();
2,938 ✔
105
    return statement;
2,938 ✔
106
}
107

108
void AbstractSyntaxTreeBuilderContext::pushDirectDeclarator(std::unique_ptr<DirectDeclarator> declarator) {
1,752 ✔
109
    directDeclarators.push(std::move(declarator));
1,752 ✔
110
}
1,752 ✔
111

112
std::unique_ptr<DirectDeclarator> AbstractSyntaxTreeBuilderContext::popDirectDeclarator() {
1,752 ✔
113
    auto declarator = std::move(directDeclarators.top());
1,752 ✔
114
    directDeclarators.pop();
1,752 ✔
115
    return declarator;
1,752 ✔
116
}
117

118
void AbstractSyntaxTreeBuilderContext::pushDeclarator(std::unique_ptr<Declarator> declarator) {
1,276 ✔
119
    declarators.push(std::move(declarator));
1,276 ✔
120
}
1,276 ✔
121

122
std::unique_ptr<Declarator> AbstractSyntaxTreeBuilderContext::popDeclarator() {
1,274 ✔
123
    auto declarator = std::move(declarators.top());
1,274 ✔
124
    declarators.pop();
1,274 ✔
125
    return declarator;
1,274 ✔
126
}
127

128
void AbstractSyntaxTreeBuilderContext::pushInitializedDeclarator(std::unique_ptr<InitializedDeclarator> initializedDeclarator) {
620 ✔
129
    initializedDeclarators.push(std::move(initializedDeclarator));
620 ✔
130
}
620 ✔
131

132
std::unique_ptr<InitializedDeclarator> AbstractSyntaxTreeBuilderContext::popInitializedDeclarator() {
620 ✔
133
    auto initializedDeclarator = std::move(initializedDeclarators.top());
620 ✔
134
    initializedDeclarators.pop();
620 ✔
135
    return initializedDeclarator;
620 ✔
136
}
137

138
void AbstractSyntaxTreeBuilderContext::pushInitializedDeclarators(std::vector<std::unique_ptr<InitializedDeclarator> > declarators) {
620 ✔
139
    initializedDeclaratorLists.push(std::move(declarators));
620 ✔
140
}
620 ✔
141

142
std::vector<std::unique_ptr<InitializedDeclarator> > AbstractSyntaxTreeBuilderContext::popInitializedDeclarators() {
620 ✔
143
    auto declarators = std::move(initializedDeclaratorLists.top());
620 ✔
144
    initializedDeclaratorLists.pop();
620 ✔
145
    return declarators;
620 ✔
146
}
147

148
void AbstractSyntaxTreeBuilderContext::pushDeclarationList(std::vector<std::unique_ptr<Declaration>> declarationList) {
382 ✔
149
    declarationLists.push(std::move(declarationList));
382 ✔
150
}
382 ✔
151

152
std::vector<std::unique_ptr<Declaration>> AbstractSyntaxTreeBuilderContext::popDeclarationList() {
382 ✔
153
    auto declarationList = std::move(declarationLists.top());
382 ✔
154
    declarationLists.pop();
382 ✔
155
    return declarationList;
382 ✔
156
}
157

158
void AbstractSyntaxTreeBuilderContext::pushFormalArgument(FormalArgument formalArgument) {
170 ✔
159
    formalArguments.push(std::move(formalArgument));
170 ✔
160
}
170 ✔
161

162
FormalArgument AbstractSyntaxTreeBuilderContext::popFormalArgument() {
170 ✔
163
    auto parameter = std::move(formalArguments.top());
170 ✔
164
    formalArguments.pop();
170 ✔
165
    return parameter;
170 ✔
166
}
167

168
void AbstractSyntaxTreeBuilderContext::pushFormalArguments(FormalArguments formalArguments) {
170 ✔
169
    formalArgumentLists.push(std::move(formalArguments));
170 ✔
170
}
170 ✔
171

172
FormalArguments AbstractSyntaxTreeBuilderContext::popFormalArguments() {
170 ✔
173
    auto formalArguments = std::move(formalArgumentLists.top());
170 ✔
174
    formalArgumentLists.pop();
170 ✔
175
    return formalArguments;
170 ✔
176
}
177

178
void AbstractSyntaxTreeBuilderContext::pushArgumentsDeclaration(std::pair<FormalArguments, bool> argumentsDeclaration) {
70 ✔
179
    argumentsDeclarations.push(std::move(argumentsDeclaration));
70 ✔
180
}
70 ✔
181

182
std::pair<FormalArguments, bool> AbstractSyntaxTreeBuilderContext::popArgumentsDeclaration() {
70 ✔
183
    auto argumentsDeclaration = std::move(argumentsDeclarations.top());
70 ✔
184
    argumentsDeclarations.pop();
70 ✔
185
    return argumentsDeclaration;
70 ✔
186
}
187

188
void AbstractSyntaxTreeBuilderContext::pushDeclarationSpecifiers(DeclarationSpecifiers declarationSpecifiers) {
1,150 ✔
189
    declarationSpecifiersStack.push(std::move(declarationSpecifiers));
1,150 ✔
190
}
1,150 ✔
191

192
DeclarationSpecifiers AbstractSyntaxTreeBuilderContext::popDeclarationSpecifiers() {
1,148 ✔
193
    auto declarationSpecifiers = std::move(declarationSpecifiersStack.top());
1,148 ✔
194
    declarationSpecifiersStack.pop();
1,148 ✔
195
    return declarationSpecifiers;
1,148 ✔
196
}
197

198
void AbstractSyntaxTreeBuilderContext::pushDeclaration(std::unique_ptr<Declaration> declaration) {
504 ✔
199
    declarations.push(std::move(declaration));
504 ✔
200
}
504 ✔
201

202
void AbstractSyntaxTreeBuilderContext::newTypeQualifierList(type::Qualifier qualifier) {
×
203
    typeQualifierLists.push( { qualifier });
×
204
}
×
205

206
void AbstractSyntaxTreeBuilderContext::addToTypeQualifierList(type::Qualifier qualifier) {
×
207
    typeQualifierLists.top().push_back(qualifier);
×
208
}
×
209

210
std::vector<type::Qualifier> AbstractSyntaxTreeBuilderContext::popTypeQualifierList() {
×
211
    auto qualifiers = typeQualifierLists.top();
×
212
    typeQualifierLists.pop();
×
213
    return qualifiers;
×
214
}
215

216
std::unique_ptr<Declaration> AbstractSyntaxTreeBuilderContext::popDeclaration() {
504 ✔
217
    auto declaration = std::move(declarations.top());
504 ✔
218
    declarations.pop();
504 ✔
219
    return declaration;
504 ✔
220
}
221

222
void AbstractSyntaxTreeBuilderContext::newStatementList(std::unique_ptr<AbstractSyntaxTreeNode> statement) {
574 ✔
223
    std::vector<std::unique_ptr<AbstractSyntaxTreeNode>> statements;
574 ✔
224
    statements.push_back(std::move(statement));
574 ✔
225
    statementLists.push(std::move(statements));
574 ✔
226
}
574 ✔
227

228
void AbstractSyntaxTreeBuilderContext::addToStatementList(std::unique_ptr<AbstractSyntaxTreeNode> statement) {
1,314 ✔
229
    statementLists.top().push_back(std::move(statement));
1,314 ✔
230
}
1,314 ✔
231

232
std::vector<std::unique_ptr<AbstractSyntaxTreeNode>> AbstractSyntaxTreeBuilderContext::popStatementList() {
574 ✔
233
    auto statements = std::move(statementLists.top());
574 ✔
234
    statementLists.pop();
574 ✔
235
    return statements;
574 ✔
236
}
237

238
void AbstractSyntaxTreeBuilderContext::pushExternalDeclaration(std::unique_ptr<AbstractSyntaxTreeNode> externalDeclaration) {
596 ✔
239
    externalDeclarations.push(std::move(externalDeclaration));
596 ✔
240
}
596 ✔
241

242
std::unique_ptr<AbstractSyntaxTreeNode> AbstractSyntaxTreeBuilderContext::popExternalDeclaration() {
596 ✔
243
    auto externalDeclaration = std::move(externalDeclarations.top());
596 ✔
244
    externalDeclarations.pop();
596 ✔
245
    return externalDeclaration;
596 ✔
246
}
247

248
void AbstractSyntaxTreeBuilderContext::addToTranslationUnit(std::unique_ptr<AbstractSyntaxTreeNode> externalDeclaration) {
596 ✔
249
    translationUnit.push_back(std::move(externalDeclaration));
596 ✔
250
}
596 ✔
251

252
std::vector<std::unique_ptr<AbstractSyntaxTreeNode> > AbstractSyntaxTreeBuilderContext::popTranslationUnit() {
382 ✔
253
    return std::move(translationUnit);
382 ✔
254
}
255

NEW
256
void AbstractSyntaxTreeBuilderContext::newStructMemberList() {
×
NEW
257
    structMemberLists.push({});
×
NEW
258
}
×
259

260
void AbstractSyntaxTreeBuilderContext::addStructMember(std::string name, type::Type type) {
12 ✔
261
    if (structMemberLists.empty()) {
12 ✔
262
        structMemberLists.push({});
6 ✔
263
    }
264
    structMemberLists.top().emplace_back(std::move(name), std::move(type));
12 ✔
265
}
12 ✔
266

NEW
267
void AbstractSyntaxTreeBuilderContext::addStructMembersFromList(std::vector<std::pair<std::string, type::Type>> members) {
×
NEW
268
    for (auto& m : members) {
×
NEW
269
        structMemberLists.top().push_back(std::move(m));
×
270
    }
NEW
271
}
×
272

273
std::vector<std::pair<std::string, type::Type>> AbstractSyntaxTreeBuilderContext::popStructMemberList() {
6 ✔
274
    auto list = std::move(structMemberLists.top());
6 ✔
275
    structMemberLists.pop();
6 ✔
276
    return list;
6 ✔
277
}
278

NEW
279
void AbstractSyntaxTreeBuilderContext::pushStructMemberList(std::vector<std::pair<std::string, type::Type>> members) {
×
NEW
280
    structMemberLists.push(std::move(members));
×
NEW
281
}
×
282

283

NEW
284
void AbstractSyntaxTreeBuilderContext::newStructDeclaratorNameList() {
×
NEW
285
    structDeclaratorNameLists.push({});
×
NEW
286
}
×
287

288
void AbstractSyntaxTreeBuilderContext::addStructDeclaratorName(std::string name) {
12 ✔
289
    if (structDeclaratorNameLists.empty()) {
12 ✔
290
        structDeclaratorNameLists.push({});
12 ✔
291
    }
292
    structDeclaratorNameLists.top().push_back(std::move(name));
12 ✔
293
}
12 ✔
294

295
std::vector<std::string> AbstractSyntaxTreeBuilderContext::popStructDeclaratorNameList() {
12 ✔
296
    auto list = std::move(structDeclaratorNameLists.top());
12 ✔
297
    structDeclaratorNameLists.pop();
12 ✔
298
    return list;
12 ✔
299
}
300

301

302
void AbstractSyntaxTreeBuilderContext::defineStructTag(const std::string& tag, type::Type type) {
6 ✔
303
    if (!tag.empty()) {
6 ✔
304
        structTags.insert_or_assign(tag, std::move(type));
6 ✔
305
    }
306
}
6 ✔
307

308
std::optional<type::Type> AbstractSyntaxTreeBuilderContext::lookupStructTag(const std::string& tag) const {
8 ✔
309
    auto it = structTags.find(tag);
8 ✔
310
    if (it == structTags.end()) {
8 ✔
NEW
311
        return std::nullopt;
×
312
    }
313
    return it->second;
8 ✔
314
}
315

316
} // namespace ast
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc