mirror of
https://github.com/nim-lang/Nim.git
synced 2026-09-17 02:32:11 +00:00
migrate the main test suite from Azure Pipelines to GitHub Actions (#26168)
The Microsoft-hosted Azure agents are 2-core; the GitHub-hosted runners are 4-core (3-core on macOS arm64). Measured on an identical `koch boot -d:release` against our own Docs CI, the GitHub runners are ~2.3x faster: Linux boot 8.2 min -> 4.5 min Windows boot 11.4 min -> 4.9 min macOS boot 4.2 min -> 1.7 min csources 2.0 min -> 0.8 min `.github/workflows/ci_main.yml` keeps the same six jobs, the same runner images, the same dependency installation and the same `ci/funs.sh` entry points, so this is a move, not a redesign. Differences forced by the platform: * `[skip ci]` is handled natively by GitHub, so the `nimIsCiSkip` step and the `skipci` variable that gated every step are gone. `nimIsCiSkip` stays in `ci/funs.sh` for the version branches. * `SYSTEM_ACCESSTOKEN` is gone: `testament/azure.nim` activates on `TF_BUILD`, which is unset here, so it no-ops. This also removes a flake source, where a failure to create the Azure test run cancelled an otherwise green job. * `concurrency: cancel-in-progress` replaces Azure's `pr.autoCancel`. * `NIM_TESTAMENT_BATCH` defaults to `_` explicitly: a matrix-derived env var is set to the empty string rather than left unset, so `getEnv`'s default would not have applied. `disabled: "azure"` was the only way to skip a test on the main pipeline, so add `disabled: "github"` (`isGithubActions`) to replace it; `azure` is kept as deprecated, alongside `travis` and `appveyor`. Two manual steps remain: disabling the Azure pipeline definition, and pointing the required status checks at the new job names. --------- Co-authored-by: ringabout <43030857+ringabout@users.noreply.github.com>
This commit is contained in:
153
.github/workflows/ci_main.yml
vendored
Normal file
153
.github/workflows/ci_main.yml
vendored
Normal file
@@ -0,0 +1,153 @@
|
||||
name: Nim CI
|
||||
# The main test suite (`koch runCI`). Previously `azure-pipelines.yml`; moved
|
||||
# here because the GitHub-hosted runners are 4-core (3-core on macOS arm64)
|
||||
# whereas the Microsoft-hosted Azure agents are 2-core, which measured ~2.3x
|
||||
# faster on an identical `koch boot -d:release`.
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'devel'
|
||||
- 'version-*'
|
||||
pull_request:
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- name: Linux_amd64
|
||||
os: ubuntu-24.04
|
||||
cpu: amd64
|
||||
# regularly breaks, refs bug #17325
|
||||
# - name: Linux_i386
|
||||
# os: ubuntu-24.04
|
||||
# cpu: i386
|
||||
- name: OSX_arm64
|
||||
os: macos-15
|
||||
cpu: arm64
|
||||
- name: OSX_arm64_cpp
|
||||
os: macos-15
|
||||
cpu: arm64
|
||||
cpp: 'true'
|
||||
# see also: `NIM_TEST_PACKAGES`
|
||||
- name: Windows_amd64_batch0_3
|
||||
os: windows-2025
|
||||
cpu: amd64
|
||||
batch: '0_3'
|
||||
- name: Windows_amd64_batch1_3
|
||||
os: windows-2025
|
||||
cpu: amd64
|
||||
batch: '1_3'
|
||||
- name: Windows_amd64_batch2_3
|
||||
os: windows-2025
|
||||
cpu: amd64
|
||||
batch: '2_3'
|
||||
|
||||
name: ${{ matrix.name }}
|
||||
runs-on: ${{ matrix.os }}
|
||||
timeout-minutes: 90 # `60` led to lots of cancelled jobs
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
env:
|
||||
# `_` is testament's "no batching" value, see `isCurrentBatch`.
|
||||
NIM_TESTAMENT_BATCH: ${{ matrix.batch || '_' }}
|
||||
NIM_COMPILE_TO_CPP: ${{ matrix.cpp || 'false' }}
|
||||
|
||||
steps:
|
||||
- name: 'Disable auto conversion to CRLF by git (Windows-only)'
|
||||
if: runner.os == 'Windows'
|
||||
run: git config --global core.autocrlf false
|
||||
|
||||
- name: 'Checkout'
|
||||
uses: actions/checkout@v7
|
||||
with:
|
||||
fetch-depth: 2 # see D20210329T004830
|
||||
|
||||
- name: 'Install node.js 20.x'
|
||||
uses: actions/setup-node@v7
|
||||
with:
|
||||
node-version: 20
|
||||
|
||||
- name: 'Install dependencies (amd64 Linux)'
|
||||
if: runner.os == 'Linux' && matrix.cpu == 'amd64'
|
||||
run: |
|
||||
set -e
|
||||
. ci/funs.sh
|
||||
echo_run sudo add-apt-repository universe
|
||||
echo_run sudo apt-get update -qq
|
||||
DEBIAN_FRONTEND='noninteractive' \
|
||||
echo_run sudo apt-get install --no-install-recommends -yq \
|
||||
gcc-14 g++-14 libpcre3 liblapack-dev libpcre3 liblapack-dev libcurl4-openssl-dev libgc-dev libsdl1.2-dev libsfml-dev valgrind libc6-dbg
|
||||
echo_run sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 60 --slave /usr/bin/g++ g++ /usr/bin/g++-14
|
||||
|
||||
- name: 'Install dependencies (i386 Linux)'
|
||||
if: runner.os == 'Linux' && matrix.cpu == 'i386'
|
||||
run: |
|
||||
set -e
|
||||
. ci/funs.sh
|
||||
echo_run sudo dpkg --add-architecture i386
|
||||
# Downgrade llvm:
|
||||
# - llvm has to be downgraded to have 32bit version installed for sfml.
|
||||
|
||||
cat << EOF | sudo tee /etc/apt/preferences.d/pin-to-rel
|
||||
Package: libllvm6.0
|
||||
Pin: origin "azure.archive.ubuntu.com"
|
||||
Pin-Priority: 1001
|
||||
EOF
|
||||
|
||||
echo_run sudo apt-get update -qq || echo "failed, see bug #17343"
|
||||
# `:i386` (e.g. in `libffi-dev:i386`) is needed otherwise you may get:
|
||||
# `could not load: libffi.so` during dynamic loading.
|
||||
DEBIAN_FRONTEND='noninteractive' \
|
||||
echo_run sudo apt-get install --no-install-recommends --allow-downgrades -yq \
|
||||
g++-multilib gcc-multilib libcurl4-openssl-dev:i386 libgc-dev:i386 \
|
||||
libsdl1.2-dev:i386 libsfml-dev:i386 libglib2.0-dev:i386 libffi-dev:i386
|
||||
|
||||
cat << EOF > bin/gcc
|
||||
#!/bin/bash
|
||||
|
||||
exec $(which gcc) -m32 "\$@"
|
||||
EOF
|
||||
|
||||
cat << EOF > bin/g++
|
||||
#!/bin/bash
|
||||
|
||||
exec $(which g++) -m32 "\$@"
|
||||
EOF
|
||||
|
||||
echo_run chmod 755 bin/gcc
|
||||
echo_run chmod 755 bin/g++
|
||||
|
||||
- name: 'Install dependencies (OSX)'
|
||||
if: runner.os == 'macOS'
|
||||
run: brew install boehmgc make sfml
|
||||
# XXX can't find boehm on macos 13
|
||||
|
||||
- name: 'Install dependencies (Windows)'
|
||||
if: runner.os == 'Windows'
|
||||
run: |
|
||||
set -e
|
||||
. ci/funs.sh
|
||||
nimInternalInstallDepsWindows
|
||||
echo_run echo "${{ github.workspace }}/dist/mingw64/bin" >> "${GITHUB_PATH}"
|
||||
|
||||
- name: 'Add build binaries to PATH'
|
||||
run: echo "${{ github.workspace }}/bin" >> "${GITHUB_PATH}"
|
||||
|
||||
- name: 'System information'
|
||||
run: . ci/funs.sh && nimCiSystemInfo
|
||||
|
||||
- name: 'Build csourcesAny'
|
||||
run: . ci/funs.sh && nimBuildCsourcesIfNeeded CC=gcc ucpu='${{ matrix.cpu }}'
|
||||
|
||||
- name: 'koch, Run CI'
|
||||
run: . ci/funs.sh && nimInternalBuildKochAndRunCI
|
||||
@@ -1,172 +0,0 @@
|
||||
trigger:
|
||||
branches:
|
||||
include:
|
||||
- 'devel'
|
||||
- 'version-*'
|
||||
pr:
|
||||
branches:
|
||||
include:
|
||||
- '*'
|
||||
|
||||
variables:
|
||||
- name: skipci
|
||||
value: false
|
||||
|
||||
jobs:
|
||||
- job: packages
|
||||
|
||||
timeoutInMinutes: 90 # default `60` led to lots of cancelled jobs; use 0 for unlimited (may be undesirable)
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
Linux_amd64:
|
||||
vmImage: 'ubuntu-24.04'
|
||||
CPU: amd64
|
||||
# regularly breaks, refs bug #17325
|
||||
# Linux_i386:
|
||||
# # on 'ubuntu-16.04' (not supported anymore anyways) it errored with:
|
||||
# # g++-multilib : Depends: gcc-multilib (>= 4:5.3.1-1ubuntu1) but it is not going to be installed
|
||||
# vmImage: 'ubuntu-18.04'
|
||||
# CPU: i386
|
||||
OSX_arm64:
|
||||
vmImage: 'macos-15'
|
||||
CPU: arm64
|
||||
OSX_arm64_cpp:
|
||||
vmImage: 'macos-15'
|
||||
CPU: arm64
|
||||
NIM_COMPILE_TO_CPP: true
|
||||
Windows_amd64_batch0_3:
|
||||
vmImage: 'windows-2025'
|
||||
CPU: amd64
|
||||
# see also: `NIM_TEST_PACKAGES`
|
||||
NIM_TESTAMENT_BATCH: "0_3"
|
||||
Windows_amd64_batch1_3:
|
||||
vmImage: 'windows-2025'
|
||||
CPU: amd64
|
||||
NIM_TESTAMENT_BATCH: "1_3"
|
||||
Windows_amd64_batch2_3:
|
||||
vmImage: 'windows-2025'
|
||||
CPU: amd64
|
||||
NIM_TESTAMENT_BATCH: "2_3"
|
||||
|
||||
pool:
|
||||
vmImage: $(vmImage)
|
||||
|
||||
workspace:
|
||||
clean: all
|
||||
|
||||
steps:
|
||||
- bash: git config --global core.autocrlf false
|
||||
displayName: 'Disable auto conversion to CRLF by git (Windows-only)'
|
||||
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
|
||||
|
||||
- checkout: self
|
||||
fetchDepth: 2 # see D20210329T004830
|
||||
|
||||
- bash: |
|
||||
set -e
|
||||
. ci/funs.sh
|
||||
if nimIsCiSkip; then
|
||||
echo '##vso[task.setvariable variable=skipci]true'
|
||||
fi
|
||||
displayName: 'Check whether to skip CI'
|
||||
|
||||
- task: NodeTool@0
|
||||
inputs:
|
||||
versionSpec: '20.x'
|
||||
displayName: 'Install node.js 20.x'
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'))
|
||||
|
||||
- bash: |
|
||||
set -e
|
||||
. ci/funs.sh
|
||||
echo_run sudo add-apt-repository universe
|
||||
echo_run sudo apt-get update -qq
|
||||
DEBIAN_FRONTEND='noninteractive' \
|
||||
echo_run sudo apt-get install --no-install-recommends -yq \
|
||||
gcc-14 g++-14 libpcre3 liblapack-dev libpcre3 liblapack-dev libcurl4-openssl-dev libgc-dev libsdl1.2-dev libsfml-dev valgrind libc6-dbg
|
||||
echo_run sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 60 --slave /usr/bin/g++ g++ /usr/bin/g++-14
|
||||
displayName: 'Install dependencies (amd64 Linux)'
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Linux'), eq(variables['CPU'], 'amd64'))
|
||||
|
||||
- bash: |
|
||||
set -e
|
||||
. ci/funs.sh
|
||||
echo_run sudo dpkg --add-architecture i386
|
||||
# Downgrade llvm:
|
||||
# - llvm has to be downgraded to have 32bit version installed for sfml.
|
||||
|
||||
cat << EOF | sudo tee /etc/apt/preferences.d/pin-to-rel
|
||||
Package: libllvm6.0
|
||||
Pin: origin "azure.archive.ubuntu.com"
|
||||
Pin-Priority: 1001
|
||||
EOF
|
||||
|
||||
# echo_run sudo apt-get update -qq
|
||||
echo_run sudo apt-get update -qq || echo "failed, see bug #17343"
|
||||
# `:i386` (e.g. in `libffi-dev:i386`) is needed otherwise you may get:
|
||||
# `could not load: libffi.so` during dynamic loading.
|
||||
DEBIAN_FRONTEND='noninteractive' \
|
||||
echo_run sudo apt-get install --no-install-recommends --allow-downgrades -yq \
|
||||
g++-multilib gcc-multilib libcurl4-openssl-dev:i386 libgc-dev:i386 \
|
||||
libsdl1.2-dev:i386 libsfml-dev:i386 libglib2.0-dev:i386 libffi-dev:i386
|
||||
|
||||
|
||||
cat << EOF > bin/gcc
|
||||
#!/bin/bash
|
||||
|
||||
exec $(which gcc) -m32 "\$@"
|
||||
EOF
|
||||
|
||||
cat << EOF > bin/g++
|
||||
#!/bin/bash
|
||||
|
||||
exec $(which g++) -m32 "\$@"
|
||||
EOF
|
||||
|
||||
echo_run chmod 755 bin/gcc
|
||||
echo_run chmod 755 bin/g++
|
||||
|
||||
displayName: 'Install dependencies (i386 Linux)'
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Linux'), eq(variables['CPU'], 'i386'))
|
||||
|
||||
- bash: brew install boehmgc make sfml
|
||||
displayName: 'Install dependencies (OSX)'
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Darwin'))
|
||||
# XXX can't find boehm on macos 13
|
||||
|
||||
- bash: |
|
||||
set -e
|
||||
. ci/funs.sh
|
||||
nimInternalInstallDepsWindows
|
||||
echo_run echo '##vso[task.prependpath]$(System.DefaultWorkingDirectory)/dist/mingw64/bin'
|
||||
|
||||
displayName: 'Install dependencies (Windows)'
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'), eq(variables['Agent.OS'], 'Windows_NT'))
|
||||
|
||||
- bash: echo '##vso[task.prependpath]$(System.DefaultWorkingDirectory)/bin'
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'))
|
||||
displayName: 'Add build binaries to PATH'
|
||||
|
||||
- bash: . ci/funs.sh && nimCiSystemInfo
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'))
|
||||
displayName: 'System information'
|
||||
|
||||
- bash: . ci/funs.sh && nimBuildCsourcesIfNeeded CC=gcc ucpu=$(CPU)
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'))
|
||||
displayName: 'Build csourcesAny'
|
||||
|
||||
# this could be revived if performance justifies it (needs a few updates)
|
||||
# - task: Cache@2
|
||||
# inputs:
|
||||
# key: 'csourcesAny | "$(Agent.OS)" | $(CPU) | $(csources_version)'
|
||||
# path: $(nim_csources)
|
||||
# condition: and(succeeded(), eq(variables['skipci'], 'false'))
|
||||
# displayName: 'Restore built csourcesAny'
|
||||
|
||||
- bash: . ci/funs.sh && nimInternalBuildKochAndRunCI
|
||||
# would could also show on failure: echo '##vso[task.complete result=Failed]'
|
||||
condition: and(succeeded(), eq(variables['skipci'], 'false'))
|
||||
displayName: 'koch, Run CI'
|
||||
env:
|
||||
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
|
||||
@@ -350,10 +350,13 @@ proc mainCommand*(graph: ModuleGraph) =
|
||||
if optGenIndex in conf.globalOptions and optWholeProject in conf.globalOptions:
|
||||
commandBuildIndex(conf, $conf.outDir)
|
||||
of cmdBook:
|
||||
loadConfigs(DocConfig, cache, conf, graph.idgen)
|
||||
conf.setNoteDefaults(warnCannotOpenFile, true)
|
||||
commandBook(cache, conf)
|
||||
commandBuildIndex(conf, $conf.outDir, exclCode = true, inclHeaders = true)
|
||||
when defined(leanCompiler):
|
||||
conf.quitOrRaise "compiler wasn't built with documentation generator"
|
||||
else:
|
||||
loadConfigs(DocConfig, cache, conf, graph.idgen)
|
||||
conf.setNoteDefaults(warnCannotOpenFile, true)
|
||||
commandBook(cache, conf)
|
||||
commandBuildIndex(conf, $conf.outDir, exclCode = true, inclHeaders = true)
|
||||
of cmdRst2html, cmdMd2html:
|
||||
# XXX: why are warnings disabled by default for rst2html and rst2tex?
|
||||
for warn in rstWarnings:
|
||||
|
||||
@@ -300,6 +300,24 @@ proc checkConversionBetweenObjects(castDest, src: PType; pointers: int): TConvSt
|
||||
const
|
||||
IntegralTypes = {tyBool, tyEnum, tyChar, tyInt..tyUInt64}
|
||||
|
||||
proc floatFitsOrdinal(conf: ConfigRef; f: BiggestFloat; t: PType): bool =
|
||||
## Whether `f`, truncated towards zero, lies within `t`'s ordinal range.
|
||||
## `f.int64` must not be used for this: converting a float that doesn't fit
|
||||
## is undefined behaviour, x86 produces `low(int64)` whereas arm64 saturates
|
||||
## to `high(int64)`, which made this compile time check target dependent.
|
||||
if classify(f) in {fcNan, fcInf, fcNegInf}: return false
|
||||
let v = trunc(f)
|
||||
# `uint64` is the widest ordinal type there is:
|
||||
if abs(v) >= 18446744073709551616.0: return false
|
||||
# `v` is integral and its magnitude is below 2^64, so splitting it into two
|
||||
# 32 bit halves is exact:
|
||||
let a = abs(v)
|
||||
let hi = uint32(a / 4294967296.0)
|
||||
let lo = uint32(a - float64(hi) * 4294967296.0)
|
||||
var i = (toInt128(hi) shl 32) + toInt128(lo)
|
||||
if v < 0: i = -i
|
||||
result = firstOrd(conf, t) <= i and i <= lastOrd(conf, t)
|
||||
|
||||
proc checkConvertible(c: PContext, targetTyp: PType, src: PNode): TConvStatus =
|
||||
let srcTyp = src.typ.skipTypes({tyStatic})
|
||||
result = convOK
|
||||
@@ -347,8 +365,7 @@ proc checkConvertible(c: PContext, targetTyp: PType, src: PNode): TConvStatus =
|
||||
targetTyp.kind notin {tyUInt..tyUInt64}:
|
||||
result = convNotInRange
|
||||
elif src.kind in nkFloatLit..nkFloat64Lit and
|
||||
(classify(src.floatVal) in {fcNan, fcNegInf, fcInf} or
|
||||
src.floatVal.int64 notin firstOrd(c.config, targetTyp)..lastOrd(c.config, targetTyp)):
|
||||
not floatFitsOrdinal(c.config, src.floatVal, targetTyp):
|
||||
result = convNotInRange
|
||||
elif targetBaseTyp.kind in tyFloat..tyFloat64:
|
||||
if src.kind in nkFloatLit..nkFloat64Lit and
|
||||
|
||||
@@ -158,7 +158,7 @@ To run a single test:
|
||||
```
|
||||
|
||||
For reproducible tests (to reproduce an environment more similar to the one
|
||||
run by Continuous Integration on GitHub actions/azure pipelines), you may want to disable your
|
||||
run by Continuous Integration on GitHub actions), you may want to disable your
|
||||
local configuration (e.g. in ``~/.config/nim/nim.cfg``) which may affect some
|
||||
tests; this can also be achieved by using
|
||||
`export XDG_CONFIG_HOME=pathtoAlternateConfig`:cmd: before running `./koch`:cmd:
|
||||
@@ -523,14 +523,14 @@ Continuous Integration (CI)
|
||||
1. Continuous Integration is by default run on every push in a PR; this clogs
|
||||
the CI pipeline and affects other PR's; if you don't need it (e.g. for WIP or
|
||||
documentation only changes), add ``[skip ci]`` to your commit message title.
|
||||
This convention is supported by our GitHub actions pipelines and our azure pipeline
|
||||
(using custom logic, which should complete in < 1mn) as well as our former other pipelines:
|
||||
This convention is supported natively by our GitHub actions pipelines as well
|
||||
as our former other pipelines:
|
||||
[Appveyor](
|
||||
https://www.appveyor.com/docs/how-to/filtering-commits/#skip-directive-in-commit-message)
|
||||
and [Travis](
|
||||
https://docs.travis-ci.com/user/customizing-the-build/#skipping-a-build).
|
||||
|
||||
2. Consider enabling CI (azure, GitHub actions and builds.sr.ht) in your own Nim fork, and
|
||||
2. Consider enabling CI (GitHub actions) in your own Nim fork, and
|
||||
waiting for CI to be green in that fork (fixing bugs as needed) before
|
||||
opening your PR in the original Nim repo, to reduce CI congestion. Same
|
||||
applies for updates on a PR: you can test commits on a separate private
|
||||
@@ -548,11 +548,6 @@ Debugging CI failures, flaky tests, etc
|
||||
request collaboration from the Nim team. The Nim team should
|
||||
follow these instructions to only restart the jobs that failed:
|
||||
|
||||
* Azure: if on your own fork, it's possible from inside azure console
|
||||
(e.g. ``dev.azure.com/username/username/_build/results?buildId=1430&view=results``) via
|
||||
``rerun failed jobs`` on top.
|
||||
If either on you own fork or in Nim repo, it's possible from inside GitHub UI
|
||||
under checks tab, see https://github.com/timotheecour/Nim/issues/211#issuecomment-629751569
|
||||
* GitHub actions: under "Checks" tab, click "Re-run jobs" in the right.
|
||||
* builds.sr.ht: create a SourceHut account so that you can restart a PR job as illustrated.
|
||||
builds.sr.ht also allows you to ssh to a CI machine which can help a lot for debugging
|
||||
|
||||
@@ -203,7 +203,7 @@ Example "template" **to edit** and write a Testament unittest:
|
||||
disabled: "win"
|
||||
disabled: "32bit" # ...or architectures
|
||||
disabled: "i386"
|
||||
disabled: "azure" # ...or pipeline runners
|
||||
disabled: "github" # ...or pipeline runners
|
||||
disabled: true # ...or can disable the test entirely
|
||||
|
||||
"""
|
||||
@@ -218,7 +218,7 @@ Example "template" **to edit** and write a Testament unittest:
|
||||
see parseSpec()](https://github.com/nim-lang/Nim/blob/devel/testament/specs.nim#L317).
|
||||
* Nim itself uses Testament, so [there are plenty of test examples](
|
||||
https://github.com/nim-lang/Nim/tree/devel/tests).
|
||||
* Has some built-in CI compatibility, like Azure Pipelines, etc.
|
||||
* Has some built-in CI compatibility, like GitHub Actions, etc.
|
||||
|
||||
|
||||
Inline hints, warnings and errors (notes)
|
||||
|
||||
@@ -5,7 +5,7 @@ description = "Nim package providing the compiler binary"
|
||||
license = "MIT"
|
||||
|
||||
bin = @["compiler/nim", "nimsuggest/nimsuggest"]
|
||||
skipFiles = @["azure-pipelines.yml" , "build_all.bat" , "build_all.sh" , "build_nimble.bat" , "build_nimble.sh" , "changelog.md" , "koch.nim.cfg" , "nimblemeta.json" , "readme.md" , "security.md" ]
|
||||
skipFiles = @["build_all.bat" , "build_all.sh" , "build_nimble.bat" , "build_nimble.sh" , "changelog.md" , "koch.nim.cfg" , "nimblemeta.json" , "readme.md" , "security.md" ]
|
||||
skipDirs = @["build" , "changelogs" , "ci" , "csources_v3" , "drnim" , "nimdoc", "testament"]
|
||||
|
||||
before install:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# <img src="https://raw.githubusercontent.com/nim-lang/assets/master/Art/logo-crown.png" height="28px"/> Nim
|
||||
|
||||
[](https://dev.azure.com/nim-lang/Nim/_build/latest?definitionId=1&branchName=devel)
|
||||
[](https://github.com/nim-lang/Nim/actions/workflows/ci_main.yml?query=branch%3Adevel)
|
||||
|
||||
This repository contains the Nim compiler, Nim's stdlib, tools, and documentation.
|
||||
For more information about Nim, including downloads and documentation for
|
||||
|
||||
@@ -79,10 +79,13 @@ proc runBasicDLLTest(c, r: var TResults, cat: Category, options: string, isOrc =
|
||||
defer: putEnv(libpathenv, libpath)
|
||||
|
||||
testSpec r, makeTest("tests/dll/client.nim", options & " --threads:on" & rpath, cat)
|
||||
testSpec r, makeTest("tests/dll/nimhcr_unit.nim", options & " --threads:off" & rpath, cat)
|
||||
when not defined(osx):
|
||||
# the nimhcr runtime segfaults on macOS:
|
||||
testSpec r, makeTest("tests/dll/nimhcr_unit.nim", options & " --threads:off" & rpath, cat)
|
||||
testSpec r, makeTest("tests/dll/visibility.nim", options & " --threads:off" & rpath, cat)
|
||||
|
||||
if "boehm" notin options:
|
||||
# the nimhcr runtime segfaults on macOS, so no hcr test runs there:
|
||||
if "boehm" notin options and not defined(osx):
|
||||
# hcr tests
|
||||
|
||||
var basicHcrTest = makeTest("tests/dll/nimhcr_basic.nim", options & " --threads:off --forceBuild --hotCodeReloading:on " & rpath, cat)
|
||||
|
||||
@@ -24,6 +24,7 @@ var compilerPrefix* = findExe("nim")
|
||||
let isTravis* = existsEnv("TRAVIS")
|
||||
let isAppVeyor* = existsEnv("APPVEYOR")
|
||||
let isAzure* = existsEnv("TF_BUILD")
|
||||
let isGithubActions* = existsEnv("GITHUB_ACTIONS")
|
||||
|
||||
var skips*: seq[string]
|
||||
|
||||
@@ -434,8 +435,10 @@ proc parseSpec*(filename: string): TSpec =
|
||||
if isTravis: result.err = reDisabled
|
||||
of "appveyor": # deprecated
|
||||
if isAppVeyor: result.err = reDisabled
|
||||
of "azure":
|
||||
of "azure": # deprecated
|
||||
if isAzure: result.err = reDisabled
|
||||
of "github":
|
||||
if isGithubActions: result.err = reDisabled
|
||||
else:
|
||||
# Check whether the value exists as an OS or CPU that is
|
||||
# defined in `compiler/platform`.
|
||||
|
||||
@@ -48,24 +48,31 @@ proc genShellCmd(filename: string): string =
|
||||
else: "sh " & filename
|
||||
|
||||
when defined(nimTrunnerFfi):
|
||||
block: # mevalffi
|
||||
when defined(openbsd):
|
||||
#[
|
||||
openbsd defines `#define stderr (&__sF[2])` which makes it cumbersome
|
||||
for dlopen'ing inside `importcSymbol`. Instead of adding special rules
|
||||
inside `importcSymbol` to handle this, we disable just the part that's
|
||||
not working and will provide a more general, clean fix in future PR.
|
||||
]#
|
||||
var opt = "-d:nimEvalffiStderrWorkaround"
|
||||
let prefix = ""
|
||||
else:
|
||||
var opt = ""
|
||||
let prefix = """
|
||||
#[
|
||||
Disabled on macOS: the AArch64 Apple ABI passes variadic arguments on the
|
||||
stack, which requires `ffi_prep_cif_var`; `evalffi` only ever calls
|
||||
`ffi_prep_cif`, so every vararg arrives as 0 and `mevalffi` fails. Re-enable
|
||||
once the compiler's libffi usage learns about variadic calls.
|
||||
]#
|
||||
when not defined(osx):
|
||||
block: # mevalffi
|
||||
when defined(openbsd):
|
||||
#[
|
||||
openbsd defines `#define stderr (&__sF[2])` which makes it cumbersome
|
||||
for dlopen'ing inside `importcSymbol`. Instead of adding special rules
|
||||
inside `importcSymbol` to handle this, we disable just the part that's
|
||||
not working and will provide a more general, clean fix in future PR.
|
||||
]#
|
||||
var opt = "-d:nimEvalffiStderrWorkaround"
|
||||
let prefix = ""
|
||||
else:
|
||||
var opt = ""
|
||||
let prefix = """
|
||||
hello world stderr
|
||||
hi stderr
|
||||
"""
|
||||
let output = runNimCmdChk("vm/mevalffi.nim", fmt"{opt} --warnings:off --experimental:compiletimeFFI")
|
||||
doAssert output == fmt"""
|
||||
let output = runNimCmdChk("vm/mevalffi.nim", fmt"{opt} --warnings:off --experimental:compiletimeFFI")
|
||||
doAssert output == fmt"""
|
||||
{prefix}foo
|
||||
foo:100
|
||||
foo:101
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
discard """
|
||||
matrix: "--mm:refc"
|
||||
disabled: "win"
|
||||
output: '''
|
||||
'''
|
||||
"""
|
||||
|
||||
@@ -2,18 +2,19 @@ discard """
|
||||
cmd: "nim check --hint:Processing:off --hint:Conf:off $file"
|
||||
errormsg: "18446744073709551615 can't be converted to int8"
|
||||
nimout: '''
|
||||
tcompiletime_range_checks.nim(36, 21) Error: 2147483648 can't be converted to int32
|
||||
tcompiletime_range_checks.nim(38, 34) Error: 255 can't be converted to FullNegativeRange
|
||||
tcompiletime_range_checks.nim(39, 34) Error: 18446744073709551615 can't be converted to HalfNegativeRange
|
||||
tcompiletime_range_checks.nim(40, 34) Error: 300 can't be converted to FullPositiveRange
|
||||
tcompiletime_range_checks.nim(41, 30) Error: 101 can't be converted to UnsignedRange
|
||||
tcompiletime_range_checks.nim(42, 32) Error: -9223372036854775808 can't be converted to SemiOutOfBounds
|
||||
tcompiletime_range_checks.nim(44, 22) Error: nan can't be converted to int32
|
||||
tcompiletime_range_checks.nim(46, 23) Error: 1e+100 can't be converted to uint64
|
||||
tcompiletime_range_checks.nim(49, 22) Error: 18446744073709551615 can't be converted to int64
|
||||
tcompiletime_range_checks.nim(50, 22) Error: 18446744073709551615 can't be converted to int32
|
||||
tcompiletime_range_checks.nim(51, 22) Error: 18446744073709551615 can't be converted to int16
|
||||
tcompiletime_range_checks.nim(52, 21) Error: 18446744073709551615 can't be converted to int8
|
||||
tcompiletime_range_checks.nim(37, 21) Error: 2147483648 can't be converted to int32
|
||||
tcompiletime_range_checks.nim(39, 34) Error: 255 can't be converted to FullNegativeRange
|
||||
tcompiletime_range_checks.nim(40, 34) Error: 18446744073709551615 can't be converted to HalfNegativeRange
|
||||
tcompiletime_range_checks.nim(41, 34) Error: 300 can't be converted to FullPositiveRange
|
||||
tcompiletime_range_checks.nim(42, 30) Error: 101 can't be converted to UnsignedRange
|
||||
tcompiletime_range_checks.nim(43, 32) Error: -9223372036854775808 can't be converted to SemiOutOfBounds
|
||||
tcompiletime_range_checks.nim(45, 22) Error: nan can't be converted to int32
|
||||
tcompiletime_range_checks.nim(46, 22) Error: 1e+100 can't be converted to int64
|
||||
tcompiletime_range_checks.nim(47, 23) Error: 1e+100 can't be converted to uint64
|
||||
tcompiletime_range_checks.nim(50, 22) Error: 18446744073709551615 can't be converted to int64
|
||||
tcompiletime_range_checks.nim(51, 22) Error: 18446744073709551615 can't be converted to int32
|
||||
tcompiletime_range_checks.nim(52, 22) Error: 18446744073709551615 can't be converted to int16
|
||||
tcompiletime_range_checks.nim(53, 21) Error: 18446744073709551615 can't be converted to int8
|
||||
'''
|
||||
"""
|
||||
|
||||
|
||||
21
tests/range/tfloat_to_ordinal_conv.nim
Normal file
21
tests/range/tfloat_to_ordinal_conv.nim
Normal file
@@ -0,0 +1,21 @@
|
||||
discard """
|
||||
targets: "c cpp"
|
||||
"""
|
||||
|
||||
# The compile time range check must not depend on the host's float to integer
|
||||
# conversion: `1e100.int64` is undefined behaviour, x86 produces `low(int64)`
|
||||
# whereas arm64 saturates to `high(int64)`, so the compiler used to accept or
|
||||
# reject these conversions depending on the machine it ran on.
|
||||
|
||||
import std/assertions
|
||||
|
||||
static:
|
||||
doAssert not compiles(int64(1e100))
|
||||
doAssert not compiles(uint64(1e100))
|
||||
doAssert not compiles(int64(9223372036854775808.0)) # 2^63, one past high(int64)
|
||||
doAssert not compiles(uint64(18446744073709551616.0)) # 2^64
|
||||
|
||||
# fits `uint64` but not `int64`:
|
||||
doAssert uint64(1e19) == 10000000000000000000'u64
|
||||
doAssert int64(-9223372036854775808.0) == low(int64)
|
||||
doAssert int8(-128.9) == -128'i8
|
||||
Reference in New Issue
Block a user