diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..d30ad2f
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,21 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 4
+
+[*.{json,yml,yaml}]
+indent_size = 2
+
+[CMakeLists.txt]
+indent_size = 2
+
+[*.cmake]
+indent_size = 2
+
+[Makefile]
+indent_style = tab
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..d0d6371
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+* text=auto eol=lf
+*.png binary
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..b8b569a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,18 @@
+---
+name: Bug report
+about: The compiler, runtime or tooling misbehaves
+labels: bug
+---
+
+**Uinx version / commit**
+
+**Host and target triple**
+
+**Smallest reproducing source**
+
+```uinx
+```
+
+**Command line**
+
+**Expected vs. actual behavior**
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..deb81dc
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: true
+contact_links:
+ - name: Security report
+ url: https://github.com/ViudiraTech/Uinx/blob/main/SECURITY.md
+ about: Compiler crashes, borrow-checker soundness failures and memory-safety escapes
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..1ae9643
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,10 @@
+## Summary
+
+
+
+## Checklist
+
+- [ ] `cmake --preset ci && cmake --build --preset ci && ctest --preset ci` passes
+- [ ] `clang-format` is clean (`cmake --build
--target format`)
+- [ ] New language behavior has a test under `tests/` (`conformance/`, `safety/`, `codegen/` or `runtime/`)
+- [ ] User-visible changes are recorded in `CHANGELOG.md`
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..434d300
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,46 @@
+name: CI
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ci-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ build-test:
+ name: ${{ matrix.compiler }} / ${{ matrix.preset }}
+ runs-on: ubuntu-24.04
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - { compiler: gcc, cc: gcc, cxx: g++, preset: ci }
+ - { compiler: clang, cc: clang, cxx: clang++, preset: ci }
+ - { compiler: clang, cc: clang, cxx: clang++, preset: asan }
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install toolchain
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y --no-install-recommends ninja-build clang lld
+ - name: Configure
+ run: cmake --preset ${{ matrix.preset }} -DCMAKE_C_COMPILER=${{ matrix.cc }} -DCMAKE_CXX_COMPILER=${{ matrix.cxx }}
+ - name: Build
+ run: cmake --build --preset ${{ matrix.preset }}
+ - name: Test
+ run: ctest --preset ${{ matrix.preset }}
+
+ format:
+ runs-on: ubuntu-24.04
+ steps:
+ - uses: actions/checkout@v4
+ - name: Install clang-format
+ run: sudo apt-get update && sudo apt-get install -y --no-install-recommends clang-format
+ - name: Check formatting
+ run: git ls-files '*.cpp' '*.hpp' '*.c' '*.h' | xargs clang-format --dry-run --Werror
diff --git a/.gitignore b/.gitignore
index 8c28f11..799a4e6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,19 @@
+# Build trees
/build/
/build-*/
/Testing/
+CMakeUserPresets.json
+compile_commands.json
+
+# Uinx outputs
.uinx/
target/
*.o
*.ll
*.elf
+
+# Editor / tooling
*.vsix
+.vscode/
+.idea/
+.cache/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6919d11..28a5f87 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@
**Copyright © 2026 ViudiraTech · Code by JiTianYu391**
+- Fixed a heap-use-after-free in `uinx::Type` copy assignment (`t = *t.pointee`) found by AddressSanitizer.
+- Repository hygiene: added `CMakePresets.json`, GitHub Actions CI (GCC, Clang, ASan/UBSan, clang-format), issue/PR templates, `CONTRIBUTING.md`, `.editorconfig` and `.gitattributes`; moved `ARCHITECTURE.md` and `BUILD.md` into `docs/`; moved test registration into `tests/CMakeLists.txt`; added `UINX_WARNINGS_AS_ERRORS` and `UINX_ENABLE_SANITIZERS` options; removed the stale `MANIFEST.sha256` and checked-in `verification/` transcripts.
- Reworked borrow checking around backward liveness plus forward control-flow fixed points instead of block-local statement numbering.
- Added HIR `SymbolId`-based place identity so shadowed locals cannot erase or inherit another binding's move/loan state.
- Added partial move/reinitialization tracking, branch/loop joins, break/continue/return reachability handling, field-level reference provenance, method-receiver provenance, aggregate escape checking, and conservative async suspension checks.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 326918b..94dc470 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -12,11 +12,26 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
option(UINX_BUILD_TESTS "Build Uinx compiler tests" ON)
option(UINX_BUILD_FUZZ "Build libFuzzer targets when supported" OFF)
+option(UINX_WARNINGS_AS_ERRORS "Treat compiler warnings as errors" OFF)
+option(UINX_ENABLE_SANITIZERS "Build with AddressSanitizer and UndefinedBehaviorSanitizer" OFF)
if(MSVC)
add_compile_options(/W4 /permissive-)
+ if(UINX_WARNINGS_AS_ERRORS)
+ add_compile_options(/WX)
+ endif()
else()
add_compile_options(-Wall -Wextra -Wpedantic -Wconversion -Wshadow)
+ if(UINX_WARNINGS_AS_ERRORS)
+ add_compile_options(-Werror)
+ endif()
+ if(UINX_ENABLE_SANITIZERS)
+ # C++ only: the C runtime is linked into programs built by uinxc, which are
+ # not sanitized.
+ add_compile_options($<$:-fsanitize=address,undefined>
+ $<$:-fno-omit-frame-pointer>)
+ add_link_options(-fsanitize=address,undefined)
+ endif()
endif()
add_library(uinx_compiler
@@ -76,30 +91,7 @@ endif()
if(UINX_BUILD_TESTS)
enable_testing()
- add_executable(uinx-unit-tests tests/unit/compiler_unit.cpp)
- target_link_libraries(uinx-unit-tests PRIVATE uinx_compiler)
- add_test(NAME unit.compiler COMMAND uinx-unit-tests)
- add_executable(uinx-runtime-tests tests/unit/runtime_unit.c)
- target_link_libraries(uinx-runtime-tests PRIVATE uinx_runtime)
- add_test(NAME unit.runtime COMMAND uinx-runtime-tests)
- add_test(NAME codegen.asm-object COMMAND $ ${CMAKE_CURRENT_SOURCE_DIR}/tests/codegen/asm/x86_64_nop.ux --emit=obj -o ${CMAKE_CURRENT_BINARY_DIR}/asm-test.o)
- add_test(NAME codegen.asm-input-output COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/codegen/asm/x86_64_io.ux -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/asm-io -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
- add_test(NAME codegen.asm-inout COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/codegen/asm/x86_64_inout.ux -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/asm-inout -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
- add_test(NAME codegen.asm-multiple-outputs COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/codegen/asm/x86_64_multiout.ux -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/asm-multiout -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
- add_test(NAME runtime.slice-index-bounds COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/conformance/pass/slice_index.ux -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/slice-index -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
- add_test(NAME runtime.slice-index-oob-traps COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/conformance/pass/slice_oob.ux -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/slice-oob -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunExpectedRuntimeFailure.cmake)
- add_test(NAME runtime.c-ffi COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/examples/c_ffi.ux -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/c-ffi -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
- add_test(NAME headers.enabled COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/headers/main.ux -DINCLUDE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/tests/headers/include -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/header-test -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunHeaderTest.cmake)
- add_test(NAME codegen.cross-target-objects COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/examples/freestanding.ux -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunCrossTargetTests.cmake)
- add_test(NAME codegen.asm-cross-targets COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/codegen/asm/cross_nop.ux -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunAsmCrossTargets.cmake)
- add_test(NAME codegen.asm-invalid-target-register COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/codegen/asm/invalid_aarch64_reg.ux -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/asm-invalid.o -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunInvalidAsmConstraint.cmake)
- add_test(NAME codegen.baremetal-cross-link COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DCLANG=clang -DLD_LLD=ld.lld -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/examples/baremetal -DBINARY_DIR=${CMAKE_CURRENT_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunBareMetalTests.cmake)
- add_test(NAME runtime.async-suspend-resume COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${CMAKE_CURRENT_SOURCE_DIR}/tests/runtime/async/suspend_resume.ux -DUINX_OBJ=${CMAKE_CURRENT_BINARY_DIR}/async-test.o -DCLANG=clang -DRUNTIME_INCLUDE=${CMAKE_CURRENT_SOURCE_DIR}/runtime -DHARNESS=${CMAKE_CURRENT_SOURCE_DIR}/tests/support/async_harness.c -DRUNTIME_LIB=$ -DOUTPUT=${CMAKE_CURRENT_BINARY_DIR}/async-test -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunAsyncTest.cmake)
- add_test(NAME conformance.positive COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/tests/conformance/pass -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunPassTests.cmake)
- add_test(NAME conformance.negative COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/tests/conformance/fail -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunFailTests.cmake)
- add_test(NAME safety.borrow-negative COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/tests/safety/borrow-fail -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunFailTests.cmake)
- add_test(NAME safety.smp-negative COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/tests/safety/smp-fail -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunFailTests.cmake)
- add_test(NAME tooling.package-integration COMMAND ${CMAKE_COMMAND} -DUINX=$ -DWORK=${CMAKE_CURRENT_BINARY_DIR}/package-tooling -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/RunPackageToolingTest.cmake)
+ add_subdirectory(tests)
endif()
if(UINX_BUILD_FUZZ AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
diff --git a/CMakePresets.json b/CMakePresets.json
new file mode 100644
index 0000000..be10e4e
--- /dev/null
+++ b/CMakePresets.json
@@ -0,0 +1,68 @@
+{
+ "version": 6,
+ "cmakeMinimumRequired": { "major": 3, "minor": 25, "patch": 0 },
+ "configurePresets": [
+ {
+ "name": "base",
+ "hidden": true,
+ "generator": "Ninja",
+ "binaryDir": "${sourceDir}/build/${presetName}"
+ },
+ {
+ "name": "debug",
+ "inherits": "base",
+ "displayName": "Debug",
+ "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug" }
+ },
+ {
+ "name": "release",
+ "inherits": "base",
+ "displayName": "Release",
+ "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" }
+ },
+ {
+ "name": "ci",
+ "inherits": "release",
+ "displayName": "CI (Release, warnings as errors)",
+ "cacheVariables": { "UINX_WARNINGS_AS_ERRORS": "ON" }
+ },
+ {
+ "name": "asan",
+ "inherits": "base",
+ "displayName": "Debug + ASan/UBSan",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "Debug",
+ "UINX_ENABLE_SANITIZERS": "ON"
+ }
+ },
+ {
+ "name": "fuzz",
+ "inherits": "release",
+ "displayName": "Clang + libFuzzer",
+ "cacheVariables": {
+ "CMAKE_C_COMPILER": "clang",
+ "CMAKE_CXX_COMPILER": "clang++",
+ "UINX_BUILD_FUZZ": "ON"
+ }
+ }
+ ],
+ "buildPresets": [
+ { "name": "debug", "configurePreset": "debug" },
+ { "name": "release", "configurePreset": "release" },
+ { "name": "ci", "configurePreset": "ci" },
+ { "name": "asan", "configurePreset": "asan" },
+ { "name": "fuzz", "configurePreset": "fuzz" }
+ ],
+ "testPresets": [
+ {
+ "name": "default",
+ "hidden": true,
+ "output": { "outputOnFailure": true }
+ },
+ { "name": "debug", "inherits": "default", "configurePreset": "debug" },
+ { "name": "release", "inherits": "default", "configurePreset": "release" },
+ { "name": "ci", "inherits": "default", "configurePreset": "ci" },
+ { "name": "asan", "inherits": "default", "configurePreset": "asan" },
+ { "name": "fuzz", "inherits": "default", "configurePreset": "fuzz" }
+ ]
+}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..3e59d1c
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,56 @@
+# Contributing to Uinx
+
+Thanks for helping out. Security-relevant reports (compiler crashes,
+borrow-checker soundness failures, safe-language memory-safety escapes) should
+follow [SECURITY.md](SECURITY.md) instead of the public issue tracker.
+
+## Build and test
+
+```sh
+cmake --preset ci
+cmake --build --preset ci
+ctest --preset ci
+```
+
+Other presets: `debug`, `release`, `asan` (ASan + UBSan), `fuzz` (Clang +
+libFuzzer). Toolchain requirements are listed in [docs/BUILD.md](docs/BUILD.md).
+
+## Repository layout
+
+| Path | Contents |
+|---|---|
+| `include/uinx/` | public compiler headers |
+| `src/` | compiler front end, borrow checker, MIR, LLVM IR backend |
+| `tools/` | `uinx`, `uinxc`, `uinx-lsp` executables |
+| `runtime/` | C runtime linked into hosted programs |
+| `stdlib/` | standard library in Uinx |
+| `tests/` | unit, conformance, safety, codegen and runtime tests |
+| `cmake/` | CTest driver scripts (`Run*.cmake`) |
+| `examples/` | sample programs, also exercised by tests |
+| `fuzz/`, `benchmarks/` | libFuzzer targets and compiler benchmark |
+| `editors/` | editor integrations (VS Code) |
+| `docs/` | specification, architecture, build and design documents |
+
+## Tests
+
+Every language-level change needs a test in `tests/`; see
+[tests/README.md](tests/README.md). Negative tests must carry the stable
+`EXPECT-DIAGNOSTIC` code they are meant to hit.
+
+## Style
+
+C and C++ are formatted with `clang-format` using the checked-in `.clang-format`:
+
+```sh
+cmake --build build/ci --target format
+```
+
+CI runs `clang-format --dry-run --Werror` and builds with warnings as errors.
+
+## Commits and pull requests
+
+Use short imperative subjects, preferably `area: change` (for example
+`borrowck: reject dangling field reference`). Record user-visible changes in
+[CHANGELOG.md](CHANGELOG.md).
+
+Build outputs, logs and benchmark transcripts are not committed.
diff --git a/MANIFEST.sha256 b/MANIFEST.sha256
deleted file mode 100644
index cbd4b29..0000000
--- a/MANIFEST.sha256
+++ /dev/null
@@ -1,159 +0,0 @@
-1f159c7a91d45246e64fd7ab1a33f812427934ae7f3677fef11dc9885b1486d2 ./ARCHITECTURE.md
-9203c45e4c1f7fe10d0042f76b3e7b13d99964ec3f776ff3ee9f5eb095fc61d0 ./AUTHORS
-13281227f5cd05ddd3c3ee1dac8268fa9740ab89b127acdd6b956e27e26ccd42 ./BUILD.md
-c001125f639b4243e9e0a937e8d05676b5f0c41cf05d4a7eaea36f84d6e01a2e ./CHANGELOG.md
-29d1c172a94b0d970985cc775160dde12a9bd16793c3db4b4e7bdebfdb6f4534 ./CMakeLists.txt
-94093ec2431611fe363c0df1823b81330a8bafae503c68fef86f8bcf89dc3148 ./LICENSE
-38d5b9a8d5f1c224b51099f75d4a940d74355ffb64e26ea8395600065b0b34b0 ./README.md
-6afb09dcb0101ab4ab9246c78dd83ab2fcb9cac44b16b19f886611ce9439a6fc ./SECURITY.md
-e2015d0de6179118c5fce18502ca49f0204510d812cc5f10875d742e0f19c53f ./benchmarks/compiler_bench.cpp
-40722e32f25655b225ae0322aa664793922c555b26af9f6bc9d69d93180524ea ./cmake/RunAsmCrossTargets.cmake
-f6be29399dc81c62b5bf2cf10e81e56f0223d6f510c925cfd5f6c9195ee03c96 ./cmake/RunAsyncTest.cmake
-c3142a276d5985e4be66798fa9ea82a8198fb93b0ee77c40df61e7e65aa978ce ./cmake/RunBareMetalTests.cmake
-62bb2a392b13966e0b09041652a2eca7c637a274845b0932a5fcafdafd815fb4 ./cmake/RunCrossTargetTests.cmake
-4014016f6249dfa46f9047ada2945951256d39acbec4d0f0a4d9672dee38d5d2 ./cmake/RunExecutableTest.cmake
-9b18dbb6ed7cd83ba713bb9cee9ffd3e4cf97764a368b08f91b38d9bb07970ba ./cmake/RunExpectedRuntimeFailure.cmake
-339b1e92ba0ec16d9908cd819dd485a7f4e2f1ef42c3ce32ee945542d7384304 ./cmake/RunFailTests.cmake
-25e3eb2880bb16f575d1135f9ca72d912047b5186f18509c4d461ab3cc7c5af9 ./cmake/RunHeaderTest.cmake
-bd523f12b45228cc39ca3ed8344dc42765e817a3303910a485b72ac230b466a5 ./cmake/RunInvalidAsmConstraint.cmake
-833a8372ab485cce78832027c335f7b7ae32674def42ff8b4e0e4e059b7adfc4 ./cmake/RunPackageToolingTest.cmake
-fc38e898dff65c9e2e92245d8b5bb645aa83a77496b314b3fd15e86d0922337d ./cmake/RunPassTests.cmake
-c411cadae481be36cba2e0562e967063b532595186f10cbb2e7b667b11328d92 ./docs/BOOTSTRAP.md
-d0eca505b4d7258025c6f286bbf4d00dabac2706725762d2a721d517c637ac1c ./docs/LANGUAGE_SPEC.md
-6362aa3c078a3de2f5105443184924163b1375f1d94655e5074444f7aa032eb8 ./docs/MEMORY_MODEL.md
-26bf46d6b272b0f9559ad6c84b5ffd7b72c870c25d37a972cebfb113643a10a0 ./docs/OS_DEVELOPMENT.md
-34c585376b439087fa5d5e218800fc87b11d5bebf2b4ec266c35d7fa2d935e52 ./docs/RELEASE_STATUS.md
-c4823606c9220dfb0decee9a6ef4b30bdc7f4cb5e747702c74520a50249498ca ./docs/STANDARD_LIBRARY.md
-1ea379ed2b4ea7e2f9c89a888d66a18bb86632295fa6518ff4272dbdab9d7ee6 ./docs/TOOLING.md
-9eb481d4160e361a1317fd75299a549ef245ecf2e1f337af2511f0976ec03f91 ./docs/UNSAFE_AND_ASM.md
-2df90b622b5145b364f1ff1b442022e5685c3444123f5c9d42d46eec2ebc73f1 ./docs/VERIFICATION.md
-4f133f80eb71860925cdf4d98fa7a6447f0515912a35b186d37880f948d17bdd ./examples/async_basic.ux
-ce328b5ff7c96d32e4313d01707652441f7141c9f55fbba7191a80afac7ab1d1 ./examples/baremetal/aarch64.ld
-c6566bd26fcafcf95d3695aa45dbc148fbff26219764eecc4b955af2061b9907 ./examples/baremetal/kernel.ux
-6c495ea8b66d733d46819625b3395b232070cc8bb0c9e89f4f1c27ea86dcabba ./examples/baremetal/riscv64.ld
-9a37a20b77f4cff51315c3d2f490162954ff3fd7af2dbbe1839808387db23605 ./examples/baremetal/start_aarch64.S
-18f8a1e8cb35b608db962ef3cbb5192c94e142d00cad9ba03650ea78c0c25008 ./examples/baremetal/start_riscv64.S
-cc16cfbbdce3493d83dd1cbd6e466ddcb9e80988f2c6a0d0392f495640e7edeb ./examples/baremetal/start_x86_64.S
-c2922d911968f997703d2aa955587034cf5f94c2d8968f639cbe9a430bb2589b ./examples/baremetal/x86_64.ld
-72c7fe0b0e4c1b82b2ee217e2c616ffd804a3827f377c2eb743e81fe6368ba21 ./examples/borrow.ux
-54efa8a9737946578435c253bc17c138b5683d540dc798aac8d863a63025267b ./examples/c_ffi.ux
-697493b4040c435ea10c034804a0299bc40308c694590fb1fe17fcd348877b62 ./examples/freestanding.ux
-4edd651bf708e454cabfc03a0483ac903d7cb58c6f7907cfda1264f61c408196 ./examples/generics.ux
-b8e54486afc7ea8f19530dcad3df4d30a34376d8260e1a2619d4aa7af621c0b8 ./examples/hello.ux
-3c4f3a20409f73b95c74c0775cf2facd4cce304d20e40c080959d17bdbf1cd9a ./examples/inline_asm.ux
-6e5e2961079b16a71062cc77a6b62c6db94e1a28c00a0b484e5f61102d3a8de0 ./fuzz/lexer_fuzz.cpp
-db20b0081aecfd0cf717b66dcffee1c12cd27f15e2ca1ccc3301ff8fe51ea5b1 ./fuzz/parser_fuzz.cpp
-199c2650120efebf949fc44ae838721fe291552192a2c2985672b990aeb2d089 ./include/uinx/ast.hpp
-54e33c5889b689f0c24791e8df485a2539f294325c037c264070752b5b2ec2c3 ./include/uinx/borrow.hpp
-e627c095a327f48db9c829d753a00735a7d354df3ea4a3b91bbca84112c3c897 ./include/uinx/codegen.hpp
-fad5aad4b510980ca49f2be19dfe60eb42dce686161c193a956d5e704d980594 ./include/uinx/common.hpp
-d9f00c1b0708323c32c3c1a649c2fb9c2efc06057e99b92debaa4f51142f6586 ./include/uinx/compiler.hpp
-8c4d3cab7ed09fcf877bebbde2ba8c6c0fc7ebe87ce9ebd44867a3c52e84e65a ./include/uinx/diagnostic.hpp
-ea9b1e0c06aece0025228d6b80641e479adfde5d7b2bef50e97b97036552958e ./include/uinx/hir.hpp
-8973fd2a0fdce5a1b748106fd28e5c4e5ec06de0784a13227f4fac3428c5fdb9 ./include/uinx/lexer.hpp
-4773d51b7a570bea12222b9bb671413fcce9da752c4e4c5e9b22876e36d60deb ./include/uinx/mir.hpp
-a6bf492aa8d7d5fdee7d3f8aca2953f2c2a565410edb33709754ed49a7b05a0c ./include/uinx/parser.hpp
-1281eddc07b531957a4d840c3c7fcfb79bacfb9d36c1f683fbe1e3c2c3d3a8e0 ./include/uinx/sema.hpp
-13ba618d731c7a920e70e088b5694d7e3805697b74a49c66fc4978380bcea09e ./include/uinx/token.hpp
-49ab9e86ab17c195291e90d2b17aa5432e4015ffbd2259840cef17baebee1cc7 ./include/uinx/types.hpp
-18b179d59c9ab967dcf314c22acf958731e0bf8d191bd9cb09a0c0a83f91a24a ./runtime/collections.c
-deffb0a24e88eb99176c3bc05477dc8242172b830f6e8b6006b4bad3520733c0 ./runtime/process.c
-42b6f8296009190bc4ef94940aa2ded87b531e1c06c4f4772806843f5f2295d0 ./runtime/runtime.c
-73e95c8860ec08585882bc32686b25c778cf0a39f822e233bd39606a1106101c ./runtime/runtime.h
-15be266c15871d3368949b86c6e48a2e9cf8128a798e819a0f3f73616fd9f385 ./runtime/sync.c
-31ea0e81dbd601135d770606196317e9f5b31f04ca2162f41acc0c06df589417 ./runtime/unicode.c
-cd9ef28de922a09290d2846c7e20f1363a8be94de46fdd584e5542d89142a1c5 ./src/borrow.cpp
-d65ad8c4138056e5ca3c8b57909438753dbab5459cd53390d9b65b0e26e8b117 ./src/codegen.cpp
-d97e5e5e099b6fee70a270c8cd60bf12e1434f932db97d9c05732e51587b7181 ./src/compiler.cpp
-f06091789c578512d8db781d2262d58a97926b4dabade40dd14b5b5e37e9a9ed ./src/diagnostic.cpp
-63f53ce85662e409bbbf3c14b20f31a37a5d5d4a16bf4f83280bed28671f1fd7 ./src/lexer.cpp
-fef8b726c374f93f72cfc448925517b85ad5bdf2fb70badcfe7a87f0c8347e61 ./src/mir.cpp
-c5a91bc62674fe00f1dd27a55b2a773ad4ad82c2405abd94ec831727d99fe1b9 ./src/parser.cpp
-83584eec612cf63ab694adced88df1967c513f42802268ef48fdc64ebad5d086 ./src/sema.cpp
-4688334c4f7b60d80e1a9077187f26a2015a99e13cb2ceb78d11d17420ba4b6c ./src/types.cpp
-5c8491176b46b0c99024b90f2b080537a0517f846314cc0a242f301104827342 ./stdlib/alloc/arc.ux
-e9effdb7ccc40b22fd5b6c560e8d64fb54ca1f6de1710a4940944e6cbb643fe0 ./stdlib/alloc/box.ux
-062ca1217dfd111f0e49b491f13097a626c2e1abfb3f6c7656e2e96e5f11d2f2 ./stdlib/alloc/collections.ux
-41c56db56718518dd2608692c96503dc1ec0f2e5aa2611ad37e538db6af44219 ./stdlib/alloc/hashmap.ux
-2d6a44471aac46e089b05b8805696a5eeb3933b001b6ac95157629d2e0a04839 ./stdlib/alloc/rc.ux
-911ea94b12385aa683abaa01bb32493bcc5a0c25dbda4e0d80bc7645ce131dae ./stdlib/alloc/string.ux
-04288ef1af81765f8718790b6d7a500df0b582f6bbfc7801c9af65d0edd760c5 ./stdlib/alloc/vec.ux
-056673b8e1035e650860a572e7aca3d3ae7595a6e9ad45eafa0ecbd35ae2e485 ./stdlib/core/atomic.ux
-248060b9e283745fd71fd88f066f3f68f3a5f90f642861c2131e15149a9746bd ./stdlib/core/iterator.ux
-e64f5ba398df592aa3f0860953f5aa190615e3adf08ec02ee8d988167f57070d ./stdlib/core/mem.ux
-1054241a43e982f397c6796749e392e21e5763f37018b4232d517ae458939b1e ./stdlib/core/mod.ux
-d61336a1568ebc19f4cc7cdb24f54270abede8499f4d22be57d98af808bdbe38 ./stdlib/core/option.ux
-ae2cb907e662feb58cf275f3deb90b0eab61fcca7064d4be61b7561ab20ca457 ./stdlib/core/ptr.ux
-b7184859c6e8a3bd7c35a1d1de4f85d38f52822741b9a065e11076fc79f569ab ./stdlib/core/result.ux
-4f1eee52254b86c556fd26450b2c2cb99b55f3ccbc627e73df838172bacbc488 ./stdlib/core/slice.ux
-38316b801ddc3cc1bf6781e5b648e93120334117af54800b8c85639d03491e8c ./stdlib/core/sync.ux
-d8f47ef438a7662b3e1953d3cf5af52e567570b72c4844690008c3b7065e51f5 ./stdlib/core/traits.ux
-3b5d7df8ffefcdf0539fba118ea04860254fbbb09db3e577382cf4c1b7a25419 ./stdlib/minimal/fs.ux
-f3d80045ab31a7346e0d9bd62a51e58011d807521d5325f032a7c1c0d27e250e ./stdlib/minimal/io.ux
-b09bd798a4dd3d690ba67c2d5eff4e83ef389adbaf3d0d3f5c78be68763e1dc3 ./stdlib/minimal/net.ux
-f2363ba09deefd24d017798c9c1dde546a7134727dc589d3863e782394706d37 ./stdlib/minimal/sync.ux
-b60dc248e41a504a32511aae7ba2f18255a13ff7495494c12b1fcb6d391b35ec ./stdlib/minimal/thread.ux
-216066a3c901f537e41670d049598b46726fd81865ff219dc0172f2011e05733 ./stdlib/minimal/time.ux
-65af1dcc222cf67a0f1a4e205bfd221bc18925c71ade5550d1e842dc6d3f0638 ./stdlib/std/async.ux
-a6e4792fbe0f84529edad1d8743aa9eb9025d7c6da39c04ee8ee7a7bc1998640 ./stdlib/std/collections.ux
-f4914105d5021a21ee86ba192109dca8177770c2818e396a0be3f9e0d3bbf616 ./stdlib/std/fs.ux
-4dd4de3946fdba41a7c80767c7e623a27f0da6438bda0125c975c59ca8b77d12 ./stdlib/std/ipc.ux
-a0d40ccabff2d0b5cb563be54015652dcd23b44ad53f60ce79c2f3776bd0a9e8 ./stdlib/std/mod.ux
-21857a9ab8e5e1cdda958a021c7e034216c3af75de732dc8ba059044608c593c ./stdlib/std/net.ux
-c8291a24712b458a1d86fd3c8070604800e1c6498f35cf0d58d346ae384d7a39 ./stdlib/std/process.ux
-58b62f4c447c42abc185605aaebf4f59c87a1ec99bf31faa9d1dca651fbc6564 ./stdlib/std/thread.ux
-514a1a1394397397d4994084f6c897d0fd27900f3f8a454bfa7c05f8688cb5b7 ./stdlib/std/unicode.ux
-10ad10ac176deaf241629efa500fd10977adeaf71c8b5f2a0d69ef6d69666c73 ./tests/README.md
-a2299b4ca9d8d5e9ee6ec884d9292e2e6acafe7dc16f2d1448ab14e30e7ebbdd ./tests/codegen/asm/cross_nop.ux
-249009dc5cca8a887a30eb0292beb4fb08e6f16770d0a04c5be4ddd6c3596f8f ./tests/codegen/asm/invalid_aarch64_reg.ux
-6140379949bae960a9a0d56f98e0c6a726f95ec345cc9e295ba36a482a3145d8 ./tests/codegen/asm/x86_64_inout.ux
-61ccb4cb7aa7e8a81d7f745d1b5ea05d0013bd8882df7f10e6a9a311cfadd33e ./tests/codegen/asm/x86_64_io.ux
-c1fd98b3995e18a7cbfbadefdb6b1fc8f0d69b5082167db674ff77440090dfb2 ./tests/codegen/asm/x86_64_multiout.ux
-ba6e1b9db5df419ba0e4d674bed8f27c7c23e3d4c1124966a06d2f0ceabe1368 ./tests/codegen/asm/x86_64_nop.ux
-d6c8d905afbac42188f61bff7eb8213036ff1be0b9f18bcc1d83db0c260b395b ./tests/conformance/fail/header_requires_enable.ux
-807e368b72084d1986d7e96d3890d635fb9564ea6c27af08e7e6591528b894ea ./tests/conformance/fail/immutable_assign.ux
-ca7f0ebec3af5e3b752d46c761e8a8885a4557a615fd44b4f129cca91f630626 ./tests/conformance/fail/immutable_mut_borrow.ux
-8ab274516551a2bccd312e12f9d3d0de629c667be9ce068301ff007e7fb53832 ./tests/conformance/fail/trait_missing_method.ux
-17b714490b9cff520e0dbc832f255dea44c61bd49ce34f3bbd6c64da3beb394b ./tests/conformance/fail/type_mismatch.ux
-888019a3654df9c0f7501c15f29fb1cccba72d360da2bdc833ff63c8fffffc9e ./tests/conformance/fail/unsafe_required.ux
-6fa5244961330664f31d5684b277a843678a17706ce7d50fc30de15a05a3f9e3 ./tests/conformance/pass/control_flow_extended.ux
-bc1ca3f298ba7abf3eaf77eb36e83567aec6c7db0c9700a1f27b69c64b710dac ./tests/conformance/pass/field_borrow.ux
-b8af37f455cd7ab8f0f400c422ff290730f99d18612a0d96c2bb3fbfb8ce4ffb ./tests/conformance/pass/generic.ux
-e87a450e492ca0cc121ec442c464342b269acfe6ef8684e8022fdd78eb3c3d15 ./tests/conformance/pass/globals_and_bitops.ux
-d11a24b1833b38ce16796ba890d0132ae9ed77816e50044f5e973a6b164c320a ./tests/conformance/pass/hello.ux
-05cfc3a78c198165f1ef7b813aaaa6df43da7f10a479ef2f4ae3b50c22a78cf4 ./tests/conformance/pass/methods.ux
-9c4b8158b295e4e4a1e22600eba64cadec36e9d35a1161f49529c81cdb4f471a ./tests/conformance/pass/mutation.ux
-fcf70321a7f0d82d02b35f86c4154c1a6b51321535a75987c508b7eb045c7f5a ./tests/conformance/pass/need_dontneed.ux
-a0cc902c80d03f810a20eb1417dc9e78070137e482fd230a7726167f34549993 ./tests/conformance/pass/os_smp_syntax.ux
-104bf4000fe1c11ea1b64ba123a44e1f865eb37514f6d6ab2aecbbfcf07474d6 ./tests/conformance/pass/raii_drop.ux
-ca7e5abfc7a33de046f06a9a208792852efc33118f73fe40c8221b189d03b49d ./tests/conformance/pass/reference_parameter_return.ux
-6d280f81c5345b28d8e38e4c86f881725c287808e56df6da06fa484a01853386 ./tests/conformance/pass/send_marker.ux
-9139044de246ef16607cbd4a04c661d85a54b45c858e2d666d2683a54bc9cb30 ./tests/conformance/pass/slice_index.ux
-b30096d33a39242f2e214b709e841592742ed7601ec3adef8980a751693299ce ./tests/conformance/pass/slice_oob.ux
-74486259d9b4a1ec1ad476006dc45151381037d978f24ffeac61da1645080c0b ./tests/conformance/pass/trait_method.ux
-4f02c40dc3aa53adfcfd5093fe259349f7bc0d490396c9e547f927789d31e586 ./tests/headers/include/a.uxh
-9fa8bc15455ce4e8ab3cfc49ae3ca9ce04826814b5063c4e027371359249079d ./tests/headers/include/b.uxh
-ce7a6f4f715702a34a348334b43ce5151f194fd01658a37935ab94a76e1f2b55 ./tests/headers/include/common.uxh
-a2022fff359299748d00239fc3261c352e38f5521955f4b8a7c3149cfb6e0e38 ./tests/headers/include/decl_a.uxh
-a2022fff359299748d00239fc3261c352e38f5521955f4b8a7c3149cfb6e0e38 ./tests/headers/include/decl_b.uxh
-377d3305ee9b54e8c5c94dc7caa30912f1860c03f9b8f0a1809c70daf477ada3 ./tests/headers/include/math.uxh
-130d2a5b0398b290a6502d6a00dbf481bb8e4c164dfae433ac0d5bb799770d9d ./tests/headers/main.ux
-d68386e117f417ac0e274af42ca638392b6e36fe1b08053011d621262c35eadf ./tests/runtime/async/suspend_resume.ux
-1ad04285e9d4de6ff5d7190eb5379af262cc95747ab33e1e2b45bc089dde6182 ./tests/safety/borrow-fail/alias_mut.ux
-eba504578023566623e5ad6268f13160e05309956486e203a25e9f705420378b ./tests/safety/borrow-fail/dangling_block_assignment.ux
-401d0fd93f75dc0d090fe679b409c8760f9bf5f66ac27d4d29568dbdbc3f9b08 ./tests/safety/borrow-fail/dangling_return.ux
-f260991bcb0cea16f94e5d95fa75de0a9b6826912e1eeb7907eda1966f1c4eec ./tests/safety/borrow-fail/dangling_struct_field.ux
-b552d8caa51515ce7b4f136399e046943de8fdff2180cd948d768cbdc4bc17cb ./tests/safety/borrow-fail/dangling_through_call.ux
-c53e0e5c1c76bc3609ab421b3013dbcbbe891370dedd86d211afb7fc8e40412a ./tests/safety/borrow-fail/index_alias.ux
-407cb2deee1ebad7931bdbb5a2aa8ac5c745204efdfbb62fd1f622e6a8c18f39 ./tests/safety/borrow-fail/mutable_ref_move.ux
-ab910b2549d53744584a8ea2cab2a268c8f56e840d03c6223705b21e089ff745 ./tests/safety/borrow-fail/use_after_move.ux
-d1f295a3a93f144937ea0be61d8c9fcfea77d93ec78c7904ae5144d2c8566855 ./tests/safety/smp-fail/concurrent_missing_send.ux
-4e6b7fb362831020ce1cf1b7860c8e7e53ea9be4603054dc0fc201dd42203cbd ./tests/safety/smp-fail/concurrent_missing_sync.ux
-d3a691a311498864337c3144b118cc6b0c90f6b4cc341ad6eb2eb07c07ddc90e ./tests/safety/smp-fail/concurrent_raw_pointer.ux
-0a90783c60d6681398fda52af892b29d79c11386f0f90d23de186bf0d4a70c0c ./tests/support/async_harness.c
-9cfbbcac5f3e801a1a9e4db5fe434c437f027b3aa5d6441be03e83fde7059777 ./tests/unit/compiler_unit.cpp
-e5cc65b18e618d9e3a5cead04be04a5bd552f15f5f09fe004e53bf2a210285a0 ./tests/unit/runtime_unit.c
-bc600c56e2b25f8eb4a677550fcc11a4e2b22abd57c2bd15ee369b8d45393d8c ./tools/uinx.cpp
-9299473fd83f32c86dfb0b85d6c3bf19174e2edb48e6004431da865a530c25d3 ./tools/uinx_lsp.cpp
-19e1cf02f2378839992a85136644db2c6e8f0301ea4bc7ee07c83610b6b5c088 ./tools/uinxc.cpp
-a2d31fd350b48b78bf9f83ade49f57d8e150dce23864ec66f415d2d54ce886ae ./verification/README.md
diff --git a/README.md b/README.md
index 26e6098..ce3ca87 100644
--- a/README.md
+++ b/README.md
@@ -380,6 +380,9 @@ boundary rather than hidden behind a wrapper that simply invokes the C++ compile
| Document | Purpose |
|---|---|
+| `docs/BUILD.md` | build, install and cross-target instructions |
+| `docs/ARCHITECTURE.md` | compiler pipeline and runtime design |
+| `docs/TOOLING.md` | `uinx` / `uinxc` / `uinx-lsp` usage |
| `docs/LANGUAGE_SPEC.md` | canonical implemented grammar and semantics |
| `docs/MEMORY_MODEL.md` | ownership, aliasing, atomics, SMP, fences |
| `docs/BOOTSTRAP.md` | honest self-hosting/bootstrap acceptance criteria |
diff --git a/ARCHITECTURE.md b/docs/ARCHITECTURE.md
similarity index 100%
rename from ARCHITECTURE.md
rename to docs/ARCHITECTURE.md
diff --git a/BUILD.md b/docs/BUILD.md
similarity index 86%
rename from BUILD.md
rename to docs/BUILD.md
index ef2393a..e9718e3 100644
--- a/BUILD.md
+++ b/docs/BUILD.md
@@ -15,6 +15,20 @@ Verified release environment:
The project intentionally does not require LLVM C++ development headers. `uinxc` emits LLVM IR directly and invokes a configured Clang driver for LLVM IR to object conversion. Object linking is a separate phase.
+## Presets
+
+`CMakePresets.json` provides `debug`, `release`, `ci` (Release with warnings as
+errors), `asan` (ASan + UBSan on the C++ compiler code) and `fuzz`:
+
+```sh
+cmake --preset ci
+cmake --build --preset ci
+ctest --preset ci
+```
+
+Build trees go to `build//`. Local overrides belong in the git-ignored
+`CMakeUserPresets.json`.
+
## Release build
```sh
diff --git a/include/uinx/mir.hpp b/include/uinx/mir.hpp
index 70976db..d721096 100644
--- a/include/uinx/mir.hpp
+++ b/include/uinx/mir.hpp
@@ -144,11 +144,8 @@ class MIRLowerer {
std::string lower_place_address(const ast::Expr& e, FnState& s);
Type expr_type(const ast::Expr& e, const FnState& s) const;
Type subst_type(const Type& t, const FnState& s) const;
- std::string coerce_value(FnState& s,
- std::string value,
- const Type& from,
- const Type& to,
- const SourceRange& range);
+ std::string coerce_value(
+ FnState& s, std::string value, const Type& from, const Type& to, const SourceRange& range);
std::string specialize_call(const ast::CallExpr& c, const FunctionSig& sig, FnState& s);
void emit_scope_drops(FnState& s);
bool place_is_atomic(const ast::Expr& e, const FnState& s) const;
diff --git a/include/uinx/types.hpp b/include/uinx/types.hpp
index 9b5a08d..f75213f 100644
--- a/include/uinx/types.hpp
+++ b/include/uinx/types.hpp
@@ -6,6 +6,7 @@
#include "uinx/ast.hpp"
#include
+#include
namespace uinx {
enum class TypeKind {
@@ -41,6 +42,16 @@ struct Type {
std::shared_ptr pointee;
bool mut{false};
bool nullable{false};
+ Type() = default;
+ Type(const Type&) = default;
+ Type(Type&&) noexcept = default;
+ Type& operator=(Type&&) noexcept = default;
+ // `t = *t.pointee` must not destroy the source before it is copied, so build
+ // the copy first and then move it into place.
+ Type& operator=(const Type& other) {
+ Type copy{other};
+ return *this = std::move(copy);
+ }
static Type builtin(std::string_view name);
static Type named(std::string name, std::vector args = {});
static Type generic(std::string name);
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 2f44cca..99a5544 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -646,7 +646,7 @@ bool LLVMCodegen::emit_syscall(std::ostream& os,
std::unordered_map& values,
std::unordered_map& value_types,
std::size_t& counter) const {
- const int arity = in.args.size();
+ const int arity = static_cast(in.args.size());
if (arity < 1 || arity > 7)
return false;
diff --git a/src/mir.cpp b/src/mir.cpp
index 6b5a496..233f0ee 100644
--- a/src/mir.cpp
+++ b/src/mir.cpp
@@ -765,9 +765,7 @@ std::pair MIRLowerer::lower_expr(const ast::Expr& e, FnState&
std::unordered_set field_generics(si->second.generic_names.begin(),
si->second.generic_names.end());
std::unordered_map field_subst;
- for (std::size_t i = 0;
- i < si->second.generic_names.size() && i < ty.args.size();
- ++i)
+ for (std::size_t i = 0; i < si->second.generic_names.size() && i < ty.args.size(); ++i)
field_subst[si->second.generic_names[i]] = ty.args[i];
std::vector args;
for (const auto& decl_field : si->second.decl->fields) {
@@ -777,8 +775,8 @@ std::pair MIRLowerer::lower_expr(const ast::Expr& e, FnState&
continue;
}
auto [field_value, field_actual] = lower_expr(*it->second, s);
- const Type field_expected = substitute_type(
- type_from_ast(decl_field.type, field_generics), field_subst);
+ const Type field_expected =
+ substitute_type(type_from_ast(decl_field.type, field_generics), field_subst);
args.push_back(
coerce_value(s, field_value, field_actual, field_expected, it->second->range));
}
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..5b04103
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,28 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright (c) 2026 ViudiraTech
+# By JiTianYu391
+
+add_executable(uinx-unit-tests unit/compiler_unit.cpp)
+target_link_libraries(uinx-unit-tests PRIVATE uinx_compiler)
+add_test(NAME unit.compiler COMMAND uinx-unit-tests)
+add_executable(uinx-runtime-tests unit/runtime_unit.c)
+target_link_libraries(uinx-runtime-tests PRIVATE uinx_runtime)
+add_test(NAME unit.runtime COMMAND uinx-runtime-tests)
+add_test(NAME codegen.asm-object COMMAND $ ${PROJECT_SOURCE_DIR}/tests/codegen/asm/x86_64_nop.ux --emit=obj -o ${PROJECT_BINARY_DIR}/asm-test.o)
+add_test(NAME codegen.asm-input-output COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/codegen/asm/x86_64_io.ux -DOUTPUT=${PROJECT_BINARY_DIR}/asm-io -P ${PROJECT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
+add_test(NAME codegen.asm-inout COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/codegen/asm/x86_64_inout.ux -DOUTPUT=${PROJECT_BINARY_DIR}/asm-inout -P ${PROJECT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
+add_test(NAME codegen.asm-multiple-outputs COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/codegen/asm/x86_64_multiout.ux -DOUTPUT=${PROJECT_BINARY_DIR}/asm-multiout -P ${PROJECT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
+add_test(NAME runtime.slice-index-bounds COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/conformance/pass/slice_index.ux -DOUTPUT=${PROJECT_BINARY_DIR}/slice-index -P ${PROJECT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
+add_test(NAME runtime.slice-index-oob-traps COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/conformance/pass/slice_oob.ux -DOUTPUT=${PROJECT_BINARY_DIR}/slice-oob -P ${PROJECT_SOURCE_DIR}/cmake/RunExpectedRuntimeFailure.cmake)
+add_test(NAME runtime.c-ffi COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/examples/c_ffi.ux -DOUTPUT=${PROJECT_BINARY_DIR}/c-ffi -P ${PROJECT_SOURCE_DIR}/cmake/RunExecutableTest.cmake)
+add_test(NAME headers.enabled COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/headers/main.ux -DINCLUDE_DIR=${PROJECT_SOURCE_DIR}/tests/headers/include -DOUTPUT=${PROJECT_BINARY_DIR}/header-test -P ${PROJECT_SOURCE_DIR}/cmake/RunHeaderTest.cmake)
+add_test(NAME codegen.cross-target-objects COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/examples/freestanding.ux -DBINARY_DIR=${PROJECT_BINARY_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/RunCrossTargetTests.cmake)
+add_test(NAME codegen.asm-cross-targets COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/codegen/asm/cross_nop.ux -DBINARY_DIR=${PROJECT_BINARY_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/RunAsmCrossTargets.cmake)
+add_test(NAME codegen.asm-invalid-target-register COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/codegen/asm/invalid_aarch64_reg.ux -DOUTPUT=${PROJECT_BINARY_DIR}/asm-invalid.o -P ${PROJECT_SOURCE_DIR}/cmake/RunInvalidAsmConstraint.cmake)
+add_test(NAME codegen.baremetal-cross-link COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DCLANG=clang -DLD_LLD=ld.lld -DSOURCE_DIR=${PROJECT_SOURCE_DIR}/examples/baremetal -DBINARY_DIR=${PROJECT_BINARY_DIR} -P ${PROJECT_SOURCE_DIR}/cmake/RunBareMetalTests.cmake)
+add_test(NAME runtime.async-suspend-resume COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DSOURCE=${PROJECT_SOURCE_DIR}/tests/runtime/async/suspend_resume.ux -DUINX_OBJ=${PROJECT_BINARY_DIR}/async-test.o -DCLANG=clang -DRUNTIME_INCLUDE=${PROJECT_SOURCE_DIR}/runtime -DHARNESS=${PROJECT_SOURCE_DIR}/tests/support/async_harness.c -DRUNTIME_LIB=$ -DOUTPUT=${PROJECT_BINARY_DIR}/async-test -P ${PROJECT_SOURCE_DIR}/cmake/RunAsyncTest.cmake)
+add_test(NAME conformance.positive COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${PROJECT_SOURCE_DIR}/tests/conformance/pass -P ${PROJECT_SOURCE_DIR}/cmake/RunPassTests.cmake)
+add_test(NAME conformance.negative COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${PROJECT_SOURCE_DIR}/tests/conformance/fail -P ${PROJECT_SOURCE_DIR}/cmake/RunFailTests.cmake)
+add_test(NAME safety.borrow-negative COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${PROJECT_SOURCE_DIR}/tests/safety/borrow-fail -P ${PROJECT_SOURCE_DIR}/cmake/RunFailTests.cmake)
+add_test(NAME safety.smp-negative COMMAND ${CMAKE_COMMAND} -DUINXC=$ -DTEST_DIR=${PROJECT_SOURCE_DIR}/tests/safety/smp-fail -P ${PROJECT_SOURCE_DIR}/cmake/RunFailTests.cmake)
+add_test(NAME tooling.package-integration COMMAND ${CMAKE_COMMAND} -DUINX=$ -DWORK=${PROJECT_BINARY_DIR}/package-tooling -P ${PROJECT_SOURCE_DIR}/cmake/RunPackageToolingTest.cmake)
diff --git a/tools/uinx.cpp b/tools/uinx.cpp
index e694c93..7d245ca 100644
--- a/tools/uinx.cpp
+++ b/tools/uinx.cpp
@@ -106,9 +106,8 @@ SourceSelection source_selection(const std::filesystem::path& root, const Manife
if (name == "std")
selection.std_mode = disabled ? "none" : "full";
- else if (!disabled &&
- (name == "core" || name == "alloc" || name == "sys" || name == "os" ||
- name == "fmt" || name == "minimal"))
+ else if (!disabled && (name == "core" || name == "alloc" || name == "sys" || name == "os" ||
+ name == "fmt" || name == "minimal"))
selection.std_mode = name;
else if (name == "runtime")
selection.runtime = !disabled;
@@ -794,14 +793,8 @@ int main(int argc, char** argv) {
return 2;
}
std::filesystem::path executable;
- const int result =
- build_project(root,
- manifest,
- EmitKind::Executable,
- release,
- &executable,
- smp_override,
- auto_repair);
+ const int result = build_project(
+ root, manifest, EmitKind::Executable, release, &executable, smp_override, auto_repair);
if (result)
return result;
return std::system(("\"" + executable.string() + "\"").c_str());
diff --git a/verification/README.md b/verification/README.md
deleted file mode 100644
index a52087e..0000000
--- a/verification/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Verification Workspace Policy
-
-This directory intentionally contains no checked-in test transcripts.
-
-Use `docs/VERIFICATION.md` for the reproducible commands. Local/CI build logs, temporary probe programs, benchmark output, and CTest transcripts are disposable artifacts and should be removed after verification rather than accumulated in the source tree.
diff --git a/verification/compiler-benchmark.txt b/verification/compiler-benchmark.txt
deleted file mode 100644
index 23a16ce..0000000
--- a/verification/compiler-benchmark.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-lexer_ns_per_iter=5545
-parse_ns_per_iter=8628
-check_pipeline_ns_per_iter=29009
diff --git a/verification/ctest-release.txt b/verification/ctest-release.txt
deleted file mode 100644
index ee978c9..0000000
--- a/verification/ctest-release.txt
+++ /dev/null
@@ -1,42 +0,0 @@
-Internal ctest changing into directory: Uinx-Language-0.3.0/build-final
-Test project Uinx-Language-0.3.0/build-final
- Start 1: unit.compiler
- 1/18 Test #1: unit.compiler ......................... Passed 0.74 sec
- Start 2: unit.runtime
- 2/18 Test #2: unit.runtime .......................... Passed 0.02 sec
- Start 3: codegen.asm-object
- 3/18 Test #3: codegen.asm-object .................... Passed 0.24 sec
- Start 4: codegen.asm-input-output
- 4/18 Test #4: codegen.asm-input-output .............. Passed 0.37 sec
- Start 5: codegen.asm-inout
- 5/18 Test #5: codegen.asm-inout ..................... Passed 0.38 sec
- Start 6: codegen.asm-multiple-outputs
- 6/18 Test #6: codegen.asm-multiple-outputs .......... Passed 0.38 sec
- Start 7: runtime.slice-index-bounds
- 7/18 Test #7: runtime.slice-index-bounds ............ Passed 0.40 sec
- Start 8: runtime.slice-index-oob-traps
- 8/18 Test #8: runtime.slice-index-oob-traps ......... Passed 0.38 sec
- Start 9: runtime.c-ffi
- 9/18 Test #9: runtime.c-ffi ......................... Passed 0.38 sec
- Start 10: codegen.cross-target-objects
-10/18 Test #10: codegen.cross-target-objects .......... Passed 0.32 sec
- Start 11: codegen.asm-cross-targets
-11/18 Test #11: codegen.asm-cross-targets ............. Passed 0.23 sec
- Start 12: codegen.asm-invalid-target-register
-12/18 Test #12: codegen.asm-invalid-target-register ... Passed 0.06 sec
- Start 13: codegen.baremetal-cross-link
-13/18 Test #13: codegen.baremetal-cross-link .......... Passed 0.98 sec
- Start 14: runtime.async-suspend-resume
-14/18 Test #14: runtime.async-suspend-resume .......... Passed 0.48 sec
- Start 15: conformance.positive
-15/18 Test #15: conformance.positive .................. Passed 2.96 sec
- Start 16: conformance.negative
-16/18 Test #16: conformance.negative .................. Passed 0.14 sec
- Start 17: safety.borrow-negative
-17/18 Test #17: safety.borrow-negative ................ Passed 0.17 sec
- Start 18: tooling.package-integration
-18/18 Test #18: tooling.package-integration ........... Passed 2.45 sec
-
-100% tests passed, 0 tests failed out of 18
-
-Total Test time (real) = 11.09 sec
diff --git a/verification/environment.txt b/verification/environment.txt
deleted file mode 100644
index f222c35..0000000
--- a/verification/environment.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Uinx 0.3 verification environment
-UTC: 2026-08-19T05:39:56Z
-Linux a40a20264636 6.18.35 #1 SMP Mon Jul 27 18:07:50 UTC 2026 x86_64 GNU/Linux
-
-cmake version 3.31.6
-c++ (Debian 14.2.0-19) 14.2.0
-cc (Debian 14.2.0-19) 14.2.0
-clang version 17.0.0 (https://github.com/swiftlang/llvm-project.git 10999b6d034fe318f3d56c83bddb6572593a8bb0)
-LLD 17.0.0 (https://github.com/swiftlang/llvm-project.git 10999b6d034fe318f3d56c83bddb6572593a8bb0) (compatible with GNU linkers)
-ninja 1.12.1
-clang-format: not installed in verification container
diff --git a/verification/examples-check.txt b/verification/examples-check.txt
deleted file mode 100644
index e787c94..0000000
--- a/verification/examples-check.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-$ build-final/uinxc examples/async_basic.ux --emit=check
-PASS
-
-$ build-final/uinxc examples/baremetal/kernel.ux --emit=check
-PASS
-
-$ build-final/uinxc examples/borrow.ux --emit=check
-PASS
-
-$ build-final/uinxc examples/c_ffi.ux --emit=check
-PASS
-
-$ build-final/uinxc examples/freestanding.ux --emit=check
-PASS
-
-$ build-final/uinxc examples/generics.ux --emit=check
-PASS
-
-$ build-final/uinxc examples/hello.ux --emit=check
-PASS
-
-$ build-final/uinxc examples/inline_asm.ux --emit=check
-PASS
-
-Checked 8 example programs: PASS
diff --git a/verification/optimizer-check.txt b/verification/optimizer-check.txt
deleted file mode 100644
index b0eaa66..0000000
--- a/verification/optimizer-check.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-MIR optimizer probe
-O0 IR lines: 29
-O2 IR lines: 22
-O0 i32 loads: 6
-O2 i32 loads: 0
-O2 folded expression present: yes
diff --git a/verification/os-freestanding.txt b/verification/os-freestanding.txt
deleted file mode 100644
index 95eedb4..0000000
--- a/verification/os-freestanding.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Freestanding kernel/core cross-target verification
-x86_64 package kernel: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
-aarch64 package kernel: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, not stripped
-riscv64 package kernel: ELF 64-bit LSB executable, UCB RISC-V, RVC, soft-float ABI, version 1 (SYSV), statically linked, not stripped
-
-x86_64 direct example: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
-aarch64 direct example: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, not stripped
-riscv64 direct example: ELF 64-bit LSB executable, UCB RISC-V, RVC, soft-float ABI, version 1 (SYSV), statically linked, not stripped
-
-core::atomic + core::ptr + core::sync use test: x86_64/AArch64/RISC-V64 objects had no undefined symbols.
-core::mem pure-Uinx object generation: verified for x86_64/AArch64/RISC-V64.
diff --git a/verification/release-build.txt b/verification/release-build.txt
deleted file mode 100644
index 05dfd76..0000000
--- a/verification/release-build.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-$ cmake -S . -B build-final -G Ninja -DCMAKE_BUILD_TYPE=Release
-Result: PASS
-$ cmake --build build-final -j2
-Result: PASS (28 build steps; 0 compiler warnings)
-$ build-final/uinx --version
-uinx 0.3.0
diff --git a/verification/stdlib-check.txt b/verification/stdlib-check.txt
deleted file mode 100644
index 9f83e67..0000000
--- a/verification/stdlib-check.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Command: build-final/uinxc --emit=check
-Result: PASS