Skip to content

Commit 5ca514f

Browse files
committed
Fix struct pointers, add struct support, add more tests
1 parent 74a51a8 commit 5ca514f

42 files changed

Lines changed: 614 additions & 4090 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.clang-tidy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
Checks: 'clang-diagnostic-*,clang-analyzer-*,-*,bugprone-argument-comment,bugprone-assert-side-effect,bugprone-bad-signal-to-kill-thread,bugprone-branch-clone,bugprone-copy-constructor-init,bugprone-dangling-handle,bugprone-dynamic-static-initializers,bugprone-fold-init-type,bugprone-forward-declaration-namespace,bugprone-forwarding-reference-overload,bugprone-inaccurate-erase,bugprone-incorrect-roundings,bugprone-integer-division,bugprone-lambda-function-name,bugprone-macro-parentheses,bugprone-macro-repeated-side-effects,bugprone-misplaced-operator-in-strlen-in-alloc,bugprone-misplaced-pointer-arithmetic-in-alloc,bugprone-misplaced-widening-cast,bugprone-move-forwarding-reference,bugprone-multiple-statement-macro,bugprone-no-escape,bugprone-not-null-terminated-result,bugprone-parent-virtual-call,bugprone-posix-return,bugprone-reserved-identifier,bugprone-sizeof-container,bugprone-sizeof-expression,bugprone-spuriously-wake-up-functions,bugprone-string-constructor,bugprone-string-integer-assignment,bugprone-string-literal-with-embedded-nul,bugprone-suspicious-enum-usage,bugprone-suspicious-include,bugprone-suspicious-memory-comparison,bugprone-suspicious-memset-usage,bugprone-suspicious-missing-comma,bugprone-suspicious-semicolon,bugprone-suspicious-string-compare,bugprone-swapped-arguments,bugprone-terminating-continue,bugprone-throw-keyword-missing,bugprone-too-small-loop-variable,bugprone-undefined-memory-manipulation,bugprone-undelegated-constructor,bugprone-unhandled-self-assignment,bugprone-unused-raii,bugprone-unused-return-value,bugprone-use-after-move,bugprone-virtual-near-miss,cert-dcl21-cpp,cert-dcl58-cpp,cert-err34-c,cert-err52-cpp,cert-err58-cpp,cert-err60-cpp,cert-flp30-c,cert-msc50-cpp,cert-msc51-cpp,cert-str34-c,cppcoreguidelines-interfaces-global-init,cppcoreguidelines-narrowing-conversions,cppcoreguidelines-pro-type-member-init,cppcoreguidelines-pro-type-static-cast-downcast,cppcoreguidelines-slicing,google-default-arguments,google-explicit-constructor,google-runtime-operator,hicpp-exception-baseclass,hicpp-multiway-paths-covered,misc-misplaced-const,misc-new-delete-overloads,misc-no-recursion,misc-non-copyable-objects,misc-throw-by-value-catch-by-reference,misc-unconventional-assign-operator,misc-uniqueptr-reset-release,modernize-avoid-bind,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-disallow-copy-and-assign-macro,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,mpi-buffer-deref,mpi-type-mismatch,openmp-use-default-none,performance-faster-string-find,performance-for-range-copy,performance-implicit-conversion-in-loop,performance-inefficient-algorithm,performance-inefficient-string-concatenation,performance-inefficient-vector-operation,performance-move-const-arg,performance-move-constructor-init,performance-no-automatic-move,performance-noexcept-move-constructor,performance-trivially-destructible,performance-type-promotion-in-math-fn,performance-unnecessary-copy-initialization,performance-unnecessary-value-param,portability-simd-intrinsics,readability-avoid-const-params-in-decls,readability-const-return-type,readability-container-size-empty,readability-convert-member-functions-to-static,readability-delete-null-pointer,readability-deleted-default,readability-inconsistent-declaration-parameter-name,readability-make-member-function-const,readability-misleading-indentation,readability-misplaced-array-index,readability-non-const-parameter,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-smartptr-get,readability-redundant-string-cstr,readability-redundant-string-init,readability-simplify-subscript-expr,readability-static-accessed-through-instance,readability-static-definition-in-anonymous-namespace,readability-string-compare,readability-uniqueptr-delete-release,readability-use-anyofallof'
2+
Checks: 'clang-diagnostic-*,clang-analyzer-*,-*,bugprone-argument-comment,bugprone-assert-side-effect,bugprone-bad-signal-to-kill-thread,bugprone-branch-clone,bugprone-copy-constructor-init,bugprone-dangling-handle,bugprone-dynamic-static-initializers,bugprone-fold-init-type,bugprone-forward-declaration-namespace,bugprone-forwarding-reference-overload,bugprone-inaccurate-erase,bugprone-incorrect-roundings,bugprone-integer-division,bugprone-lambda-function-name,bugprone-macro-parentheses,bugprone-macro-repeated-side-effects,bugprone-misplaced-operator-in-strlen-in-alloc,bugprone-misplaced-pointer-arithmetic-in-alloc,bugprone-misplaced-widening-cast,bugprone-move-forwarding-reference,bugprone-multiple-statement-macro,bugprone-no-escape,bugprone-not-null-terminated-result,bugprone-parent-virtual-call,bugprone-posix-return,bugprone-reserved-identifier,bugprone-sizeof-container,bugprone-sizeof-expression,bugprone-spuriously-wake-up-functions,bugprone-string-constructor,bugprone-string-integer-assignment,bugprone-string-literal-with-embedded-nul,bugprone-suspicious-enum-usage,bugprone-suspicious-include,bugprone-suspicious-memory-comparison,bugprone-suspicious-memset-usage,bugprone-suspicious-missing-comma,bugprone-suspicious-semicolon,bugprone-suspicious-string-compare,bugprone-swapped-arguments,bugprone-terminating-continue,bugprone-throw-keyword-missing,bugprone-too-small-loop-variable,bugprone-undefined-memory-manipulation,bugprone-undelegated-constructor,bugprone-unhandled-self-assignment,bugprone-unused-raii,bugprone-unused-return-value,bugprone-use-after-move,bugprone-virtual-near-miss,cert-dcl21-cpp,cert-dcl58-cpp,cert-err34-c,cert-err52-cpp,cert-err58-cpp,cert-err60-cpp,cert-flp30-c,cert-msc50-cpp,cert-msc51-cpp,cert-str34-c,cppcoreguidelines-interfaces-global-init,cppcoreguidelines-narrowing-conversions,cppcoreguidelines-pro-type-member-init,cppcoreguidelines-slicing,google-default-arguments,google-explicit-constructor,google-runtime-operator,hicpp-exception-baseclass,hicpp-multiway-paths-covered,misc-misplaced-const,misc-new-delete-overloads,misc-no-recursion,misc-non-copyable-objects,misc-throw-by-value-catch-by-reference,misc-unconventional-assign-operator,misc-uniqueptr-reset-release,modernize-avoid-bind,modernize-concat-nested-namespaces,modernize-deprecated-headers,modernize-deprecated-ios-base-aliases,modernize-loop-convert,modernize-make-shared,modernize-make-unique,modernize-pass-by-value,modernize-raw-string-literal,modernize-redundant-void-arg,modernize-replace-auto-ptr,modernize-replace-disallow-copy-and-assign-macro,modernize-replace-random-shuffle,modernize-return-braced-init-list,modernize-shrink-to-fit,modernize-unary-static-assert,modernize-use-auto,modernize-use-bool-literals,modernize-use-emplace,modernize-use-equals-default,modernize-use-equals-delete,modernize-use-nodiscard,modernize-use-noexcept,modernize-use-nullptr,modernize-use-override,modernize-use-transparent-functors,modernize-use-uncaught-exceptions,mpi-buffer-deref,mpi-type-mismatch,openmp-use-default-none,performance-faster-string-find,performance-for-range-copy,performance-implicit-conversion-in-loop,performance-inefficient-algorithm,performance-inefficient-string-concatenation,performance-inefficient-vector-operation,performance-move-const-arg,performance-move-constructor-init,performance-no-automatic-move,performance-noexcept-move-constructor,performance-trivially-destructible,performance-type-promotion-in-math-fn,performance-unnecessary-copy-initialization,performance-unnecessary-value-param,portability-simd-intrinsics,readability-avoid-const-params-in-decls,readability-const-return-type,readability-container-size-empty,readability-convert-member-functions-to-static,readability-delete-null-pointer,readability-deleted-default,readability-inconsistent-declaration-parameter-name,readability-make-member-function-const,readability-misleading-indentation,readability-misplaced-array-index,readability-non-const-parameter,readability-redundant-control-flow,readability-redundant-declaration,readability-redundant-function-ptr-dereference,readability-redundant-smartptr-get,readability-redundant-string-cstr,readability-redundant-string-init,readability-simplify-subscript-expr,readability-static-accessed-through-instance,readability-static-definition-in-anonymous-namespace,readability-string-compare,readability-uniqueptr-delete-release,readability-use-anyofallof'
33
WarningsAsErrors: '*'
44
CheckOptions:
55
- key: bugprone-argument-comment.CommentBoolLiterals

src/analysis/type_check.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,41 @@ void TypeVisitor::emit_error(const SourceLocation &loc,
66
const std::string &message) {
77
diagnostics->error(loc, message).with_snippet(*source_manager);
88
}
9+
// Im TypeChecker oder einem eigenen Pass:
910

11+
void TypeVisitor::register_builtins() {
12+
// void print_int(int x)
13+
register_extern("print_int", types.get_void(), {types.get_int()});
14+
register_extern("println", types.get_void(), {});
15+
register_extern("print_bool", types.get_void(), {types.get_bool()});
16+
register_extern("print_char", types.get_void(), {types.get_int()});
17+
register_extern("print_int_ln", types.get_void(), {types.get_int()});
18+
19+
// int read_int()
20+
register_extern("read_int", types.get_int(), {});
21+
register_extern("read_char", types.get_int(), {});
22+
23+
// void exit(int code)
24+
register_extern("exit", types.get_void(), {types.get_int()});
25+
register_extern("abort", types.get_void(), {});
26+
register_extern("assert", types.get_void(), {types.get_bool()});
27+
}
28+
29+
void TypeVisitor::register_extern(
30+
const std::string &name, const source_type::Type *ret_type,
31+
std::vector<const source_type::Type *> params) {
32+
33+
std::vector<source_type::QualType> param_quals;
34+
param_quals.reserve(params.size());
35+
for (auto *p : params)
36+
param_quals.emplace_back(p);
37+
38+
auto *func_type =
39+
types.get_function(source_type::QualType(ret_type), param_quals);
40+
auto *sym =
41+
symbol_table->create_function(name, {}, ret_type, func_type, true);
42+
symbol_table->define(sym);
43+
}
1044
const source_type::Type *
1145
TypeVisitor::resolve_underlying(const source_type::Type *t) {
1246
return types.resolve_through_typedefs(t);

src/analysis/type_check.hpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class TypeVisitor : public ASTVisitor {
1414
bool has_return = false;
1515

1616
arena::Arena arena;
17-
source_type::TypeRegistry types;
17+
source_type::TypeRegistry &types;
1818

1919
std::shared_ptr<DiagnosticEmitter> diagnostics;
2020
std::shared_ptr<SourceManager> source_manager;
@@ -25,15 +25,20 @@ class TypeVisitor : public ASTVisitor {
2525
const source_type::Type *resolve_underlying(const source_type::Type *t);
2626
bool is_small_type(const source_type::Type *t);
2727
const source_type::Type *lvalue_type(const LValue &val);
28+
void register_builtins();
29+
void register_extern(const std::string &name,
30+
const source_type::Type *ret_type,
31+
std::vector<const source_type::Type *> params);
2832

2933
public:
3034
explicit TypeVisitor(std::shared_ptr<DiagnosticEmitter> diagnostics,
3135
std::shared_ptr<SourceManager> source_manager,
32-
std::shared_ptr<SymbolTable> symbol_table)
36+
std::shared_ptr<SymbolTable> symbol_table,
37+
source_type::TypeRegistry &types)
3338
: diagnostics(std::move(diagnostics)),
3439
source_manager(std::move(source_manager)),
3540
symbol_table(std::move(symbol_table)), arena(arena::Arena{}),
36-
types(arena) {}
41+
types(types) {}
3742

3843
// ── Top Level ────────────────────────────────────────
3944
void visit(TranslationUnit &unit) override;

src/defs/type.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@ bool PointerType::equals(const Type &other) const {
77
const auto &otherPtr = dynamic_cast<const PointerType &>(other);
88
if (!to || !otherPtr.to)
99
return !to && !otherPtr.to; // Both null or both not null
10-
if (auto *struct_type = dynamic_cast<const StructType *>(otherPtr.to))
11-
printf("%p: %s\n", otherPtr.to, struct_type->toString().c_str());
1210
return to->equals(*otherPtr.to);
1311
}
1412
bool StructType::equals(const Type &other) const {
1513

16-
printf("Struct eq: %s\n", other.toString().c_str());
1714
return other.kind == Kind::Struct &&
1815
name == dynamic_cast<const StructType &>(other).name;
1916
}

src/hir/hir_builder.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,10 @@ hir::Value *HIRBuilder::build_load(hir::type::Type *loaded_type,
168168
hir::Value *ptr, std::string_view name) {
169169
auto *instruction = arena.create<hir::Instruction>(
170170
hir::Opcode::Load, loaded_type, std::vector<hir::Value *>{ptr});
171+
std::cout << "Emitting load for types " << loaded_type->to_string()
172+
<< " ptr type: " << ptr->type->to_string() << std::endl;
171173
instruction->name = name;
172-
instruction->type_arg = ptr->type;
174+
instruction->type_arg = loaded_type;
173175
return insert(instruction);
174176
}
175177

@@ -261,9 +263,6 @@ hir::Value *HIRBuilder::build_call(hir::Function *callee,
261263
assert(args.size() == callee->function_type->param_types.size() &&
262264
"argument count mismatch");
263265
for (size_t i = 0; i < args.size(); i++) {
264-
std::cout << callee->to_string() << " args: " << args[i]->type->to_string()
265-
<< " " << callee->function_type->param_types[i]->to_string()
266-
<< std::endl;
267266
assert(args[i]->type == callee->function_type->param_types[i] &&
268267
"argument type mismatch");
269268
}

0 commit comments

Comments
 (0)