Skip to content

Support emitting a generated function - #786

Merged
vchuravy merged 5 commits into
mainfrom
vc/generated-main
Oct 4, 2026
Merged

vchuravy merged 5 commits into
mainfrom
vc/generated-main

Conversation

@vchuravy

Copy link
Copy Markdown
Member

Port of #667 (which targets release-0.9) to main for 0.10.

Adds a generated=true configuration to @kernel. The transformed kernel body is quoted and run through macroexpand, so $ interpolation is available inside the kernel and where-parameters are bound to their values. This makes it possible to write e.g.

@kernel generated = true function kernel!(a, ::Val{N}) where {N}
    @unroll $N for i in 1:5
        @inbounds a[i] = i * $N
    end
end

since @unroll N requires a literal count.

Differences from #667:

  • main only emits the GPU function, so only that path is wrapped.
  • __kernel now takes __module__ alongside __source__.
  • The @kernel docstring documents the new option.
  • The test lives in test/unroll.jl and actually launches the kernel and checks the result (the test added in support emitting a generated function #667 called an undefined test_generated_kernel).

Locally verified on the CPU (POCL) backend: the unroll, linenumbers and CPU codegen testsuites pass, and @device_code_llvm on a generated kernel works.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main ba30fa9... main / ba30fa9...
const/@Const/Float32/262144 0.526 ± 0.021 ms 0.527 ± 0.022 ms 1 ± 0.057
const/@Const/Float32/65536 0.171 ± 0.0089 ms 0.216 ± 0.0067 ms 0.792 ± 0.048
const/@Const/Float64/262144 0.889 ± 0.015 ms 0.899 ± 0.018 ms 0.989 ± 0.025
const/@Const/Float64/65536 0.367 ± 0.014 ms 0.368 ± 0.014 ms 0.999 ± 0.055
const/unmarked/Float32/262144 2.23 ± 0.053 ms 2.2 ± 0.01 ms 1.01 ± 0.025
const/unmarked/Float32/65536 0.595 ± 0.017 ms 0.597 ± 0.018 ms 0.997 ± 0.042
const/unmarked/Float64/262144 3.13 ± 0.047 ms 3.13 ± 0.01 ms 0.999 ± 0.016
const/unmarked/Float64/65536 0.808 ± 0.013 ms 0.812 ± 0.0071 ms 0.995 ± 0.019
launch/3D static workgroup, dynamic ndrange 10.7 ± 0.68 μs 10.8 ± 41 μs 0.987 ± 3.8
launch/3D static workgroup, static ndrange 10.7 ± 0.82 μs 10.5 ± 0.5 μs 1.03 ± 0.093
launch/dynamic workgroup, dynamic ndrange 12.3 ± 14 μs 12.3 ± 40 μs 1 ± 3.4
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 11.9 ± 0.41 μs 11.8 ± 0.51 μs 1.01 ± 0.056
launch/static workgroup, dynamic ndrange 0.0503 ± 0.042 ms 11.5 ± 0.38 μs 4.36 ± 3.7
launch/static workgroup, static ndrange 10.6 ± 0.54 μs 11.7 ± 0.72 μs 0.904 ± 0.072
partition/dynamic workgroup, dynamic ndrange 0.059 ± 0.0018 μs 0.0594 ± 0.0012 μs 0.993 ± 0.036
partition/static workgroup, dynamic ndrange 0.0638 ± 0.011 μs 0.0561 ± 0.01 μs 1.14 ± 0.28
partition/static workgroup, static ndrange 1.55 ± 0.01 ns 1.55 ± 0.01 ns 1 ± 0.0091
saxpy/default/Float16/1024 0.0557 ± 0.0046 ms 0.0542 ± 0.0038 ms 1.03 ± 0.11
saxpy/default/Float16/1048576 1.47 ± 0.019 ms 1.47 ± 0.024 ms 1 ± 0.021
saxpy/default/Float16/16384 0.0731 ± 0.01 ms 0.0733 ± 0.012 ms 0.996 ± 0.21
saxpy/default/Float16/2048 0.0565 ± 0.0027 ms 0.0563 ± 0.003 ms 1 ± 0.072
saxpy/default/Float16/256 11.5 ± 6.9 μs 11.3 ± 0.47 μs 1.01 ± 0.61
saxpy/default/Float16/262144 0.406 ± 0.016 ms 0.405 ± 0.016 ms 1 ± 0.055
saxpy/default/Float16/32768 0.0949 ± 0.0071 ms 0.0922 ± 0.0071 ms 1.03 ± 0.11
saxpy/default/Float16/4096 0.0599 ± 0.0049 ms 0.059 ± 0.0048 ms 1.02 ± 0.12
saxpy/default/Float16/512 11.5 ± 0.19 μs 11.5 ± 9 μs 0.999 ± 0.79
saxpy/default/Float16/64 11.3 ± 0.16 μs 11.2 ± 0.44 μs 1.01 ± 0.042
saxpy/default/Float16/65536 0.136 ± 0.0065 ms 0.139 ± 0.007 ms 0.982 ± 0.068
saxpy/default/Float32/1024 0.053 ± 0.035 ms 0.054 ± 0.04 ms 0.982 ± 0.98
saxpy/default/Float32/1048576 0.767 ± 0.11 ms 0.79 ± 0.077 ms 0.971 ± 0.16
saxpy/default/Float32/16384 0.0615 ± 0.0065 ms 0.0628 ± 0.0075 ms 0.98 ± 0.16
saxpy/default/Float32/2048 0.0542 ± 0.0052 ms 0.0562 ± 0.0047 ms 0.964 ± 0.12
saxpy/default/Float32/256 11.3 ± 0.27 μs 11.4 ± 40 μs 0.993 ± 3.5
saxpy/default/Float32/262144 0.217 ± 0.028 ms 0.212 ± 0.03 ms 1.02 ± 0.2
saxpy/default/Float32/32768 0.0715 ± 0.0077 ms 0.0713 ± 0.0073 ms 1 ± 0.15
saxpy/default/Float32/4096 0.0553 ± 0.005 ms 0.0581 ± 0.005 ms 0.952 ± 0.12
saxpy/default/Float32/512 10.6 ± 6.4 μs 14.5 ± 5.4 μs 0.735 ± 0.52
saxpy/default/Float32/64 11.3 ± 0.32 μs 11.3 ± 38 μs 0.997 ± 3.4
saxpy/default/Float32/65536 0.0978 ± 0.0098 ms 0.0979 ± 0.01 ms 0.999 ± 0.14
saxpy/default/Float64/1024 0.0536 ± 0.0043 ms 0.0532 ± 0.011 ms 1.01 ± 0.23
saxpy/default/Float64/1048576 1.21 ± 0.14 ms 1.13 ± 0.17 ms 1.07 ± 0.2
saxpy/default/Float64/16384 0.0645 ± 0.0073 ms 0.0631 ± 0.0064 ms 1.02 ± 0.15
saxpy/default/Float64/2048 0.0556 ± 0.004 ms 0.0551 ± 0.0045 ms 1.01 ± 0.11
saxpy/default/Float64/256 14.3 ± 4.9 μs 13.8 ± 4.9 μs 1.03 ± 0.51
saxpy/default/Float64/262144 0.279 ± 0.036 ms 0.277 ± 0.046 ms 1.01 ± 0.21
saxpy/default/Float64/32768 0.0812 ± 0.0098 ms 0.0781 ± 0.0066 ms 1.04 ± 0.15
saxpy/default/Float64/4096 0.0519 ± 0.0099 ms 0.0555 ± 0.0079 ms 0.935 ± 0.22
saxpy/default/Float64/512 0.0525 ± 0.008 ms 15.5 ± 5.2 μs 3.39 ± 1.3
saxpy/default/Float64/64 12.4 ± 40 μs 11.1 ± 0.55 μs 1.11 ± 3.6
saxpy/default/Float64/65536 0.108 ± 0.016 ms 0.109 ± 0.012 ms 0.993 ± 0.18
saxpy/static workgroup=(1024,)/Float16/1024 0.0548 ± 0.006 ms 0.0542 ± 0.0056 ms 1.01 ± 0.15
saxpy/static workgroup=(1024,)/Float16/1048576 1.48 ± 0.017 ms 1.47 ± 0.024 ms 1 ± 0.02
saxpy/static workgroup=(1024,)/Float16/16384 0.0737 ± 0.01 ms 0.0746 ± 0.0073 ms 0.987 ± 0.17
saxpy/static workgroup=(1024,)/Float16/2048 0.0563 ± 0.0027 ms 0.0557 ± 0.0046 ms 1.01 ± 0.096
saxpy/static workgroup=(1024,)/Float16/256 11.9 ± 39 μs 11.6 ± 0.29 μs 1.03 ± 3.4
saxpy/static workgroup=(1024,)/Float16/262144 0.409 ± 0.016 ms 0.409 ± 0.019 ms 0.998 ± 0.061
saxpy/static workgroup=(1024,)/Float16/32768 0.0919 ± 0.0074 ms 0.094 ± 0.0078 ms 0.977 ± 0.11
saxpy/static workgroup=(1024,)/Float16/4096 0.0599 ± 0.0082 ms 0.0621 ± 0.0073 ms 0.965 ± 0.17
saxpy/static workgroup=(1024,)/Float16/512 11.9 ± 33 μs 11.6 ± 0.25 μs 1.03 ± 2.9
saxpy/static workgroup=(1024,)/Float16/64 11.7 ± 0.23 μs 11.5 ± 0.26 μs 1.01 ± 0.031
saxpy/static workgroup=(1024,)/Float16/65536 0.139 ± 0.0081 ms 0.138 ± 0.0079 ms 1.01 ± 0.083
saxpy/static workgroup=(1024,)/Float32/1024 0.0492 ± 0.041 ms 15.7 ± 39 μs 3.13 ± 8.1
saxpy/static workgroup=(1024,)/Float32/1048576 0.793 ± 0.084 ms 0.774 ± 0.073 ms 1.02 ± 0.14
saxpy/static workgroup=(1024,)/Float32/16384 0.0597 ± 0.0069 ms 0.0614 ± 0.0078 ms 0.973 ± 0.17
saxpy/static workgroup=(1024,)/Float32/2048 0.0554 ± 0.0077 ms 0.0541 ± 0.0059 ms 1.02 ± 0.18
saxpy/static workgroup=(1024,)/Float32/256 16 ± 41 μs 11.6 ± 33 μs 1.37 ± 5.3
saxpy/static workgroup=(1024,)/Float32/262144 0.226 ± 0.027 ms 0.22 ± 0.024 ms 1.03 ± 0.17
saxpy/static workgroup=(1024,)/Float32/32768 0.0723 ± 0.0071 ms 0.0715 ± 0.008 ms 1.01 ± 0.15
saxpy/static workgroup=(1024,)/Float32/4096 0.0496 ± 0.0089 ms 0.0529 ± 0.01 ms 0.937 ± 0.25
saxpy/static workgroup=(1024,)/Float32/512 0.0522 ± 0.04 ms 18.4 ± 43 μs 2.84 ± 7
saxpy/static workgroup=(1024,)/Float32/64 12.3 ± 42 μs 0.0513 ± 0.041 ms 0.239 ± 0.84
saxpy/static workgroup=(1024,)/Float32/65536 0.0964 ± 0.01 ms 0.0946 ± 0.01 ms 1.02 ± 0.15
saxpy/static workgroup=(1024,)/Float64/1024 0.0543 ± 0.0089 ms 0.055 ± 0.0053 ms 0.988 ± 0.19
saxpy/static workgroup=(1024,)/Float64/1048576 1.21 ± 0.22 ms 1.36 ± 0.22 ms 0.892 ± 0.21
saxpy/static workgroup=(1024,)/Float64/16384 0.0643 ± 0.0077 ms 0.0628 ± 0.0081 ms 1.02 ± 0.18
saxpy/static workgroup=(1024,)/Float64/2048 0.0558 ± 0.0042 ms 0.0565 ± 0.0066 ms 0.987 ± 0.14
saxpy/static workgroup=(1024,)/Float64/256 0.0542 ± 0.0054 ms 0.0543 ± 0.0055 ms 0.998 ± 0.14
saxpy/static workgroup=(1024,)/Float64/262144 0.272 ± 0.034 ms 0.277 ± 0.034 ms 0.982 ± 0.17
saxpy/static workgroup=(1024,)/Float64/32768 0.0792 ± 0.013 ms 0.0843 ± 0.0096 ms 0.94 ± 0.18
saxpy/static workgroup=(1024,)/Float64/4096 0.0546 ± 0.0077 ms 0.055 ± 0.008 ms 0.993 ± 0.2
saxpy/static workgroup=(1024,)/Float64/512 0.0532 ± 0.0063 ms 0.0527 ± 0.036 ms 1.01 ± 0.71
saxpy/static workgroup=(1024,)/Float64/64 12.5 ± 40 μs 11.6 ± 0.73 μs 1.08 ± 3.5
saxpy/static workgroup=(1024,)/Float64/65536 0.115 ± 0.019 ms 0.107 ± 0.013 ms 1.08 ± 0.22
time_to_load 0.483 ± 0.0017 s 0.493 ± 0.0046 s 0.98 ± 0.0098
main ba30fa9... main / ba30fa9...
const/@Const/Float32/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float32/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float64/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/@Const/Float64/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float32/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float32/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float64/262144 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
const/unmarked/Float64/65536 9 allocs: 0.203 kB 9 allocs: 0.203 kB 1
launch/3D static workgroup, dynamic ndrange 9 allocs: 0.219 kB 9 allocs: 0.219 kB 1
launch/3D static workgroup, static ndrange 9 allocs: 0.219 kB 9 allocs: 0.219 kB 1
launch/dynamic workgroup, dynamic ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/static workgroup, dynamic ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
launch/static workgroup, static ndrange 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
partition/dynamic workgroup, dynamic ndrange 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
partition/static workgroup, dynamic ndrange 2 allocs: 32 B 2 allocs: 32 B 1
partition/static workgroup, static ndrange 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float16/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/16384 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float16/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/32768 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float16/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float16/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float16/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float32/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float32/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float32/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float32/32768 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float32/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float32/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float64/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/32768 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/default/Float64/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/default/Float64/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/default/Float64/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/16384 12 allocs: 0.25 kB 8 allocs: 0.141 kB 1.78
saxpy/static workgroup=(1024,)/Float16/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float16/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/32768 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float16/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float16/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float16/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float32/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float32/32768 12 allocs: 0.25 kB 8 allocs: 0.141 kB 1.78
saxpy/static workgroup=(1024,)/Float32/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float32/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float32/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/1024 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/1048576 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/16384 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/2048 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/256 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float64/262144 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/32768 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
saxpy/static workgroup=(1024,)/Float64/4096 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/512 8 allocs: 0.141 kB 8 allocs: 0.141 kB 1
saxpy/static workgroup=(1024,)/Float64/64 5 allocs: 0.0938 kB 5 allocs: 0.0938 kB 1
saxpy/static workgroup=(1024,)/Float64/65536 12 allocs: 0.25 kB 12 allocs: 0.25 kB 1
time_to_load 0.2 k allocs: 11.8 kB 0.2 k allocs: 11.8 kB 1

Benchmark Plots

A plot of the benchmark results have been uploaded as an artifact to the workflow run for this PR.
Go to "Actions"->"Benchmark a pull request"->[the most recent run]->"Artifacts" (at the bottom).

@vchuravy vchuravy added this to the 0.10.0 milestone Oct 3, 2026
@vchuravy
vchuravy requested a review from maleadt October 3, 2026 15:04
@codecov

codecov Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 91.66667% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 79.35%. Comparing base (e70abc3) to head (ba30fa9).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
src/macros.jl 92.85% 3 Missing ⚠️
src/KernelAbstractions.jl 83.33% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #786      +/-   ##
==========================================
+ Coverage   79.06%   79.35%   +0.28%     
==========================================
  Files          24       24              
  Lines        2040     2088      +48     
==========================================
+ Hits         1613     1657      +44     
- Misses        427      431       +4     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread src/KernelAbstractions.jl Outdated
Add a `generated=true` configuration to `@kernel`. The transformed kernel
body is quoted and expanded via `macroexpand`, so `$` interpolation is
available and `where`-parameters are bound to their values. This makes it
possible to e.g. unroll a loop `$N` times with `@unroll $N for ...`, which
requires a literal count.

Port of #667 (release-0.9) to main / 0.10.

Assisted-by: Claude Code (Fable 5.1)
- Reject short-form method definitions wrapped in `where` clauses or a
  return type annotation (`g(x::T) where {T} = ...`, `g(x)::T = ...`),
  which previously slipped past the closure check and surfaced only as
  "kernel returns a value of type `Any`".
- Make `generated_error_body` robust against failures while building the
  message, and escape NUL characters, which a `Symbol` cannot contain.

Assisted-by: Claude Code (Opus 5.5)
Comment thread src/KernelAbstractions.jl Outdated
Assisted-by: Claude Code (Opus 5.5)
@vchuravy
vchuravy merged commit 952c482 into main Oct 4, 2026
68 of 69 checks passed
@vchuravy
vchuravy deleted the vc/generated-main branch October 4, 2026 10:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant