Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
8d5205e
Set world bounds on `CodeInfo` created for `OpaqueClosure(::IRCode)` …
serenity4 Sep 24, 2025
3c33f50
Fix gcdx and lcm with mixed signed/unsigned arguments (#59628)
Liozou Sep 25, 2025
734aee5
effects: improve nothrow modeling for `Core._svec_len` (#59706)
aviatesk Sep 30, 2025
b26c91c
Fix rounding when converting Rational to BigFloat (#59063)
OlivierHnt Jul 27, 2025
58ebaaf
[Compiler] fix stdout/stderr to point to Core (#59672)
vtjnash Sep 29, 2025
70139ad
do not specialze for `abstract_eval_nonlinearized_foreigncall_name` (…
aviatesk Oct 2, 2025
37256d2
Compiler: fix inferred nothrow effects for add_ptr and sub_ptr (#59720)
vtjnash Oct 2, 2025
c715ddb
fix `powermod` correctness on unsigned power of half typemax (#59680)
adienes Sep 30, 2025
2c4d5cf
retain size for zero length multidimensional arrays in mmap (#59719)
KristofferC Oct 2, 2025
9e7bb28
improve compile-ability of method errors (#59709)
vtjnash Oct 2, 2025
f0d9809
iobuffer: fix overflow OOB read/write bugs (#59728)
vtjnash Oct 3, 2025
1d71dea
fix getting field docstrings for parametric structs (#59725)
KristofferC Oct 4, 2025
b5bed04
Improve floating-point Euclidean division for Float16 and Float32 (#4…
simonbyrne Oct 4, 2025
6c28ba0
[NFC] add tests for typemin power of float (#59745)
adienes Oct 5, 2025
54a39e0
[REPL] Do not corrupt input when using numbered_prompt! mode (#59730)
vtjnash Oct 6, 2025
8c05c90
array: avoid overallocation when inserting at beginning of empty arra…
vtjnash Oct 6, 2025
ae6d287
Revert "Restrict COFF to a single thread when symbol count is high (#…
topolarity Oct 7, 2025
fb4e890
Avoid method instance normalization for opaque closure methods (#59772)
serenity4 Oct 7, 2025
9de8e46
Allow globalref on lhs of op= (#59762)
mlechu Oct 7, 2025
6adc7f3
fix prefix IntrusiveLinkedList with Base in a REPL test util (#59782)
KristofferC Oct 9, 2025
ba3b093
[REPL] Fix keyword arguments completions with do block (#59123)
xal-0 Jul 29, 2025
028c977
specialize show of `:` to make `reshape` trimmable (#59598)
JeffBezanson Sep 19, 2025
ffaef87
lowering: increment world age after toplevel expressions (#59703)
Keno Oct 1, 2025
630774d
fix performance of ProductIterator for non-concrete iterators (#59711)
vtjnash Oct 2, 2025
b846962
[libblastrampoline] Bump to v5.15.0 (#59748)
staticfloat Oct 6, 2025
3eb52df
[InteractiveUtils] specify code_warntype vararg length (#59726)
vtjnash Oct 6, 2025
1e2f8a5
Align interpreter and codegen error behavior of setglobal! and friend…
Keno Oct 8, 2025
9e05e95
Change delayed delete mechanism to prevent cross-drive mv failure for…
Liozou Oct 1, 2025
f3446e9
`CoreLogging`: prevent some `Annotated*`-related instability (#59467)
oscardssmith Sep 19, 2025
c186014
Print task backtraces on sigquit (#59389)
gbaraldi Sep 24, 2025
e0a44d7
[1.12] Backport (improve sysimage.mk more completely (#57758)) (#59793)
vchuravy Oct 12, 2025
bde875a
CI 1.12: Use the 1.12-specific Buildkite branch (#59759)
DilumAluthge Oct 12, 2025
cceb0f9
Precompile out of env deps in serial within precompilepkgs (#59122)
IanButterworth Aug 2, 2025
c501ddd
Fix precompiling when there's no manifest (#59212)
IanButterworth Aug 7, 2025
971c4af
Add note about `@threads` threadpool (#59802)
IanButterworth Oct 11, 2025
1f8bc09
run custom platform comparison strategies in the latest world (#59832)
KristofferC Oct 14, 2025
4f45f3f
force inline `pow_fast` (#59824)
KristofferC Oct 13, 2025
4f05d8d
bump Pkg to latest 1.12
KristofferC Oct 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .buildkite-external-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
main
release-julia-1.12
8 changes: 5 additions & 3 deletions Compiler/src/Compiler.jl
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,8 @@ using Core: ABIOverride, Builtin, CodeInstance, IntrinsicFunction, MethodInstanc
MethodTable, MethodCache, PartialOpaque, SimpleVector, TypeofVararg,
_apply_iterate, apply_type, compilerbarrier, donotdelete, memoryref_isassigned,
memoryrefget, memoryrefnew, memoryrefoffset, memoryrefset!, print, println, show, svec,
typename, unsafe_write, write
typename, unsafe_write, write, stdout, stderr

using Base
using Base: @_foldable_meta, @_gc_preserve_begin, @_gc_preserve_end, @nospecializeinfer,
PARTITION_KIND_GLOBAL, PARTITION_KIND_UNDEF_CONST, PARTITION_KIND_BACKDATED_CONST, PARTITION_KIND_DECLARED,
PARTITION_FLAG_DEPWARN,
Expand All @@ -64,7 +63,10 @@ using Base: @_foldable_meta, @_gc_preserve_begin, @_gc_preserve_end, @nospeciali
partition_restriction, quoted, rename_unionall, rewrap_unionall, specialize_method,
structdiff, tls_world_age, unconstrain_vararg_length, unionlen, uniontype_layout,
uniontypes, unsafe_convert, unwrap_unionall, unwrapva, vect, widen_diagonal,
_uncompressed_ir, maybe_add_binding_backedge!
_uncompressed_ir, maybe_add_binding_backedge!,
devnull, devnull as stdin

using Base
using Base.Order

import Base: ==, _topmod, append!, convert, copy, copy!, findall, first, get, get!,
Expand Down
19 changes: 12 additions & 7 deletions Compiler/src/abstractinterpretation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2488,7 +2488,7 @@ function abstract_eval_setglobal!(interp::AbstractInterpreter, sv::AbsIntState,
(rt, exct) = global_assignment_rt_exct(interp, sv, saw_latestworld, gr, v)
return CallMeta(rt, exct, Effects(setglobal!_effects, nothrow=exct===Bottom), GlobalAccessInfo(convert(Core.Binding, gr)))
end
return CallMeta(Union{}, TypeError, EFFECTS_THROWS, NoCallInfo())
return CallMeta(Union{}, Union{TypeError, ErrorException}, EFFECTS_THROWS, NoCallInfo())
end
⊑ = partialorder(typeinf_lattice(interp))
if !(hasintersect(widenconst(M), Module) && hasintersect(widenconst(s), Symbol))
Expand Down Expand Up @@ -3444,9 +3444,13 @@ function refine_partial_type(@nospecialize t)
return t
end

abstract_eval_nonlinearized_foreigncall_name(interp::AbstractInterpreter, e, sstate::StatementState, sv::IRInterpretationState) = nothing
abstract_eval_nonlinearized_foreigncall_name(
::AbstractInterpreter, @nospecialize(e), ::StatementState, ::IRInterpretationState
) = nothing

function abstract_eval_nonlinearized_foreigncall_name(interp::AbstractInterpreter, e, sstate::StatementState, sv::AbsIntState)
function abstract_eval_nonlinearized_foreigncall_name(
interp::AbstractInterpreter, @nospecialize(e), sstate::StatementState, sv::InferenceState
)
if isexpr(e, :call)
n = length(e.args)
argtypes = Vector{Any}(undef, n)
Expand Down Expand Up @@ -3728,7 +3732,7 @@ end

function global_assignment_rt_exct(interp::AbstractInterpreter, sv::AbsIntState, saw_latestworld::Bool, g::GlobalRef, @nospecialize(newty))
if saw_latestworld
return Pair{Any,Any}(newty, ErrorException)
return Pair{Any,Any}(newty, Union{TypeError, ErrorException})
end
newty′ = RefValue{Any}(newty)
(valid_worlds, ret) = scan_partitions(interp, g, sv.world) do interp::AbstractInterpreter, ::Core.Binding, partition::Core.BindingPartition
Expand All @@ -3743,15 +3747,16 @@ function global_assignment_binding_rt_exct(interp::AbstractInterpreter, partitio
if is_some_guard(kind)
return Pair{Any,Any}(newty, ErrorException)
elseif is_some_const_binding(kind) || is_some_imported(kind)
return Pair{Any,Any}(Bottom, ErrorException)
# N.B.: Backdating should not improve inference in an earlier world
return Pair{Any,Any}(kind == PARTITION_KIND_BACKDATED_CONST ? newty : Bottom, ErrorException)
end
ty = kind == PARTITION_KIND_DECLARED ? Any : partition_restriction(partition)
wnewty = widenconst(newty)
if !hasintersect(wnewty, ty)
return Pair{Any,Any}(Bottom, ErrorException)
return Pair{Any,Any}(Bottom, TypeError)
elseif !(wnewty <: ty)
retty = tmeet(typeinf_lattice(interp), newty, ty)
return Pair{Any,Any}(retty, ErrorException)
return Pair{Any,Any}(retty, TypeError)
end
return Pair{Any,Any}(newty, Bottom)
end
Expand Down
2 changes: 2 additions & 0 deletions Compiler/src/opaque_closure.jl
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ function Core.OpaqueClosure(ir::IRCode, @nospecialize env...;
end
src.slotflags = fill(zero(UInt8), nargtypes)
src.slottypes = copy(ir.argtypes)
src.min_world = ir.valid_worlds.min_world
src.max_world = ir.valid_worlds.max_world
src.isva = isva
src.nargs = UInt(nargtypes)
src = ir_to_codeinf!(src, ir)
Expand Down
19 changes: 15 additions & 4 deletions Compiler/src/tfuncs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -586,15 +586,19 @@ add_tfunc(nfields, 1, 1, nfields_tfunc, 1)
add_tfunc(Core._expr, 1, INT_INF, @nospecs((𝕃::AbstractLattice, args...)->Expr), 100)
add_tfunc(svec, 0, INT_INF, @nospecs((𝕃::AbstractLattice, args...)->SimpleVector), 20)

@nospecs function _svec_len_tfunc(𝕃::AbstractLattice, s)
@nospecs function _svec_len_tfunc(::AbstractLattice, s)
if isa(s, Const) && isa(s.val, SimpleVector)
return Const(length(s.val))
end
return Int
end
add_tfunc(Core._svec_len, 1, 1, _svec_len_tfunc, 1)
@nospecs function _svec_len_nothrow(𝕃::AbstractLattice, s)
⊑ = partialorder(𝕃)
return s ⊑ SimpleVector
end

@nospecs function _svec_ref_tfunc(𝕃::AbstractLattice, s, i)
@nospecs function _svec_ref_tfunc(::AbstractLattice, s, i)
if isa(s, Const) && isa(i, Const)
s, i = s.val, i.val
if isa(s, SimpleVector) && isa(i, Int)
Expand All @@ -604,7 +608,7 @@ add_tfunc(Core._svec_len, 1, 1, _svec_len_tfunc, 1)
return Any
end
add_tfunc(Core._svec_ref, 2, 2, _svec_ref_tfunc, 1)
@nospecs function typevar_tfunc(𝕃::AbstractLattice, n, lb_arg, ub_arg)
@nospecs function typevar_tfunc(::AbstractLattice, n, lb_arg, ub_arg)
lb = Union{}
ub = Any
ub_certain = lb_certain = true
Expand Down Expand Up @@ -2363,7 +2367,7 @@ function _builtin_nothrow(𝕃::AbstractLattice, @nospecialize(f::Builtin), argt
return compilerbarrier_nothrow(argtypes[1], nothing)
elseif f === Core._svec_len
na == 1 || return false
return _svec_len_tfunc(𝕃, argtypes[1]) isa Const
return _svec_len_nothrow(𝕃, argtypes[1])
elseif f === Core._svec_ref
na == 2 || return false
return _svec_ref_tfunc(𝕃, argtypes[1], argtypes[2]) isa Const
Expand Down Expand Up @@ -2974,6 +2978,13 @@ function intrinsic_exct(𝕃::AbstractLattice, f::IntrinsicFunction, argtypes::V
return Union{}
end

if f === Intrinsics.add_ptr || f === Intrinsics.sub_ptr
if !(argtypes[1] ⊑ Ptr && argtypes[2] ⊑ UInt)
return TypeError
end
return Union{}
end

# The remaining intrinsics are math/bits/comparison intrinsics.
# All the non-floating point intrinsics work on primitive values of the same type.
isshift = f === shl_int || f === lshr_int || f === ashr_int
Expand Down
7 changes: 7 additions & 0 deletions Compiler/test/effects.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1438,6 +1438,11 @@ let effects = Base.infer_effects(Core.Intrinsics.pointerset, Tuple{Vararg{Any}})
@test Compiler.is_consistent(effects)
@test !Compiler.is_effect_free(effects)
end
@test Compiler.intrinsic_nothrow(Core.Intrinsics.add_ptr, Any[Ptr{Int}, UInt])
@test Compiler.intrinsic_nothrow(Core.Intrinsics.sub_ptr, Any[Ptr{Int}, UInt])
@test !Compiler.intrinsic_nothrow(Core.Intrinsics.add_ptr, Any[UInt, UInt])
@test !Compiler.intrinsic_nothrow(Core.Intrinsics.sub_ptr, Any[UInt, UInt])
@test Compiler.is_nothrow(Base.infer_effects(+, Tuple{Ptr{UInt8}, UInt}))
# effects modeling for atomic intrinsics
# these functions especially need to be marked !effect_free since they imply synchronization
for atomicfunc = Any[
Expand Down Expand Up @@ -1471,3 +1476,5 @@ let effects = Base.infer_effects((Core.SimpleVector,Int); optimize=false) do sve
@test !Compiler.is_nothrow(effects)
@test Compiler.is_terminates(effects)
end

@test Compiler.is_nothrow(Base.infer_effects(length, (Core.SimpleVector,)))
2 changes: 1 addition & 1 deletion Compiler/test/inference.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6235,7 +6235,7 @@ g57292(xs::String...) = getfield(("abc",), 1, :not_atomic, xs...)
global invalid_setglobal!_exct_modeling::Int
@test Base.infer_exception_type((Float64,)) do x
setglobal!(@__MODULE__, :invalid_setglobal!_exct_modeling, x)
end == ErrorException
end == TypeError

# Issue #58257 - Hang in inference during BindingPartition resolution
module A58257
Expand Down
3 changes: 2 additions & 1 deletion Compiler/test/special_loading.jl
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# This file is a part of Julia. License is MIT: https://julialang.org/license

mktempdir() do dir
include(joinpath(Sys.BINDIR, Base.DATAROOTDIR, "julia", "test", "tempdepot.jl"))
mkdepottempdir() do dir
withenv("JULIA_DEPOT_PATH" => dir * (Sys.iswindows() ? ";" : ":"), "JULIA_LOAD_PATH" => nothing) do
cd(joinpath(@__DIR__, "CompilerLoadingTest")) do
@test success(pipeline(`$(Base.julia_cmd()[1]) --startup-file=no --project=. compiler_loading_test.jl`; stdout, stderr))
Expand Down
9 changes: 9 additions & 0 deletions Compiler/test/validation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@ using Test, Core.IR

include("setup_Compiler.jl")

@testset "stdio validation" begin
for s in (:stdout, :stderr, :print, :println, :write)
@test getglobal(Compiler, s) === getglobal(Core, s)
@test isconst(Compiler, s)
end
@test Compiler.stdin === devnull
@test isconst(Compiler, :stdin)
end

function f22938(a, b, x...)
nothing
nothing
Expand Down
8 changes: 1 addition & 7 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,7 @@ julia-src-release julia-src-debug : julia-src-% : julia-deps julia_flisp.boot.in
julia-cli-release julia-cli-debug: julia-cli-% : julia-deps
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT)/cli $*

julia-sysimg-ji : $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) julia-src-$(JULIA_BUILD_MODE) | $(build_private_libdir)
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-ji JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)'

julia-sysimg-bc : $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-$(JULIA_BUILD_MODE) julia-src-$(JULIA_BUILD_MODE) | $(build_private_libdir)
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-bc JULIA_EXECUTABLE='$(JULIA_EXECUTABLE)'

julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-sysimg-ji julia-src-%
julia-sysimg-release julia-sysimg-debug : julia-sysimg-% : julia-src-% $(TOP_LEVEL_PKG_LINK_TARGETS) julia-stdlib julia-base julia-cli-% julia-src-% | $(build_private_libdir)
@$(MAKE) $(QUIET_MAKE) -C $(BUILDROOT) -f sysimage.mk sysimg-$*

julia-debug julia-release : julia-% : julia-sysimg-% julia-src-% julia-symlink julia-libccalltest \
Expand Down
6 changes: 3 additions & 3 deletions base/array.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1053,14 +1053,14 @@ end
# Specifically we are wasting ~10% of memory for small arrays
# by not picking memory sizes that max out a GC pool
function overallocation(maxsize)
maxsize < 8 && return 8;
# compute maxsize = maxsize + 4*maxsize^(7/8) + maxsize/8
# compute maxsize = maxsize + 3*maxsize^(7/8) + maxsize/8
# for small n, we grow faster than O(n)
# for large n, we grow at O(n/8)
# and as we reach O(memory) for memory>>1MB,
# this means we end by adding about 10% of memory each time
# most commonly, this will take steps of 0-3-9-34 or 1-4-16-66 or 2-8-33
exp2 = sizeof(maxsize) * 8 - Core.Intrinsics.ctlz_int(maxsize)
maxsize += (1 << div(exp2 * 7, 8)) * 4 + div(maxsize, 8)
maxsize += (1 << div(exp2 * 7, 8)) * 3 + div(maxsize, 8)
return maxsize
end

Expand Down
2 changes: 1 addition & 1 deletion base/binaryplatforms.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1044,7 +1044,7 @@ function platforms_match(a::AbstractPlatform, b::AbstractPlatform)

# Call the comparator, passing in which objects requested this comparison (one, the other, or both)
# For some comparators this doesn't matter, but for non-symmetrical comparisons, it does.
if !(comparator(ak, bk, a_comp === comparator, b_comp === comparator)::Bool)
if !(@invokelatest(comparator(ak, bk, a_comp === comparator, b_comp === comparator))::Bool)
return false
end
end
Expand Down
2 changes: 1 addition & 1 deletion base/boot.jl
Original file line number Diff line number Diff line change
Expand Up @@ -410,7 +410,7 @@ struct TypeError <: Exception
# `context` optionally adds extra detail, e.g. the name of the type parameter
# that got a bad value.
func::Symbol
context::Union{AbstractString,Symbol}
context::Union{AbstractString,GlobalRef,Symbol}
expected::Type
got
TypeError(func, context, @nospecialize(expected::Type), @nospecialize(got)) =
Expand Down
6 changes: 6 additions & 0 deletions base/div.jl
Original file line number Diff line number Diff line change
Expand Up @@ -385,3 +385,9 @@ end
# NOTE: C89 fmod() and x87 FPREM implicitly provide truncating float division,
# so it is used here as the basis of float div().
div(x::T, y::T, r::RoundingMode) where {T<:AbstractFloat} = convert(T, round((x - rem(x, y, r)) / y))

# Vincent Lefèvre: "The Euclidean Division Implemented with a Floating-Point Division and a Floor"
# https://inria.hal.science/inria-00070403
# Theorem 1 implies that the following are exact if eps(x/y) <= 1
div(x::Float32, y::Float32, r::RoundingMode) = Float32(round(Float64(x) / Float64(y), r))
div(x::Float16, y::Float16, r::RoundingMode) = Float16(round(Float32(x) / Float32(y), r))
19 changes: 11 additions & 8 deletions base/errorshow.jl
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@ function showerror(io::IO, ex::TypeError)
end
if ex.context == ""
ctx = "in $(ex.func)"
elseif isa(ex.context, Core.GlobalRef)
gr = ex.context
ctx = "in $(ex.func) of global binding `$(gr.mod).$(gr.name)`"
elseif ex.func === :var"keyword argument"
ctx = "in keyword argument $(ex.context)"
else
Expand Down Expand Up @@ -259,7 +262,7 @@ function showerror(io::IO, ex::MethodError)
is_arg_types = !isa(ex.args, Tuple)
arg_types = is_arg_types ? ex.args : typesof(ex.args...)
arg_types_param::SimpleVector = (unwrap_unionall(arg_types)::DataType).parameters
san_arg_types_param = Any[rewrap_unionall(a, arg_types) for a in arg_types_param]
san_arg_types_param = Any[rewrap_unionall(arg_types_param[i], arg_types) for i in 1:length(arg_types_param)]
f = ex.f
meth = methods_including_ambiguous(f, arg_types)
if isa(meth, MethodList) && length(meth) > 1
Expand Down Expand Up @@ -399,10 +402,10 @@ function showerror_ambiguous(io::IO, meths, f, args::Type)
sigfix = typeintersect(m.sig, sigfix)
end
if isa(unwrap_unionall(sigfix), DataType) && sigfix <: Tuple
let sigfix=sigfix
if all(m->morespecific(sigfix, m.sig), meths)
let sigfix=Core.Box(sigfix)
if all(m->morespecific(sigfix.contents, m.sig), meths)
print(io, "\nPossible fix, define\n ")
show_tuple_as_call(io, :function, sigfix)
show_tuple_as_call(io, :function, sigfix.contents)
else
print(io, "To resolve the ambiguity, try making one of the methods more specific, or ")
print(io, "adding a new method more specific than any of the existing applicable methods.")
Expand Down Expand Up @@ -487,10 +490,10 @@ function show_method_candidates(io::IO, ex::MethodError, kwargs=[])
# If isvarargtype then it checks whether the rest of the input arguments matches
# the varargtype
if Base.isvarargtype(sig[i])
sigstr = (unwrapva(unwrap_unionall(sig[i])), "...")
sigstr = Core.svec(unwrapva(unwrap_unionall(sig[i])), "...")
j = length(t_i)
else
sigstr = (sig[i],)
sigstr = Core.svec(sig[i],)
j = i
end
# Checks if the type of arg 1:i of the input intersects with the current method
Expand Down Expand Up @@ -536,9 +539,9 @@ function show_method_candidates(io::IO, ex::MethodError, kwargs=[])
for (k, sigtype) in enumerate(sig[length(t_i)+1:end])
sigtype = isvarargtype(sigtype) ? unwrap_unionall(sigtype) : sigtype
if Base.isvarargtype(sigtype)
sigstr = (unwrapva(sigtype::Core.TypeofVararg), "...")
sigstr = Core.svec(unwrapva(sigtype::Core.TypeofVararg), "...")
else
sigstr = (sigtype,)
sigstr = Core.svec(sigtype,)
end
if !((min(length(t_i), length(sig)) == 0) && k==1)
print(iob, ", ")
Expand Down
4 changes: 4 additions & 0 deletions base/essentials.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1009,6 +1009,10 @@ struct Colon <: Function
end
const (:) = Colon()

function show(io::IO, ::Colon)
show_type_name(io, Colon.name)
print(io, "()")
end

"""
Val(c)
Expand Down
1 change: 1 addition & 0 deletions base/experimental.jl
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ the handler for that type.
This interface is experimental and subject to change or removal without notice.
"""
function show_error_hints(io, ex, args...)
@nospecialize
hinters = get(_hint_handlers, typeof(ex), nothing)
isnothing(hinters) && return
for handler in hinters
Expand Down
2 changes: 1 addition & 1 deletion base/fastmath.jl
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ exp10_fast(x::Union{Float32,Float64}) = Base.Math.exp10_fast(x)

# builtins

function pow_fast(x::Float64, y::Integer)
@inline function pow_fast(x::Float64, y::Integer)
z = y % Int32
z == y ? pow_fast(x, z) : x^y
end
Expand Down
Loading