From 7c8daacc6506f709d050f27dd20c6321f62b16e8 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 20 Oct 2026 11:48:19 +0000 Subject: [PATCH] Reorganize repository, add CI and presets, fix Type assignment use-after-free - Add CMakePresets.json, GitHub Actions CI, issue/PR templates, CONTRIBUTING, .editorconfig and .gitattributes - Move ARCHITECTURE.md and BUILD.md to docs/; move test registration into tests/CMakeLists.txt - Add UINX_WARNINGS_AS_ERRORS and UINX_ENABLE_SANITIZERS options - Remove stale MANIFEST.sha256 (35 of 159 entries no longer matched) and the checked-in verification transcripts that contradicted their own README - Fix heap-use-after-free in Type::operator= when assigning from an owned pointee (found by ASan), and a -Wconversion warning in codegen - Apply clang-format to files that had drifted Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_018uUuRXQcBduAQvVUcJYkWz --- .editorconfig | 21 ++++ .gitattributes | 2 + .github/ISSUE_TEMPLATE/bug_report.md | 18 +++ .github/ISSUE_TEMPLATE/config.yml | 5 + .github/PULL_REQUEST_TEMPLATE.md | 10 ++ .github/workflows/ci.yml | 46 +++++++ .gitignore | 10 ++ CHANGELOG.md | 2 + CMakeLists.txt | 40 +++--- CMakePresets.json | 68 ++++++++++ CONTRIBUTING.md | 56 +++++++++ MANIFEST.sha256 | 159 ------------------------ README.md | 3 + ARCHITECTURE.md => docs/ARCHITECTURE.md | 0 BUILD.md => docs/BUILD.md | 14 +++ include/uinx/mir.hpp | 7 +- include/uinx/types.hpp | 11 ++ src/codegen.cpp | 2 +- src/mir.cpp | 8 +- tests/CMakeLists.txt | 28 +++++ tools/uinx.cpp | 15 +-- verification/README.md | 5 - verification/compiler-benchmark.txt | 3 - verification/ctest-release.txt | 42 ------- verification/environment.txt | 11 -- verification/examples-check.txt | 25 ---- verification/optimizer-check.txt | 6 - verification/os-freestanding.txt | 11 -- verification/release-build.txt | 6 - verification/stdlib-check.txt | 2 - 30 files changed, 320 insertions(+), 316 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/ci.yml create mode 100644 CMakePresets.json create mode 100644 CONTRIBUTING.md delete mode 100644 MANIFEST.sha256 rename ARCHITECTURE.md => docs/ARCHITECTURE.md (100%) rename BUILD.md => docs/BUILD.md (86%) create mode 100644 tests/CMakeLists.txt delete mode 100644 verification/README.md delete mode 100644 verification/compiler-benchmark.txt delete mode 100644 verification/ctest-release.txt delete mode 100644 verification/environment.txt delete mode 100644 verification/examples-check.txt delete mode 100644 verification/optimizer-check.txt delete mode 100644 verification/os-freestanding.txt delete mode 100644 verification/release-build.txt delete mode 100644 verification/stdlib-check.txt 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