Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ababc4e
make sure `jl_exit_threaded_region` executed when `threading_run` fin…
songjhaha Jan 29, 2026
55ba798
Artifacts stdlib: Add `TOML` and `Pkg` as test dependencies (#60891)
DilumAluthge Feb 1, 2026
6ac47ce
Artifacts stdlib: Fix some tests if we aren't running with `--depwarn…
DilumAluthge Feb 8, 2026
5eb31d6
codegen: Mark resolved `const` `GlobalRef` as method root (#60945)
topolarity Feb 10, 2026
ebd12a7
Make.inc: fix xcrun invocation (#61040)
fingolfin Feb 15, 2026
18e4c9e
Fix `Base.show(io::IO, b::Binding)` for e.g. `:(:)` or `:(==)` (#61043)
fingolfin Feb 17, 2026
88cce13
fix typo in GC thrashing detection condition (#61112)
adienes Feb 21, 2026
1553718
codegen: Replace saveIP with InsertPointGuard (#61107)
vtjnash Feb 21, 2026
93a32fa
module: add missing GC write barriers for bpart->restriction stores (…
adienes Feb 22, 2026
b83e52d
[release-1.12] Bump JuliaSyntax version
mlechu Feb 18, 2026
eef6c25
trimming: fix-up support for `Core._apply_iterate`
topolarity Nov 6, 2025
8ea221a
Fix one rng-related type-instability in `@testset` (#59321)
gdalle Aug 19, 2025
f4086bd
Bump Documenter to 1.17.0 (for Julia 1.12) (#61118)
fingolfin Feb 26, 2026
87dd1d9
nospecialize `fieldtypes` and `InteractiveUtils._subtypes_in!` (#61156)
timholy Feb 25, 2026
429fa6e
bump Pkg to latest 1.12
KristofferC Mar 3, 2026
951119f
Compiler: abstract calls: type assert to help stability (#57582)
nsajko Mar 12, 2025
9c9b411
Serialization: Fix typo: `method` ---> `meth` (#61108)
DilumAluthge Feb 21, 2026
baa0bbf
Unicode: Qualify `Base.ismalformed` when calling it (#61140)
DilumAluthge Feb 26, 2026
eb56faa
Add API to disable full collections (#61087)
gbaraldi Feb 26, 2026
d3ab7e1
REPL: Fix the `doc_completions(::Symbol)` method, and add another met…
DilumAluthge Feb 28, 2026
4c74b14
Unicode: Add some tests for `combining_class` (#61172)
DilumAluthge Mar 1, 2026
4f7764a
Base: Replace many 1-arg `@assert`s with 2-arg (#61230)
topolarity Mar 4, 2026
b414ad8
Serialization stdlib: Replace a call to `Core.memoryref` with `Core.m…
DilumAluthge Mar 3, 2026
59a463c
prefer returning the loaded version from `pkgversion` (#61136)
KristofferC Mar 5, 2026
d2789ab
Set sret alignment to julia_alignment (#61192)
maleadt Mar 3, 2026
2ca5835
Restore check to avoid duplicate method tables serialization (#61221)
maleadt Mar 6, 2026
85f5247
Handle non-standard Method.source in jl_ir_flag_has_image_globalref (…
maleadt Mar 4, 2026
b9fc269
build: defer libwhich lookup in symlink_system_library (#61243)
fingolfin Mar 6, 2026
c8beb9c
Make `FileWatching.Pidfile` public (#61208)
fingolfin Mar 7, 2026
9f5c3a7
inference: Cache tombstoned const-prop results to prevent non-termina…
aviatesk Mar 15, 2026
9456d08
precompilation: make the handling of project vs workspace more simila…
KristofferC Mar 13, 2026
c907db7
bump slop for twiceprecision division (#59140)
oscardssmith Jul 30, 2025
28abefd
Show `@info` with precompilation reasons when triggered from loading …
IanButterworth Mar 20, 2026
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
19 changes: 16 additions & 3 deletions Compiler/src/abstractinterpretation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1307,7 +1307,6 @@ end
function const_prop_call(interp::AbstractInterpreter,
mi::MethodInstance, result::MethodCallResult, arginfo::ArgInfo, sv::AbsIntState,
concrete_eval_result::Union{Nothing,ConstCallResult}=nothing)
inf_cache = get_inference_cache(interp)
𝕃ᵢ = typeinf_lattice(interp)
forwarded_argtypes = compute_forwarded_argtypes(interp, arginfo, sv)
# use `cache_argtypes` that has been constructed for fresh regular inference if available
Expand All @@ -1318,8 +1317,13 @@ function const_prop_call(interp::AbstractInterpreter,
cache_argtypes = matching_cache_argtypes(𝕃ᵢ, mi)
end
argtypes = matching_cache_argtypes(𝕃ᵢ, mi, forwarded_argtypes, cache_argtypes)
inf_result = cache_lookup(𝕃ᵢ, mi, argtypes, inf_cache)
if inf_result !== nothing
inf_result = cache_lookup(𝕃ᵢ, mi, argtypes, get_inference_cache(interp))
if inf_result === missing
# a previous const-prop attempt hit a cycle and produced a limited result;
# don't re-attempt the same work that would lead to the same limited outcome
add_remark!(interp, sv, "[constprop] Found cached but limited constant inference result")
return nothing
elseif inf_result isa InferenceResult
# found the cache for this constant prop'
if inf_result.result === nothing
add_remark!(interp, sv, "[constprop] Found cached constant inference in a cycle")
Expand Down Expand Up @@ -1356,6 +1360,13 @@ function const_prop_call(interp::AbstractInterpreter,
pop!(callstack)
return nothing
end
if inf_result.tombstone
# This const-prop attempt resolved but hit a cycle and produced a limited result.
# The tombstoned entry is already cached by `promotecache!` via the normal local
# cache mechanism, so `constprop_cache_lookup` will find it on subsequent lookups.
add_remark!(interp, sv, "[constprop] Constant inference produced a limited result")
return nothing
end
existing_edge = result.edge
inf_result.ci_as_edge = codeinst_as_edge(interp, frame, existing_edge)
@assert frame.frameid != 0 && frame.cycleid == frame.frameid
Expand Down Expand Up @@ -2642,6 +2653,8 @@ function abstract_call_known(interp::AbstractInterpreter, @nospecialize(f),
arginfo::ArgInfo, si::StmtInfo, sv::AbsIntState,
max_methods::Int = get_max_methods(interp, f, sv))
(; fargs, argtypes) = arginfo
argtypes::Vector{Any} = arginfo.argtypes # declare type because the closure below captures `argtypes`
fargs = arginfo.fargs
la = length(argtypes)
𝕃ᵢ = typeinf_lattice(interp)
if isa(f, Builtin)
Expand Down
11 changes: 9 additions & 2 deletions Compiler/src/inferenceresult.jl
Original file line number Diff line number Diff line change
Expand Up @@ -182,8 +182,8 @@ function cache_lookup(𝕃::AbstractLattice, mi::MethodInstance, given_argtypes:
cache::Vector{InferenceResult})
method = mi.def::Method
nargtypes = length(given_argtypes)
found_tombstone = false
for cached_result in cache
cached_result.tombstone && continue # ignore deleted entries (due to LimitedAccuracy)
cached_result.linfo === mi || continue
cache_argtypes = cached_result.argtypes
@assert length(cache_argtypes) == nargtypes "invalid `cache_argtypes` for `mi`"
Expand All @@ -193,8 +193,15 @@ function cache_lookup(𝕃::AbstractLattice, mi::MethodInstance, given_argtypes:
@goto next_cache
end
end
# Don't return tombstoned entries as cache items: they represent rejected work
# (due to LimitedAccuracy). Instead, record that a tombstone was found so the
# caller can avoid re-attempting the same const-prop that would hit the same limit.
if cached_result.tombstone
found_tombstone = true
@goto next_cache
end
return cached_result
@label next_cache
end
return nothing
return found_tombstone ? missing : nothing
end
10 changes: 6 additions & 4 deletions Compiler/src/typeinfer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -502,12 +502,14 @@ function finishinfer!(me::InferenceState, interp::AbstractInterpreter, cycleid::
# A parent may be cached still, but not this intermediate work:
# we can throw everything else away now. Caching anything can confuse later
# heuristics to consider it worth trying to pursue compiling this further and
# finding infinite work as a result. Avoiding caching helps to ensure there is only
# a finite amount of work that can be discovered later (although potentially still a
# large multiplier on it).
# finding infinite work as a result. Avoiding global caching helps to ensure there
# is only a finite amount of work that can be discovered later (although potentially
# still a large multiplier on it). We still allow local caching so that tombstoned
# entries can be found by `constprop_cache_lookup` to prevent re-attempting the same
# const-prop work that would hit the same limit.
result.src = nothing
result.tombstone = true
me.cache_mode = CACHE_MODE_NULL
me.cache_mode &= ~CACHE_MODE_GLOBAL
set_inlineable!(me.src, false)
else
# annotate fulltree with type information,
Expand Down
3 changes: 2 additions & 1 deletion Compiler/src/verifytrim.jl
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,6 @@ function verify_codeinstance!(interp::NativeInterpreter, codeinst::CodeInstance,
end
# TODO: check for calls to Base.atexit?
elseif isexpr(stmt, :call)
error = "unresolved call"
farg = stmt.args[1]
ftyp = widenconst(argextype(farg, codeinfo, sptypes))
if ftyp <: IntrinsicFunction
Expand Down Expand Up @@ -250,6 +249,8 @@ function verify_codeinstance!(interp::NativeInterpreter, codeinst::CodeInstance,
elseif Core.memoryrefmodify! isa ftyp
error = "trim verification not yet implemented for builtin `Core.memoryrefmodify!`"
else @assert false "unexpected builtin" end
else
error = "unresolved call"
end
extyp = argextype(SSAValue(i), codeinfo, sptypes)
if extyp === Union{}
Expand Down
12 changes: 12 additions & 0 deletions Compiler/test/codegen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1064,3 +1064,15 @@ let io = IOBuffer()
str = String(take!(io))
@test occursin("julia.write_barrier", str)
end

# sret parameters must have an alignment attribute (required by LLVM LangRef).
@testset "sret alignment attribute" begin
struct SretAlignTest
a::Float32
b::Float32
c::Float32
end
@noinline f_srettest(x::Float32) = SretAlignTest(x, x+1, x+2)
ir = get_llvm(f_srettest, Tuple{Float32}, true, true, true)
@test occursin(r"sret\([^)]+\) align \d+", ir)
end
2 changes: 1 addition & 1 deletion Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1650,7 +1650,7 @@ endif
CLANGSA_FLAGS :=
CLANGSA_CXXFLAGS :=
ifeq ($(OS), Darwin) # on new XCode, the files are hidden
CLANGSA_FLAGS += -isysroot $(shell xcrun --show-sdk-path -sdk macosx)
CLANGSA_FLAGS += -isysroot $(shell xcrun --show-sdk-path --sdk macosx)
endif
ifeq ($(USEGCC),1)
# try to help clang find the c++ files for CC by guessing the value for --prefix
Expand Down
5 changes: 2 additions & 3 deletions base/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -161,11 +161,10 @@ endif

define symlink_system_library
libname_$2 := $$(notdir $(call versioned_libname,$2,$3))
libpath_$2 := $$(shell $$(call spawn,$$(LIBWHICH)) -p $$(libname_$2) 2>/dev/null)
symlink_$2: $$(build_private_libdir)/$$(libname_$2)
$$(build_private_libdir)/$$(libname_$2):
@if [ -e "$$(libpath_$2)" ]; then \
REALPATH=$$(libpath_$2); \
@REALPATH=`$$(call spawn,$$(LIBWHICH)) -p $$(libname_$2) 2>/dev/null`; \
if [ -e "$$$$REALPATH" ]; then \
$$(call resolve_path,REALPATH) && \
[ -e "$$$$REALPATH" ] && \
rm -f "$$@" && \
Expand Down
2 changes: 1 addition & 1 deletion base/abstractarray.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3472,7 +3472,7 @@ julia> map!(+, zeros(Int, 5), 100:999, 1:3)
```
"""
function map!(f::F, dest::AbstractArray, As::AbstractArray...) where {F}
@assert !isempty(As) # should dispatch to map!(f, A)
@assert !isempty(As) "should dispatch to map!(f, A)"
map_n!(f, dest, As)
end

Expand Down
2 changes: 1 addition & 1 deletion base/array.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2270,7 +2270,7 @@ function vcat(arrays::Vector{T}...) where T
nd = 1
for a in arrays
na = length(a)
@assert nd + na <= 1 + length(arr) # Concurrent modification of arrays?
@assert nd + na <= 1 + length(arr) "Concurrent modification of arrays?"
unsafe_copyto!(arr, nd, a, 1, na)
nd += na
end
Expand Down
4 changes: 2 additions & 2 deletions base/arrayshow.jl
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ function _print_matrix(io, @nospecialize(X::AbstractVecOrMat), pre, sep, post, h
screenwidth -= length(pre)::Int + length(post)::Int
presp = repeat(" ", length(pre)::Int) # indent each row to match pre string
postsp = ""
@assert textwidth(hdots) == textwidth(ddots)
@assert textwidth(hdots) == textwidth(ddots) "hdots and ddots must have same textwidth"
sepsize = length(sep)::Int
m, n = length(rowsA), length(colsA)
# To figure out alignments, only need to look at as many rows as could
Expand Down Expand Up @@ -414,7 +414,7 @@ _show_nonempty(io::IO, X::AbstractMatrix, prefix::String) =
_show_nonempty(io, inferencebarrier(X), prefix, false, axes(X))

function _show_nonempty(io::IO, @nospecialize(X::AbstractMatrix), prefix::String, drop_brackets::Bool, axs::Tuple{AbstractUnitRange,AbstractUnitRange})
@assert !isempty(X)
@assert !isempty(X) "X should be non-empty"
limit = get(io, :limit, false)::Bool
indr, indc = axs
nr, nc = length(indr), length(indc)
Expand Down
4 changes: 2 additions & 2 deletions base/asyncevent.jl
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,13 @@ mutable struct Timer
associate_julia_struct(this.handle, this)
iolock_begin()
err = ccall(:uv_timer_init, Cint, (Ptr{Cvoid}, Ptr{Cvoid}), loop, this)
@assert err == 0
@assert err == 0 "failed to initialize timer"
finalizer(uvfinalize, this)
ccall(:uv_update_time, Cvoid, (Ptr{Cvoid},), loop)
err = ccall(:uv_timer_start, Cint, (Ptr{Cvoid}, Ptr{Cvoid}, UInt64, UInt64),
this, @cfunction(uv_timercb, Cvoid, (Ptr{Cvoid},)),
timeoutms, intervalms)
@assert err == 0
@assert err == 0 "failed to start timer"
iolock_end()
return this
end
Expand Down
2 changes: 1 addition & 1 deletion base/bitarray.jl
Original file line number Diff line number Diff line change
Expand Up @@ -330,7 +330,7 @@ function copy_to_bitarray_chunks!(Bc::Vector{UInt64}, pos_d::Int, C::Array{Bool}
bind += 1
end
@inbounds if bind kd1
@assert bind == kd1
@assert bind == kd1 "bind != kd1"
c = UInt64(0)
for j = 0:ld1
c |= (UInt64(C[ind]) << j)
Expand Down
4 changes: 2 additions & 2 deletions base/channels.jl
Original file line number Diff line number Diff line change
Expand Up @@ -344,8 +344,8 @@ of type `Channel{Any}(0)`.
Returns a tuple, `(Array{Channel}, Array{Task})`, of the created channels and tasks.
"""
function channeled_tasks(n::Int, funcs...; ctypes=fill(Any,n), csizes=fill(0,n))
@assert length(csizes) == n
@assert length(ctypes) == n
@assert length(csizes) == n "length(csizes) != n"
@assert length(ctypes) == n "length(ctypes) != n"

chnls = map(i -> Channel{ctypes[i]}(csizes[i]), 1:n)
tasks = Task[ Task(() -> f(chnls...)) for f in funcs ]
Expand Down
2 changes: 1 addition & 1 deletion base/combinatorics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ end
# Basic functions for working with permutations

@inline function _foldoneto(op, acc, ::Val{N}) where N
@assert N::Integer > 0
@assert N::Integer > 0 "N must be positive"
if @generated
quote
acc_0 = acc
Expand Down
9 changes: 8 additions & 1 deletion base/docs/bindings.jl
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,14 @@ function Base.show(io::IO, b::Binding)
if b.mod === Base.active_module()
print(io, b.var)
else
print(io, b.mod, '.', Base.isoperator(b.var) ? ":" : "", b.var)
print(io, b.mod, '.')
if Base.isoperator(b.var)
# ensures symbols are quoted right, so e.g. :(==), :(:), :+ or :-
show(io, b.var)
else
# print ordinary identifiers without any quoting
print(io, b.var)
end
end
end

Expand Down
4 changes: 2 additions & 2 deletions base/file.jl
Original file line number Diff line number Diff line change
Expand Up @@ -769,7 +769,7 @@ function _win_mkstemp(temppath::AbstractString)
tempp, temppfx, UInt32(0), tname)
windowserror("GetTempFileName", uunique == 0)
lentname = something(findfirst(iszero, tname))
@assert lentname > 0
@assert lentname > 0 "unexpected index"
resize!(tname, lentname - 1)
return transcode(String, tname)
end
Expand Down Expand Up @@ -1401,7 +1401,7 @@ function readlink(path::AbstractString)
if ret < 0
uv_fs_req_cleanup(req)
uv_error("readlink($(repr(path)))", ret)
@assert false
@assert false "unexpected uv readlink error"
end
tgt = unsafe_string(ccall(:jl_uv_fs_t_ptr, Cstring, (Ptr{Cvoid},), req))
uv_fs_req_cleanup(req)
Expand Down
2 changes: 1 addition & 1 deletion base/filesystem.jl
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ function read(f::File, ::Type{UInt8})
ret = ccall(:jl_fs_read, Int32, (OS_HANDLE, Ptr{Cvoid}, Csize_t),
f.handle, p, 1)
uv_error("read", ret)
@assert ret <= sizeof(p) == 1
@assert ret <= sizeof(p) == 1 "unexpected read size"
ret < 1 && throw(EOFError())
return p[] % UInt8
end
Expand Down
2 changes: 1 addition & 1 deletion base/gmp.jl
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ function export!(a::AbstractVector{T}, n::BigInt; order::Integer=-1, nails::Inte
count = Ref{Csize_t}()
ccall((:__gmpz_export, libgmp), Ptr{T}, (Ptr{T}, Ref{Csize_t}, Cint, Csize_t, Cint, Csize_t, mpz_t),
a, count, order, sizeof(T), endian, nails, n)
@assert count[] length(a)
@assert count[] length(a) "count[] > length(a)"
return a, Int(count[])
end

Expand Down
2 changes: 1 addition & 1 deletion base/hamt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ or grows the HAMT by inserting a new trie instead.
end
set!(trie, bi)
else
@assert present
@assert present "!found && !present"
# collision -> grow
leaf = @inbounds trie.data[i]::Leaf{K,V}
leaf_h = HashState(h, leaf.key)
Expand Down
4 changes: 2 additions & 2 deletions base/idset.jl
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ function push!(s::IdSet, @nospecialize(x))
else
if s.max < length(s.list)
idx = s.max
@assert !isassigned(s.list, idx + 1)
@assert !isassigned(s.list, idx + 1) "bucket is already occupied"
s.list[idx + 1] = x
s.max = idx + 1
else
Expand All @@ -61,7 +61,7 @@ function push!(s::IdSet, @nospecialize(x))
idx = newidx[]
s.max = idx < 0 ? -idx : idx + 1
end
@assert s.list[s.max] === x
@assert s.list[s.max] === x "unexpected object in bucket"
setfield!(s, :idxs, ccall(:jl_idset_put_idx, Any, (Any, Any, Int), s.list, s.idxs, idx))
s.count += 1
end
Expand Down
2 changes: 1 addition & 1 deletion base/iostream.jl
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ function copyuntil(out::IOBuffer, s::IOStream, delim::UInt8; keep::Bool=false)
(eof(s) || len == out.maxsize) && break
len = min(2len + 64, out.maxsize)
ensureroom(out, len)
@assert length(out.data) >= len
@assert length(out.data) >= len "length(out.data) < len"
end
return out
end
Expand Down
14 changes: 9 additions & 5 deletions base/loading.jl
Original file line number Diff line number Diff line change
Expand Up @@ -610,13 +610,15 @@ the form `pkgversion(@__MODULE__)` can be used.
This function was introduced in Julia 1.9.
"""
function pkgversion(m::Module)
path = pkgdir(m)
path === nothing && return nothing
@lock require_lock begin
v = get_pkgversion_from_path(path)
pkgorigin = get(pkgorigins, PkgId(moduleroot(m)), nothing)
# Cache the version
if pkgorigin !== nothing && pkgorigin.version === nothing
if pkgorigin !== nothing && pkgorigin.version !== nothing
return pkgorigin.version
end
path = pkgdir(m)
path === nothing && return nothing
v = get_pkgversion_from_path(path)
if pkgorigin !== nothing
pkgorigin.version = v
end
return v
Expand Down Expand Up @@ -2652,6 +2654,8 @@ function __require_prelocked(pkg::PkgId, env)
project = active_project()
if !generating_output() && !parallel_precompile_attempted && !disable_parallel_precompile && @isdefined(Precompilation)
parallel_precompile_attempted = true
local verbosity = isinteractive() ? CoreLogging.Info : CoreLogging.Debug
@logmsg verbosity "Precompiling $(repr("text/plain", pkg))$(list_reasons(reasons))"
unlock(require_lock)
try
Precompilation.precompilepkgs([pkg]; _from_loading=true, ignore_loaded=false)
Expand Down
2 changes: 1 addition & 1 deletion base/mpfr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1251,7 +1251,7 @@ function _prettify_bigfloat(s::String)::String
else
neg = startswith(int, '-')
neg == true && (int = lstrip(int, '-'))
@assert length(int) == 1
@assert length(int) == 1 "length(int) != 1"
string(neg ? '-' : "", '0', '.', '0'^(-expo-1), int, frac == "0" ? "" : frac)
end
else
Expand Down
2 changes: 1 addition & 1 deletion base/multidimensional.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1500,7 +1500,7 @@ function copy_to_bitarray_chunks!(Bc::Vector{UInt64}, pos_d::Int, C::StridedArra
end

@inbounds if bind kd1
@assert bind == kd1
@assert bind == kd1 "bind != kd1"
c = UInt64(0)
for j = 0:ld1
c |= (UInt64(unchecked_bool_convert(C[ind])) << j)
Expand Down
2 changes: 1 addition & 1 deletion base/partr.jl
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ end

function multiq_insert(task::Task, priority::UInt16)
tpid = ccall(:jl_get_task_threadpoolid, Int8, (Any,), task)
@assert tpid > -1
@assert tpid > -1 "invalid tpid"
heap_p = multiq_size(tpid)
tp = tpid + 1

Expand Down
2 changes: 1 addition & 1 deletion base/pkgid.jl
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ end
function binunpack(s::String)
io = IOBuffer(s)
z = read(io, UInt8)
@assert z === 0x00
@assert z === 0x00 "unexpected data"
uuid = read(io, UInt128)
name = read(io, String)
return PkgId(UUID(uuid), name)
Expand Down
Loading
Loading