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:
Andreas Rumpf
2026-09-09 06:53:02 +02:00
committed by GitHub
parent 50778f2946
commit 1109fc4f83
14 changed files with 253 additions and 221 deletions

153
.github/workflows/ci_main.yml vendored Normal file
View 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

View File

@@ -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)

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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:

View File

@@ -1,6 +1,6 @@
# <img src="https://raw.githubusercontent.com/nim-lang/assets/master/Art/logo-crown.png" height="28px"/> Nim
[![Build Status](https://dev.azure.com/nim-lang/Nim/_apis/build/status/nim-lang.Nim?branchName=devel)](https://dev.azure.com/nim-lang/Nim/_build/latest?definitionId=1&branchName=devel)
[![Build Status](https://github.com/nim-lang/Nim/actions/workflows/ci_main.yml/badge.svg?branch=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

View File

@@ -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)

View File

@@ -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`.

View File

@@ -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

View File

@@ -1,5 +1,6 @@
discard """
matrix: "--mm:refc"
disabled: "win"
output: '''
'''
"""

View File

@@ -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
'''
"""

View 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