diff --git a/NEWS.md b/NEWS.md
index 2d752f7bed7b3..454a2e59f1153 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -34,6 +34,14 @@ Language changes
i.e. the case where the type parameters are specified. For clarity, this
definition now must be written as `Foo{T,S}(x) where {T,S<:Real} = new(x)`. ([#11310])
+ * The keywords used to define types have changed ([#19157], [#20418]).
+ + `immutable` changes to `struct`
+ + `type` changes to `mutable struct`
+ + `abstract` changes to `abstract type ... end`
+ + `bitstype 32 Char` changes to `primitive type Char 32 end`
+ In 0.6, `immutable` and `type` are still allowed as synonyms without a deprecation
+ warning.
+
* Multi-line and single-line nonstandard command literals have been added. A
nonstandard command literal is like a nonstandard string literal, but the
syntax uses backquotes (``` ` ```) instead of double quotes, and the
diff --git a/base/Enums.jl b/base/Enums.jl
index 4a4ceabf16049..48e9e63ecda60 100644
--- a/base/Enums.jl
+++ b/base/Enums.jl
@@ -7,7 +7,7 @@ export Enum, @enum
function basetype end
-abstract Enum{T<:Integer}
+abstract type Enum{T<:Integer} end
Base.convert{T<:Integer}(::Type{Integer}, x::Enum{T}) = bitcast(T, x)
Base.convert{T<:Integer,T2<:Integer}(::Type{T}, x::Enum{T2}) = convert(T, bitcast(T2, x))
@@ -45,7 +45,7 @@ julia> f(apple)
"I'm a Fruit with value: 1"
```
-`BaseType`, which defaults to `Int32`, must be a bitstype subtype of Integer. Member values can be converted between
+`BaseType`, which defaults to `Int32`, must be a primitive subtype of Integer. Member values can be converted between
the enum type and `BaseType`. `read` and `write` perform these conversions automatically.
"""
macro enum(T,syms...)
@@ -58,7 +58,7 @@ macro enum(T,syms...)
typename = T.args[1]
basetype = eval(current_module(),T.args[2])
if !isa(basetype, DataType) || !(basetype <: Integer) || !isbits(basetype)
- throw(ArgumentError("invalid base type for Enum $typename, $T=::$basetype; base type must be an integer bitstype"))
+ throw(ArgumentError("invalid base type for Enum $typename, $T=::$basetype; base type must be an integer primitive type"))
end
elseif !isa(T,Symbol)
throw(ArgumentError("invalid type expression for enum $T"))
@@ -103,7 +103,7 @@ macro enum(T,syms...)
end
blk = quote
# enum definition
- Base.@__doc__(bitstype $(sizeof(basetype) * 8) $(esc(typename)) <: Enum{$(basetype)})
+ Base.@__doc__(primitive type $(esc(typename)) <: Enum{$(basetype)} $(sizeof(basetype) * 8) end)
function Base.convert(::Type{$(esc(typename))}, x::Integer)
$(membershiptest(:x, values)) || enum_argument_error($(Expr(:quote, typename)), x)
return bitcast($(esc(typename)), convert($(basetype), x))
diff --git a/base/LineEdit.jl b/base/LineEdit.jl
index 6a76f05f333ab..97d1ae38d060f 100644
--- a/base/LineEdit.jl
+++ b/base/LineEdit.jl
@@ -9,16 +9,16 @@ import ..Terminals: raw!, width, height, cmove, getX,
import Base: ensureroom, peek, show, AnyDict
-abstract TextInterface
-abstract ModeState
+abstract type TextInterface end
+abstract type ModeState end
export run_interface, Prompt, ModalInterface, transition, reset_state, edit_insert, keymap
-immutable ModalInterface <: TextInterface
+struct ModalInterface <: TextInterface
modes
end
-type MIState
+mutable struct MIState
interface::ModalInterface
current_mode
aborted::Bool
@@ -33,7 +33,7 @@ function show(io::IO, s::MIState)
print(io, "MI State (", s.current_mode, " active)")
end
-type Prompt <: TextInterface
+mutable struct Prompt <: TextInterface
prompt
# A string or function to be printed before the prompt. May not change the length of the prompt.
# This may be used for changing the color, issuing other terminal escape codes, etc.
@@ -51,12 +51,12 @@ end
show(io::IO, x::Prompt) = show(io, string("Prompt(\"", x.prompt, "\",...)"))
-immutable InputAreaState
+struct InputAreaState
num_rows::Int64
curs_row::Int64
end
-type PromptState <: ModeState
+mutable struct PromptState <: ModeState
terminal
p::Prompt
input_buffer::IOBuffer
@@ -74,13 +74,13 @@ function input_string_newlines_aftercursor(s::PromptState)
return count(c->(c == '\n'), rest)
end
-abstract HistoryProvider
-abstract CompletionProvider
+abstract type HistoryProvider end
+abstract type CompletionProvider end
-type EmptyCompletionProvider <: CompletionProvider
+mutable struct EmptyCompletionProvider <: CompletionProvider
end
-type EmptyHistoryProvider <: HistoryProvider
+mutable struct EmptyHistoryProvider <: HistoryProvider
end
reset_state(::EmptyHistoryProvider) = nothing
@@ -712,7 +712,7 @@ end
# Redirect a key as if `seq` had been the keysequence instead in a lazy fashion.
# This is different from the default eager redirect, which only looks at the current and lower
# layers of the stack.
-immutable KeyAlias
+struct KeyAlias
seq::String
KeyAlias(seq) = new(normalize_key(seq))
end
@@ -966,7 +966,7 @@ function write_response_buffer(s::PromptState, data)
refresh_line(s)
end
-type SearchState <: ModeState
+mutable struct SearchState <: ModeState
terminal
histprompt
#rsearch (true) or ssearch (false)
@@ -1010,7 +1010,7 @@ function reset_state(s::SearchState)
reset_state(s.histprompt.hp)
end
-type HistoryPrompt{T<:HistoryProvider} <: TextInterface
+mutable struct HistoryPrompt{T<:HistoryProvider} <: TextInterface
hp::T
complete
keymap_dict::Dict{Char,Any}
@@ -1020,7 +1020,7 @@ end
HistoryPrompt(hp::T) where T<:HistoryProvider = HistoryPrompt{T}(hp)
init_state(terminal, p::HistoryPrompt) = SearchState(terminal, p, true, IOBuffer(), IOBuffer())
-type PrefixSearchState <: ModeState
+mutable struct PrefixSearchState <: ModeState
terminal
histprompt
prefix::String
@@ -1049,7 +1049,7 @@ input_string(s::PrefixSearchState) = String(s.response_buffer)
# a meta-prompt that presents itself as parent_prompt, but which has an independent keymap
# for prefix searching
-type PrefixHistoryPrompt{T<:HistoryProvider} <: TextInterface
+mutable struct PrefixHistoryPrompt{T<:HistoryProvider} <: TextInterface
hp::T
parent_prompt::Prompt
complete
diff --git a/base/REPL.jl b/base/REPL.jl
index 866a3dde4dd44..c33c341de2e62 100644
--- a/base/REPL.jl
+++ b/base/REPL.jl
@@ -32,13 +32,13 @@ import ..LineEdit:
accept_result,
terminal
-abstract AbstractREPL
+abstract type AbstractREPL end
answer_color(::AbstractREPL) = ""
const JULIA_PROMPT = "julia> "
-type REPLBackend
+mutable struct REPLBackend
"channel for AST"
repl_channel::Channel
"channel for results: (value, nothing) or (error, backtrace)"
@@ -110,7 +110,7 @@ function ip_matches_func(ip, func::Symbol)
return false
end
-immutable REPLDisplay{R<:AbstractREPL} <: Display
+struct REPLDisplay{R<:AbstractREPL} <: Display
repl::R
end
@@ -167,7 +167,7 @@ function print_response(errio::IO, val::ANY, bt, show_value::Bool, have_color::B
end
# A reference to a backend
-immutable REPLBackendRef
+struct REPLBackendRef
repl_channel::Channel
response_channel::Channel
end
@@ -183,7 +183,7 @@ end
## BasicREPL ##
-type BasicREPL <: AbstractREPL
+mutable struct BasicREPL <: AbstractREPL
terminal::TextTerminal
waserror::Bool
BasicREPL(t) = new(t,false)
@@ -241,7 +241,7 @@ end
## LineEditREPL ##
-type LineEditREPL <: AbstractREPL
+mutable struct LineEditREPL <: AbstractREPL
t::TextTerminal
hascolor::Bool
prompt_color::String
@@ -275,11 +275,11 @@ LineEditREPL(t::TextTerminal, envcolors = false) = LineEditREPL(t,
Base.text_colors[:yellow],
false, false, false, envcolors)
-type REPLCompletionProvider <: CompletionProvider; end
+mutable struct REPLCompletionProvider <: CompletionProvider; end
-type ShellCompletionProvider <: CompletionProvider; end
+mutable struct ShellCompletionProvider <: CompletionProvider; end
-immutable LatexCompletions <: CompletionProvider; end
+struct LatexCompletions <: CompletionProvider; end
beforecursor(buf::IOBuffer) = String(buf.data[1:buf.ptr-1])
@@ -306,7 +306,7 @@ function complete_line(c::LatexCompletions, s)
end
-type REPLHistoryProvider <: HistoryProvider
+mutable struct REPLHistoryProvider <: HistoryProvider
history::Array{String,1}
history_file
start_idx::Int
@@ -945,7 +945,7 @@ end
## StreamREPL ##
-type StreamREPL <: AbstractREPL
+mutable struct StreamREPL <: AbstractREPL
stream::IO
prompt_color::String
input_color::String
diff --git a/base/REPLCompletions.jl b/base/REPLCompletions.jl
index 6a5369503334d..32dceecb5c2ad 100644
--- a/base/REPLCompletions.jl
+++ b/base/REPLCompletions.jl
@@ -84,11 +84,12 @@ end
function complete_keyword(s::String)
const sorted_keywords = [
- "abstract", "baremodule", "begin", "bitstype", "break", "catch", "ccall",
+ "abstract type", "baremodule", "begin", "break", "catch", "ccall",
"const", "continue", "do", "else", "elseif", "end", "export", "false",
- "finally", "for", "function", "global", "if", "immutable", "import",
- "importall", "let", "local", "macro", "module", "quote", "return",
- "true", "try", "type", "typealias", "using", "while"]
+ "finally", "for", "function", "global", "if", "import",
+ "importall", "let", "local", "macro", "module", "mutable struct",
+ "primitive type", "quote", "return", "struct",
+ "true", "try", "typealias", "using", "while"]
r = searchsorted(sorted_keywords, s)
i = first(r)
n = length(sorted_keywords)
diff --git a/base/Terminals.jl b/base/Terminals.jl
index 14cd542616b25..071928972be28 100644
--- a/base/Terminals.jl
+++ b/base/Terminals.jl
@@ -35,7 +35,7 @@ import Base:
## TextTerminal ##
-abstract TextTerminal <: Base.AbstractPipe
+abstract type TextTerminal <: Base.AbstractPipe end
# INTERFACE
pipe_reader(::TextTerminal) = error("Unimplemented")
@@ -89,16 +89,16 @@ disable_bracketed_paste(t::TextTerminal) = nothing
## UnixTerminal ##
-abstract UnixTerminal <: TextTerminal
+abstract type UnixTerminal <: TextTerminal end
pipe_reader(t::UnixTerminal) = t.in_stream
pipe_writer(t::UnixTerminal) = t.out_stream
-type TerminalBuffer <: UnixTerminal
+mutable struct TerminalBuffer <: UnixTerminal
out_stream::Base.IO
end
-type TTYTerminal <: UnixTerminal
+mutable struct TTYTerminal <: UnixTerminal
term_type::String
in_stream::Base.TTY
out_stream::Base.TTY
diff --git a/base/abstractarray.jl b/base/abstractarray.jl
index 5ca6ef34820f1..1f1cf9ef8c30f 100644
--- a/base/abstractarray.jl
+++ b/base/abstractarray.jl
@@ -245,9 +245,9 @@ end
## Traits for array types ##
-abstract LinearIndexing
-immutable LinearFast <: LinearIndexing end
-immutable LinearSlow <: LinearIndexing end
+abstract type LinearIndexing end
+struct LinearFast <: LinearIndexing end
+struct LinearSlow <: LinearIndexing end
"""
Base.linearindexing(A)
diff --git a/base/array.jl b/base/array.jl
index 355da7c2c71a7..e8ef8c22c0f59 100644
--- a/base/array.jl
+++ b/base/array.jl
@@ -117,10 +117,10 @@ end
function reinterpret{T,S,N}(::Type{T}, a::Array{S}, dims::NTuple{N,Int})
if !isbits(T)
- throw(ArgumentError("cannot reinterpret Array{$(S)} to ::Type{Array{$(T)}}, type $(T) is not a bitstype"))
+ throw(ArgumentError("cannot reinterpret Array{$(S)} to ::Type{Array{$(T)}}, type $(T) is not a bits type"))
end
if !isbits(S)
- throw(ArgumentError("cannot reinterpret Array{$(S)} to ::Type{Array{$(T)}}, type $(S) is not a bitstype"))
+ throw(ArgumentError("cannot reinterpret Array{$(S)} to ::Type{Array{$(T)}}, type $(S) is not a bits type"))
end
nel = div(length(a)*sizeof(S),sizeof(T))
if prod(dims) != nel
diff --git a/base/associative.jl b/base/associative.jl
index 876b9607b2e3a..40ee1e2045b6d 100644
--- a/base/associative.jl
+++ b/base/associative.jl
@@ -25,10 +25,10 @@ function summary(t::Associative)
return string(typeof(t), " with ", n, (n==1 ? " entry" : " entries"))
end
-immutable KeyIterator{T<:Associative}
+struct KeyIterator{T<:Associative}
dict::T
end
-immutable ValueIterator{T<:Associative}
+struct ValueIterator{T<:Associative}
dict::T
end
@@ -290,7 +290,7 @@ and value type and thus its `eltype` is always `Pair{Any,Any}`.
See [`Dict`](@ref) for further help.
"""
-type ObjectIdDict <: Associative{Any,Any}
+mutable struct ObjectIdDict <: Associative{Any,Any}
ht::Vector{Any}
ndel::Int
ObjectIdDict() = new(Vector{Any}(32), 0)
diff --git a/base/asyncmap.jl b/base/asyncmap.jl
index 617927866d97d..f8a789a653fae 100644
--- a/base/asyncmap.jl
+++ b/base/asyncmap.jl
@@ -267,7 +267,7 @@ function asyncmap(f, s::AbstractSparseArray...; kwargs...)
return sparse(asyncmap(f, sa...; kwargs...))
end
-type AsyncCollector
+mutable struct AsyncCollector
f
results
enumerator::Enumerate
@@ -302,7 +302,7 @@ function AsyncCollector(f, results, c...; ntasks=0, batch_size=nothing)
AsyncCollector(f, results, enumerate(zip(c...)), ntasks, batch_size)
end
-type AsyncCollectorState
+mutable struct AsyncCollectorState
chnl::Channel
worker_tasks::Array{Task,1}
enum_state # enumerator state
@@ -367,7 +367,7 @@ be a function which operates on an array of argument tuples.
`collect(AsyncGenerator(f, c...; ntasks=1))` is equivalent to
`map(f, c...)`.
"""
-type AsyncGenerator
+mutable struct AsyncGenerator
collector::AsyncCollector
end
@@ -375,7 +375,7 @@ function AsyncGenerator(f, c...; ntasks=0)
AsyncGenerator(AsyncCollector(f, Dict{Int,Any}(), c...; ntasks=ntasks))
end
-type AsyncGeneratorState
+mutable struct AsyncGeneratorState
i::Int
collector_state::AsyncCollectorState
end
diff --git a/base/atomics.jl b/base/atomics.jl
index 7df2e062dd0d0..b43ccd4f71047 100644
--- a/base/atomics.jl
+++ b/base/atomics.jl
@@ -39,7 +39,7 @@ Holds a reference to an object of type `T`, ensuring that it is only
accessed atomically, i.e. in a thread-safe manner.
Only certain "simple" types can be used atomically, namely the
-bitstypes integer and float-point types. These are `Int8`...`Int128`,
+primitive integer and float-point types. These are `Int8`...`Int128`,
`UInt8`...`UInt128`, and `Float16`...`Float64`.
New atomic objects can be created from a non-atomic values; if none is
@@ -61,7 +61,7 @@ julia> x[]
Atomic operations use an `atomic_` prefix, such as `atomic_add!`,
`atomic_xchg!`, etc.
"""
-type Atomic{T<:AtomicTypes}
+mutable struct Atomic{T<:AtomicTypes}
value::T
Atomic{T}() where T<:AtomicTypes = new(zero(T))
Atomic{T}(value) where T<:AtomicTypes = new(value)
diff --git a/base/base.jl b/base/base.jl
index af40b4b079e9a..652b9106a18c1 100644
--- a/base/base.jl
+++ b/base/base.jl
@@ -5,7 +5,7 @@
A system call failed with an error code (in the `errno` global variable).
"""
-type SystemError <: Exception
+mutable struct SystemError <: Exception
prefix::AbstractString
errnum::Int32
extrainfo
@@ -20,7 +20,7 @@ end
The expression passed to the `parse` function could not be interpreted as a valid Julia
expression.
"""
-type ParseError <: Exception
+mutable struct ParseError <: Exception
msg::AbstractString
end
@@ -30,21 +30,17 @@ end
The parameters to a function call do not match a valid signature. Argument `msg` is a
descriptive error string.
"""
-type ArgumentError <: Exception
+mutable struct ArgumentError <: Exception
msg::AbstractString
end
-#type UnboundError <: Exception
-# var::Symbol
-#end
-
"""
KeyError(key)
An indexing operation into an `Associative` (`Dict`) or `Set` like object tried to access or
delete a non-existent element.
"""
-type KeyError <: Exception
+mutable struct KeyError <: Exception
key
end
@@ -54,7 +50,7 @@ end
A method with the required type signature does not exist in the given generic function.
Alternatively, there is no unique most-specific method.
"""
-type MethodError <: Exception
+mutable struct MethodError <: Exception
f
args
world::UInt
@@ -67,7 +63,7 @@ MethodError(f::ANY, args::ANY) = MethodError(f, args, typemax(UInt))
No more data was available to read from a file or stream.
"""
-type EOFError <: Exception end
+mutable struct EOFError <: Exception end
"""
DimensionMismatch([msg])
@@ -75,7 +71,7 @@ type EOFError <: Exception end
The objects called do not have matching dimensionality. Optional argument `msg` is a
descriptive error string.
"""
-type DimensionMismatch <: Exception
+mutable struct DimensionMismatch <: Exception
msg::AbstractString
end
DimensionMismatch() = DimensionMismatch("")
@@ -86,7 +82,7 @@ DimensionMismatch() = DimensionMismatch("")
The asserted condition did not evaluate to `true`.
Optional argument `msg` is a descriptive error string.
"""
-type AssertionError <: Exception
+mutable struct AssertionError <: Exception
msg::AbstractString
AssertionError() = new("")
AssertionError(msg) = new(msg)
@@ -94,7 +90,7 @@ end
#Generic wrapping of arbitrary exceptions
#Subtypes should put the exception in an 'error' field
-abstract WrappedException <: Exception
+abstract type WrappedException <: Exception end
"""
LoadError(file::AbstractString, line::Int, error)
@@ -102,7 +98,7 @@ abstract WrappedException <: Exception
An error occurred while `include`ing, `require`ing, or `using` a file. The error specifics
should be available in the `.error` field.
"""
-type LoadError <: WrappedException
+mutable struct LoadError <: WrappedException
file::AbstractString
line::Int
error
@@ -114,7 +110,7 @@ end
An error occurred when running a module's `__init__` function. The actual error thrown is
available in the `.error` field.
"""
-type InitError <: WrappedException
+mutable struct InitError <: WrappedException
mod::Symbol
error
end
@@ -148,7 +144,7 @@ finalize(o::ANY) = ccall(:jl_finalize_th, Void, (Ptr{Void}, Any,),
gc(full::Bool=true) = ccall(:jl_gc_collect, Void, (Int32,), full)
gc_enable(on::Bool) = ccall(:jl_gc_enable, Int32, (Int32,), on) != 0
-immutable Nullable{T}
+struct Nullable{T}
hasvalue::Bool
value::T
diff --git a/base/base64.jl b/base/base64.jl
index 2c42ef29cbe3d..9290a8bfb20f1 100644
--- a/base/base64.jl
+++ b/base/base64.jl
@@ -22,7 +22,7 @@ base64-encoded ASCII bytes written to `ostream`.
Calling [`close`](@ref) on the `Base64EncodePipe` stream
is necessary to complete the encoding (but does not close `ostream`).
"""
-type Base64EncodePipe <: IO
+mutable struct Base64EncodePipe <: IO
io::IO
# writing works in groups of 3, so we need to cache last two bytes written
b0::UInt8
@@ -188,7 +188,7 @@ base64encode(x...) = base64encode(write, x...)
Returns a new read-only I/O stream, which decodes base64-encoded data read from `istream`.
"""
-type Base64DecodePipe <: IO
+mutable struct Base64DecodePipe <: IO
io::IO
# reading works in blocks of 4 characters that are decoded into 3 bytes and 2 of them cached
cache::Vector{UInt8}
diff --git a/base/bitarray.jl b/base/bitarray.jl
index 1356b702fd9af..5e9bf5962eb85 100644
--- a/base/bitarray.jl
+++ b/base/bitarray.jl
@@ -4,7 +4,7 @@
# notes: bits are stored in contiguous chunks
# unused bits must always be set to 0
-type BitArray{N} <: DenseArray{Bool, N}
+mutable struct BitArray{N} <: DenseArray{Bool, N}
chunks::Vector{UInt64}
len::Int
dims::NTuple{N,Int}
diff --git a/base/boot.jl b/base/boot.jl
index b052017593fd7..dbbdb112fcbac 100644
--- a/base/boot.jl
+++ b/base/boot.jl
@@ -2,21 +2,20 @@
# commented-out definitions are implemented in C
-#abstract Any <: Any
-#abstract Type{T}
+#abstract type Any <: Any end
+#abstract type Type{T} end
-#abstract Vararg{T}
-#Tuple = (Any...)
+#abstract type Vararg{T} end
-#type Symbol
+#mutable struct Symbol
# #opaque
#end
-#type TypeName
+#mutable struct TypeName
# name::Symbol
#end
-#type DataType <: Type
+#mutable struct DataType <: Type
# name::TypeName
# super::Type
# parameters::Tuple
@@ -30,91 +29,91 @@
# pointerfree::Bool
#end
-#type Union <: Type
+#struct Union <: Type
# a
# b
#end
-#type TypeVar
+#mutable struct TypeVar
# name::Symbol
# lb::Type
# ub::Type
#end
-#type UnionAll
+#struct UnionAll
# var::TypeVar
# body
#end
-#immutable Void
+#struct Void
#end
#const nothing = Void()
-#abstract AbstractArray{T,N}
-#abstract DenseArray{T,N} <: AbstractArray{T,N}
+#abstract type AbstractArray{T,N} end
+#abstract type DenseArray{T,N} <: AbstractArray{T,N} end
-#type Array{T,N} <: DenseArray{T,N}
+#mutable struct Array{T,N} <: DenseArray{T,N}
#end
-#type Module
+#mutable struct Module
# name::Symbol
#end
-#type Method
+#mutable struct Method
#end
-#type MethodInstance
+#mutable struct MethodInstance
#end
-#type CodeInfo
+#mutable struct CodeInfo
#end
-#type TypeMapLevel
+#mutable struct TypeMapLevel
#end
-#type TypeMapEntry
+#mutable struct TypeMapEntry
#end
-#abstract Ref{T}
-#bitstype {32|64} Ptr{T} <: Ref{T}
+#abstract type Ref{T} end
+#primitive type Ptr{T} <: Ref{T} {32|64} end
# types for the front end
-#type Expr
+#mutable struct Expr
# head::Symbol
# args::Array{Any,1}
# typ::Any
#end
-#immutable LineNumberNode
+#struct LineNumberNode
# line::Int
#end
-#immutable LabelNode
+#struct LabelNode
# label::Int
#end
-#immutable GotoNode
+#struct GotoNode
# label::Int
#end
-#immutable QuoteNode
+#struct QuoteNode
# value
#end
-#immutable GlobalRef
+#struct GlobalRef
# mod::Module
# name::Symbol
#end
-# type Task
-# parent::Task
-# storage::Any
-# consumers
-# started::Bool
-# done::Bool
-# runnable::Bool
-# end
+#mutable struct Task
+# parent::Task
+# storage::Any
+# consumers
+# started::Bool
+# done::Bool
+# runnable::Bool
+#end
export
# key types
@@ -150,30 +149,30 @@ export
typealias AnyVector Array{Any,1}
-abstract Number
-abstract Real <: Number
-abstract AbstractFloat <: Real
-abstract Integer <: Real
-abstract Signed <: Integer
-abstract Unsigned <: Integer
-
-bitstype 16 Float16 <: AbstractFloat
-bitstype 32 Float32 <: AbstractFloat
-bitstype 64 Float64 <: AbstractFloat
-
-bitstype 8 Bool <: Integer
-bitstype 32 Char
-
-bitstype 8 Int8 <: Signed
-bitstype 8 UInt8 <: Unsigned
-bitstype 16 Int16 <: Signed
-bitstype 16 UInt16 <: Unsigned
-bitstype 32 Int32 <: Signed
-bitstype 32 UInt32 <: Unsigned
-bitstype 64 Int64 <: Signed
-bitstype 64 UInt64 <: Unsigned
-bitstype 128 Int128 <: Signed
-bitstype 128 UInt128 <: Unsigned
+abstract type Number end
+abstract type Real <: Number end
+abstract type AbstractFloat <: Real end
+abstract type Integer <: Real end
+abstract type Signed <: Integer end
+abstract type Unsigned <: Integer end
+
+primitive type Float16 <: AbstractFloat 16 end
+primitive type Float32 <: AbstractFloat 32 end
+primitive type Float64 <: AbstractFloat 64 end
+
+primitive type Bool <: Integer 8 end
+primitive type Char 32 end
+
+primitive type Int8 <: Signed 8 end
+primitive type UInt8 <: Unsigned 8 end
+primitive type Int16 <: Signed 16 end
+primitive type UInt16 <: Unsigned 16 end
+primitive type Int32 <: Signed 32 end
+primitive type UInt32 <: Unsigned 32 end
+primitive type Int64 <: Signed 64 end
+primitive type UInt64 <: Unsigned 64 end
+primitive type Int128 <: Signed 128 end
+primitive type UInt128 <: Unsigned 128 end
if Int === Int64
typealias UInt UInt64
@@ -184,8 +183,8 @@ end
function Typeof end
(f::typeof(Typeof))(x::ANY) = isa(x,Type) ? Type{x} : typeof(x)
-abstract Exception
-type ErrorException <: Exception
+abstract type Exception end
+mutable struct ErrorException <: Exception
msg::AbstractString
ErrorException(msg::AbstractString) = new(msg)
end
@@ -196,34 +195,34 @@ macro _noinline_meta()
Expr(:meta, :noinline)
end
-immutable BoundsError <: Exception
+struct BoundsError <: Exception
a::Any
i::Any
BoundsError() = new()
BoundsError(a::ANY) = (@_noinline_meta; new(a))
BoundsError(a::ANY, i) = (@_noinline_meta; new(a,i))
end
-immutable DivideError <: Exception end
-immutable DomainError <: Exception end
-immutable OverflowError <: Exception end
-immutable InexactError <: Exception end
-immutable OutOfMemoryError <: Exception end
-immutable ReadOnlyMemoryError<: Exception end
-immutable SegmentationFault <: Exception end
-immutable StackOverflowError <: Exception end
-immutable UndefRefError <: Exception end
-immutable UndefVarError <: Exception
+struct DivideError <: Exception end
+struct DomainError <: Exception end
+struct OverflowError <: Exception end
+struct InexactError <: Exception end
+struct OutOfMemoryError <: Exception end
+struct ReadOnlyMemoryError<: Exception end
+struct SegmentationFault <: Exception end
+struct StackOverflowError <: Exception end
+struct UndefRefError <: Exception end
+struct UndefVarError <: Exception
var::Symbol
end
-immutable InterruptException <: Exception end
-type TypeError <: Exception
+struct InterruptException <: Exception end
+mutable struct TypeError <: Exception
func::Symbol
context::AbstractString
expected::Type
got
end
-abstract DirectIndexString <: AbstractString
+abstract type DirectIndexString <: AbstractString end
String(s::String) = s # no constructor yet
@@ -239,7 +238,7 @@ kwfunc(f::ANY) = ccall(:jl_get_keyword_sorter, Any, (Any,), f)
kwftype(t::ANY) = typeof(ccall(:jl_get_kwsorter, Any, (Any,), t.name))
-type Box
+mutable struct Box
contents::Any
Box(x::ANY) = new(x)
Box() = new()
@@ -247,7 +246,7 @@ end
# constructors for built-in types
-type WeakRef
+mutable struct WeakRef
value
WeakRef() = WeakRef(nothing)
WeakRef(v::ANY) = ccall(:jl_gc_new_weakref_th, Ref{WeakRef},
@@ -267,7 +266,7 @@ Void() = nothing
(::Type{Tuple{}})() = ()
-immutable VecElement{T}
+struct VecElement{T}
value::T
VecElement{T}(value::T) where {T} = new(value) # disable converting constructor in Core
end
@@ -350,9 +349,9 @@ atdoc!(λ) = global atdoc = λ
# simple stand-alone print definitions for debugging
-abstract IO
-type CoreSTDOUT <: IO end
-type CoreSTDERR <: IO end
+abstract type IO end
+mutable struct CoreSTDOUT <: IO end
+mutable struct CoreSTDERR <: IO end
const STDOUT = CoreSTDOUT()
const STDERR = CoreSTDERR()
io_pointer(::CoreSTDOUT) = Intrinsics.pointerref(Intrinsics.cglobal(:jl_uv_stdout, Ptr{Void}), 1, 1)
diff --git a/base/cartesian.jl b/base/cartesian.jl
index 334fed12d68df..fe1f8ad44c548 100644
--- a/base/cartesian.jl
+++ b/base/cartesian.jl
@@ -281,7 +281,7 @@ inlineanonymous(base::Symbol, ext) = Symbol(base,'_',ext)
# lreplace(:i_d, :d, 3) -> :i_3
# lreplace(:i_{d-1}, :d, 3) -> :i_2
# This follows LaTeX notation.
-immutable LReplace{S<:AbstractString}
+struct LReplace{S<:AbstractString}
pat_sym::Symbol
pat_str::S
val::Int
diff --git a/base/channels.jl b/base/channels.jl
index 05bd379e60faf..56b4d4bfcc2d2 100644
--- a/base/channels.jl
+++ b/base/channels.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract AbstractChannel
+abstract type AbstractChannel end
"""
Channel{T}(sz::Int)
@@ -17,7 +17,7 @@ Other constructors:
* `Channel(Inf)`: equivalent to `Channel{Any}(typemax(Int))`
* `Channel(sz)`: equivalent to `Channel{Any}(sz)`
"""
-type Channel{T} <: AbstractChannel
+mutable struct Channel{T} <: AbstractChannel
cond_take::Condition # waiting for data to become available
cond_put::Condition # waiting for a writeable slot
state::Symbol
@@ -239,7 +239,7 @@ function close_chnl_on_taskdone(t::Task, ref::WeakRef)
end
end
-type InvalidStateException <: Exception
+mutable struct InvalidStateException <: Exception
msg::AbstractString
state::Symbol
end
@@ -361,7 +361,7 @@ eltype{T}(::Type{Channel{T}}) = T
show(io::IO, c::Channel) = print(io, "$(typeof(c))(sz_max:$(c.sz_max),sz_curr:$(n_avail(c)))")
-type ChannelIterState{T}
+mutable struct ChannelIterState{T}
hasval::Bool
val::T
ChannelIterState{T}(has::Bool) where {T} = new(has)
diff --git a/base/complex.jl b/base/complex.jl
index 038d610d20cdd..8a17eff2823f1 100644
--- a/base/complex.jl
+++ b/base/complex.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-immutable Complex{T<:Real} <: Number
+struct Complex{T<:Real} <: Number
re::T
im::T
end
diff --git a/base/coreio.jl b/base/coreio.jl
index 8e89c7fab4724..2035aae97abe9 100644
--- a/base/coreio.jl
+++ b/base/coreio.jl
@@ -5,7 +5,7 @@ print(xs...) = print(STDOUT::IO, xs...)
println(xs...) = println(STDOUT::IO, xs...)
println(io::IO) = print(io, '\n')
-immutable DevNullStream <: IO end
+struct DevNullStream <: IO end
const DevNull = DevNullStream()
isreadable(::DevNullStream) = false
iswritable(::DevNullStream) = true
diff --git a/base/dSFMT.jl b/base/dSFMT.jl
index 5236c8def9cf3..77c7d95c8ec9a 100644
--- a/base/dSFMT.jl
+++ b/base/dSFMT.jl
@@ -21,7 +21,7 @@ const JN32 = (N+1)*4+1+1
"Jump polynomial for 10^20 steps for dSFMT with exponent 19937"
const JPOLY1e21 = "e172e20c5d2de26b567c0cace9e7c6cc4407bd5ffcd22ca59d37b73d54fdbd937cd3abc6f502e8c186dbd4f1a06b9e2b894f31be77424f94dddfd5a45888a84ca66eeeb242eefe6764ed859dafccae7a6a635b3a63fe9dfbbd5f2d3f2610d39388f53060e84edae75be4f4f2272c0f1f26d1231836ad040ab091550f8a3a5423fb3ab83e068fe2684057f15691c4dc757a3aee4bca8595bf1ad03500d9620a5dbe3b2d64380694895d2f379ca928238293ea267ce14236d5be816a61f018fe4f6bc3c9865f5d4d4186e320ab653d1f3c035ae83e2ad725648a67d3480331e763a1dcdfb5711b56796170b124f5febd723a664a2deefbfa9999d922a108b0e683582ae8d3baacb5bb56683405ea9e6e0d71ddb24b2229c72bb9d07061f2d1fa097ade823b607a2029d6e121ae09d93de01a154199e8e6a6e77c970bda72ba8079b2b3a15dd494a3188b1d94a25ae108a8a5bd0b050e6ce64a365a21420e07fdeebecae02eb68a4304b59283055d22c27d680ea35952834d828c9b9b9dd1a886b4f7fe82fe8f2a962e1e5390e563dc281c799aee2a441b7a813facb6ff5e94c059710dcfe7e6b1635e21ae0dc878dd5f7cc0e1101a74452495a67d23a2672c939f32c81d4a2611073990e92a084cc3a62fd42ee566f29d963a9cc5100ccd0a200f49ce0a74fa891efa1b974d342b7fedf9269e40d9b34e3c59c3d37201aecd5a04f4ae3d0c9a68c7ab78c662390e4cf36cb63ea3539c442efd0bf4aace4b8c8bde93c3d84b4d6290adfae1c5e3fcd457b6f3159e501f17b72ff6bc13d6bf61fbdafabefd16ac1dae0bca667e4e16a2b800732f1d0a9274c8a4c6cccd2db62fc275dc308c31c11cd6fda78de2f81f0e542b76b42b2cc09ed8f965d94c714c9918064f53af5379cfbbc31edf9cbce694f63a75f122048de6e57b094908f749661456813a908027f5d8397ab7962bf75ac779a3e1b7ae3fbc93397a67b486bb849befff1de6162ef2819715a88f41881e366ace692a900796a2806393898dd1750ac2b4ca3d34ca48942322fb6375f0c9a00c9701048ee8d7d7a17e11739177a7ad5027556e85835daf8594d84a97fe6621c0fce1495ae6ab8676cdc992d247acf5a4e5ec8c4755fde28117228d2c3ecf89edb91e93d949e2174924572265e36d176d082ed1be884e51d885ba3cda175c51edcee5042eaf519d292aa05aa4185b03858d710a9d0880b3d4e5111f858a52fe352cbe0a24f06a3d977ae2eb85e2a03a68131d0ab91dac4941067cf90ecd0fce156bcd40b8968cd4aa11e0b4353b14508d79d13ac00af4a4d452496b7f2393699889aa1e508427dbf0be3db91d955feb51e559af57640c6b3f9d5f95609852c28f9462a9869dd93acbdb1aafb2381ebb886a0b3fcec278f8bb0f62c23e157e49b89245b0881268ce594acbddd3605b9eaa77c9ff513e0dbad514914136d96fe2843fe2b4e886a0b718a9b8d1132132110618d0d3595da284cd2a4c9d09386199e4f4d7723983d3a374b51cf20dac5cabb4ff7e7197c2ebd9318463409baa583d6a6115c1b768282ff37b0fe152c97671e400d5ccba7d6875df0bf95c5d91257fedb124de393f31908d0e36251326aa29dd5be86291c80b4bf78f419ec151eeaeff643a58b48ab35ad2cd2c0b77b1965966ef3db6b6373cb2c4b590cef2f16f4d6f62f13a6cbf1a481565b5935edd4e76f7b6a8fd0d74bc336b40a803aec38125c006c877dfdcdb9ba2b7aecab5cafe6076e024c73e3567adf97f607a71d180402c22a20a8388f517484cc4198f97c2fe4f3407e0dc577e61f0f71354aa601cf4e3e42e1edd8722d50f5af3441f68caa568cc1c3a19956c1233f265bb47236afab24ee42b27b0042b90693d77c1923147360ae6503f6ba6abbc9dd52a7b4c36a3b6b55f6a80cfa7f101dd9f1bfc7d7eaf09a5d636b510228f245bfb37b4625025d2c911435cdf6f878113753e0804ab8ecab870ad733b9728d7636b17578b41239393e7de47cbce871137d2b61729dda67b2b84cd3363aad64c5dd5bd172f1f091305b1ff78982abe7dab1588036d097cf497e300e6c78a926048febd1b9462c07f5868928357b74297c87f503056b89f786d22a538b6702e290bca04639a0f1d0939b67f409e5e58e472a6a07fa543e2531c2567ec73c41f6769b6ba94c5aa0a030d006f5b6b1c5fb218b86a8f63a48bc867466f20f699859e87956f48a182d26ed451861dd21201ecc7239037ada67319bdf0849c387c73a110af798b4c5f9018bc97993e060ea2a2937fa2eb095d65ec07009fc407a350f1d6fb3c98a0a5f204be985b0cb6962f0eb7844a179c4598a92ea32d2d706c800034d2e960ded5b476d77073316b933fb3e6ba2f4f24a3b73a1e4d8ed1491d757ecf56fd72465dac0000736744d28d29073091587c8bccad302f7054e8a32bb8724974d9f3e449fc70b2a41f0008b548f717ac0a2c3a6580bfb50774933a578ad6acdcb89940bb406ea540893f097d8a88d1609ed605f25499de939083a0c8a7c6db462df5dfa06c298dd233e249433a54267d5cdc22e5524705b7d6b16b96bb2cb83e00cef62e21d91528a74cf95bfd1d391590c93f4058e9bb02656fd087a5b63d738d1c3b5cf533fd59c81cf9136bfcd3e955c19daf9906ef175791fde6a1d98155d7881e241c3522551cf9fcae42e1e46929ea39fd00943446823f9755085ccc8456a3090b73a3031a201d9c704a4ad4868dd9b6d06205560013973f60d637de2f18354bf4523d9d81dc2a7e78cd42c586364bbe0ed86fde0f081f801c1a4abb830839b7796d9a01f141bec8bd93144104c6dc59170162c0a5a639eb63a0a164970de50eb2e04f027394b26ed48d341f7851994df79d7cd663672a556f25e5e16a3adbe1003d631de938fabfed234df12b5ff3027f4a2da823834cb098e0f977a4eb9614579d5c7a1d400a1a933a657aef8ea1a66743d73b0cf37a7d64e9a63e4c7b09945f0db750b311b39783fb5ea216616751967d480a630d3da7c89d1c7beae20369137e96734a4cfedca56a7887f076fe4fe97534ad3e4f74d1a81750581a5ea214b440c7f30331ab86c257534c71175d1e731303a48b01c589fda4fb0d4368b4dd63d91204cb6fc389b2202aa94391907bfb72902a4031f5589ed5f391c2ce92aa998c200ba3c77d8bd747b9d0a29fa85cda3949a6d2bd0c3402e68f98fd451aa27b6c2dfd170e004577cbdb25e3a1b9852e9f66a370789c47bfce722446dade1b32ceae71ee0e1d96edf7ed08a93e3690056f46c3d8e63f88e53673ee71d72cfedbeba493ee91333120e09e9ce9f9c9a7a400f814ea618b1de48f9805e092f4e20f301fbb65caa83735a2a5c89befe4bce4116dca3688e1e14c6f09a945671dedbb5c0ba526842b6cae31d8b5ff978bae928a17a75c134630dd9de988f6ad3d89a071b33775a9660a40b48ec61ad3f93ac81cb1c65d8b0bab5c214786abd13cc10a8ea2e2a370e86e2fa1a372d83c9697b5e37b281e51507685f714fdaebe49ffc93a5582e1936eaee8e4140a4b72"
-type DSFMT_state
+mutable struct DSFMT_state
val::Vector{Int32}
DSFMT_state(val::Vector{Int32} = zeros(Int32, JN32)) =
diff --git a/base/datafmt.jl b/base/datafmt.jl
index 55ec222e6f8b3..36948df35936b 100644
--- a/base/datafmt.jl
+++ b/base/datafmt.jl
@@ -141,9 +141,9 @@ end
#
# DLMOffsets: Keep offsets (when result dimensions are not known)
# DLMStore: Store values directly into a result store (when result dimensions are known)
-abstract DLMHandler
+abstract type DLMHandler end
-type DLMOffsets <: DLMHandler
+mutable struct DLMOffsets <: DLMHandler
oarr::Vector{Vector{Int}}
offidx::Int
thresh::Int
@@ -194,7 +194,7 @@ function result(dlmoffsets::DLMOffsets)
dlmoffsets.oarr
end
-type DLMStore{T} <: DLMHandler
+mutable struct DLMStore{T} <: DLMHandler
hdr::Array{AbstractString, 2}
data::Array{T, 2}
diff --git a/base/dates/adjusters.jl b/base/dates/adjusters.jl
index ddc44711c119f..eebc68b59b5ad 100644
--- a/base/dates/adjusters.jl
+++ b/base/dates/adjusters.jl
@@ -124,7 +124,7 @@ end
lastdayofquarter(dt::DateTime) = DateTime(lastdayofquarter(Date(dt)))
# Temporal Adjusters
-immutable DateFunction
+struct DateFunction
f::Function
# validate boolean, single-arg inner constructor
function DateFunction(f::ANY, dt::TimeType)
diff --git a/base/dates/io.jl b/base/dates/io.jl
index 5dcdafa8de3ca..fd91696e7e5c5 100644
--- a/base/dates/io.jl
+++ b/base/dates/io.jl
@@ -7,7 +7,7 @@ A token used in parsing or formatting a date time string. Each subtype must
define the tryparsenext and format methods.
"""
-abstract AbstractDateToken
+abstract type AbstractDateToken end
"""
tryparsenext(tok::AbstractDateToken, str::String, i::Int, len::Int, locale::DateLocale)
@@ -59,14 +59,14 @@ Base.show(io::IO, x::Time) = print(io, string(x))
end
# Information for parsing and formatting date time values.
-immutable DateFormat{S, T<:Tuple}
+struct DateFormat{S, T<:Tuple}
tokens::T
locale::DateLocale
end
### Token types ###
-immutable DatePart{letter} <: AbstractDateToken
+struct DatePart{letter} <: AbstractDateToken
width::Int
fixed::Bool
end
@@ -167,7 +167,7 @@ end
### Delimiters
-immutable Delim{T, length} <: AbstractDateToken
+struct Delim{T, length} <: AbstractDateToken
d::T
end
@@ -234,7 +234,7 @@ end
### DateFormat construction
-abstract DayOfWeekToken # special addition to Period types
+abstract type DayOfWeekToken end # special addition to Period types
# mapping format specifiers to period types
const SLOT_RULE = Dict{Char, Type}(
diff --git a/base/dates/periods.jl b/base/dates/periods.jl
index b1074e67e80b0..75eef1331d1e4 100644
--- a/base/dates/periods.jl
+++ b/base/dates/periods.jl
@@ -156,7 +156,7 @@ be expressed using a `CompoundPeriod`. In fact, a `CompoundPeriod` is automatica
generated by addition of different period types, e.g. `Year(1) + Day(1)` produces a
`CompoundPeriod` result.
"""
-type CompoundPeriod <: AbstractTime
+mutable struct CompoundPeriod <: AbstractTime
periods::Array{Period, 1}
function CompoundPeriod(p::Vector{Period})
n = length(p)
diff --git a/base/dates/query.jl b/base/dates/query.jl
index 64ae360a7b275..71072b8afe6f6 100644
--- a/base/dates/query.jl
+++ b/base/dates/query.jl
@@ -2,7 +2,7 @@
# Date Locales
-immutable DateLocale
+struct DateLocale
months::Vector{String}
months_abbr::Vector{String}
days_of_week::Vector{String}
diff --git a/base/dates/types.jl b/base/dates/types.jl
index 605b79595edab..f0cf5ebb45fa2 100644
--- a/base/dates/types.jl
+++ b/base/dates/types.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract AbstractTime
+abstract type AbstractTime end
"""
Period
@@ -17,18 +17,18 @@ abstract AbstractTime
`Period` types represent discrete, human representations of time.
"""
-abstract Period <: AbstractTime
-abstract DatePeriod <: Period
-abstract TimePeriod <: Period
+abstract type Period <: AbstractTime end
+abstract type DatePeriod <: Period end
+abstract type TimePeriod <: Period end
for T in (:Year, :Month, :Week, :Day)
- @eval immutable $T <: DatePeriod
+ @eval struct $T <: DatePeriod
value::Int64
$T(v::Number) = new(v)
end
end
for T in (:Hour, :Minute, :Second, :Millisecond, :Microsecond, :Nanosecond)
- @eval immutable $T <: TimePeriod
+ @eval struct $T <: TimePeriod
value::Int64
$T(v::Number) = new(v)
end
@@ -57,7 +57,7 @@ Period(v)
`Instant` types represent integer-based, machine representations of time as continuous
timelines starting from an epoch.
"""
-abstract Instant <: AbstractTime
+abstract type Instant <: AbstractTime end
"""
UTInstant{T}
@@ -66,7 +66,7 @@ The `UTInstant` represents a machine timeline based on UT time (1 day = one revo
the earth). The `T` is a `Period` parameter that indicates the resolution or precision of
the instant.
"""
-immutable UTInstant{P<:Period} <: Instant
+struct UTInstant{P<:Period} <: Instant
periods::P
end
@@ -76,15 +76,15 @@ UTD(x) = UTInstant(Day(x))
# Calendar types provide rules for interpretating instant
# timelines in human-readable form.
-abstract Calendar <: AbstractTime
+abstract type Calendar <: AbstractTime end
# ISOCalendar implements the ISO 8601 standard (en.wikipedia.org/wiki/ISO_8601)
# Notably based on the proleptic Gregorian calendar
# ISOCalendar provides interpretation rules for UTInstants to civil date and time parts
-immutable ISOCalendar <: Calendar end
+struct ISOCalendar <: Calendar end
-abstract TimeZone
-immutable UTC <: TimeZone end
+abstract type TimeZone end
+struct UTC <: TimeZone end
"""
TimeType
@@ -92,7 +92,7 @@ immutable UTC <: TimeZone end
`TimeType` types wrap `Instant` machine instances to provide human representations of the
machine instant. Both `DateTime` and `Date` are subtypes of `TimeType`.
"""
-abstract TimeType <: AbstractTime
+abstract type TimeType <: AbstractTime end
"""
DateTime
@@ -100,7 +100,7 @@ abstract TimeType <: AbstractTime
`DateTime` wraps a `UTInstant{Millisecond}` and interprets it according to the proleptic
Gregorian calendar.
"""
-immutable DateTime <: TimeType
+struct DateTime <: TimeType
instant::UTInstant{Millisecond}
DateTime(instant::UTInstant{Millisecond}) = new(instant)
end
@@ -110,7 +110,7 @@ end
`Date` wraps a `UTInstant{Day}` and interprets it according to the proleptic Gregorian calendar.
"""
-immutable Date <: TimeType
+struct Date <: TimeType
instant::UTInstant{Day}
Date(instant::UTInstant{Day}) = new(instant)
end
@@ -120,7 +120,7 @@ end
`Time` wraps a `Nanosecond` and represents a specific moment in a 24-hour day.
"""
-immutable Time <: TimeType
+struct Time <: TimeType
instant::Nanosecond
Time(instant::Nanosecond) = new(instant)
end
diff --git a/base/dft.jl b/base/dft.jl
index 21cf0023a0674..41d8eef064414 100644
--- a/base/dft.jl
+++ b/base/dft.jl
@@ -3,7 +3,7 @@
module DFT
# DFT plan where the inputs are an array of eltype T
-abstract Plan{T}
+abstract type Plan{T} end
import Base: show, summary, size, ndims, length, eltype,
*, A_mul_B!, inv, \, A_ldiv_B!
@@ -237,7 +237,7 @@ A_ldiv_B!(y::AbstractArray, p::Plan, x::AbstractArray) = A_mul_B!(y, inv(p), x)
# implementations only need to provide the unnormalized backwards FFT,
# similar to FFTW, and we do the scaling generically to get the ifft:
-type ScaledPlan{T,P,N} <: Plan{T}
+mutable struct ScaledPlan{T,P,N} <: Plan{T}
p::P
scale::N # not T, to avoid unnecessary promotion to Complex
pinv::Plan
diff --git a/base/dict.jl b/base/dict.jl
index 229de51ef4050..e548ab7678e6e 100644
--- a/base/dict.jl
+++ b/base/dict.jl
@@ -55,7 +55,7 @@ function show{K,V}(io::IO, t::Associative{K,V})
end
end
-abstract AbstractSerializer
+abstract type AbstractSerializer end
# Dict
@@ -89,7 +89,7 @@ Dict{String,Int64} with 2 entries:
"A" => 1
```
"""
-type Dict{K,V} <: Associative{K,V}
+mutable struct Dict{K,V} <: Associative{K,V}
slots::Array{UInt8,1}
keys::Array{K,1}
vals::Array{V,1}
@@ -595,7 +595,7 @@ function filter!(f, d::Union{ObjectIdDict,Dict})
return d
end
-immutable ImmutableDict{K, V} <: Associative{K,V}
+struct ImmutableDict{K, V} <: Associative{K,V}
parent::ImmutableDict{K, V}
key::K
value::V
diff --git a/base/docs/Docs.jl b/base/docs/Docs.jl
index 76db2ee306a8c..f067851664368 100644
--- a/base/docs/Docs.jl
+++ b/base/docs/Docs.jl
@@ -127,7 +127,7 @@ which helps to reduce total precompiled image size.
The `.data` fields stores several values related to the docstring, such as: path,
linenumber, source code, and fielddocs.
"""
-type DocStr
+mutable struct DocStr
text :: Core.SimpleVector
object :: Nullable
data :: Dict{Symbol, Any}
@@ -199,7 +199,7 @@ is stored as `Union{Tuple{T}, Tuple{T, Any}}`.
Note: The `Function`/`DataType` object's signature is always `Union{}`.
"""
-type MultiDoc
+mutable struct MultiDoc
"Ordered (via definition order) vector of object signatures."
order::Vector{Type}
"Documentation for each object. Keys are signatures."
@@ -370,9 +370,11 @@ function summarize(io::IO, T::DataType, binding)
println(io, "**Summary:**")
println(io, "```")
println(io,
- T.abstract ? "abstract" : T.mutable ? "type" : "immutable",
- " ", T, " <: ", supertype(T)
- )
+ T.abstract ? "abstract type" :
+ T.mutable ? "mutable struct" :
+ Base.isstructtype(T) ? "struct" : "primitive type",
+ " ", T, " <: ", supertype(T)
+ )
println(io, "```")
if !isempty(fieldnames(T))
println(io, "**Fields:**")
diff --git a/base/docs/basedocs.jl b/base/docs/basedocs.jl
index cc75293a2ca02..002d8846e8091 100644
--- a/base/docs/basedocs.jl
+++ b/base/docs/basedocs.jl
@@ -2,7 +2,7 @@
module BaseDocs
-immutable Keyword
+struct Keyword
name :: Symbol
end
macro kw_str(text) Keyword(Symbol(text)) end
@@ -76,17 +76,17 @@ made available to the user. For example:
kw"export"
"""
-`abstract` declares a type that cannot be instantiated, and serves only as a node in the
+`abstract type` declares a type that cannot be instantiated, and serves only as a node in the
type graph, thereby describing sets of related concrete types: those concrete types
which are their descendants. Abstract types form the conceptual hierarchy which makes
Julia’s type system more than just a collection of object implementations. For example:
- abstract Number
- abstract Real <: Number
+ abstract type Number end
+ abstract type Real <: Number end
-`abstract Number` has no supertype, whereas `abstract Real` is an abstract subtype of `Number`.
+`Number` has no supertype, whereas `Real` is an abstract subtype of `Number`.
"""
-kw"abstract"
+kw"abstract type"
"""
`module` declares a Module, which is a separate global variable workspace. Within a
@@ -118,19 +118,19 @@ or a definition of `eval`. It does still import `Core`.
kw"baremodule"
"""
-`bitstype` declares a concrete type whose data consists of plain old bits. Classic
-examples of bits types are integers and floating-point values. Some example built-in
-bits type declarations:
+`primitive type` declares a concrete type whose data consists only of a series of bits. Classic
+examples of primitive types are integers and floating-point values. Some example built-in
+primitive type declarations:
- bitstype 32 Char
- bitstype 8 Bool <: Integer
+ primitive type Char 32 end
+ primitive type Bool <: Integer 8 end
-The first parameter indicates how many bits of storage the type requires. Currently,
-only sizes that are multiples of 8 bits are supported. The second parameter gives the
-name of the type. The `Bool` declaration shows how a bits type can be optionally
+The number after the name indicates how many bits of storage the type requires. Currently,
+only sizes that are multiples of 8 bits are supported.
+The `Bool` declaration shows how a primitive type can be optionally
declared to be a subtype of some supertype.
"""
-kw"bitstype"
+kw"primitive type"
"""
`macro` defines a method to include generated code in the final body of a program. A
@@ -613,28 +613,33 @@ implicitly begin blocks of code. See also `;`.
kw"begin"
"""
-At their most basic, Julia types are specified as a name and a set of fields.
+The most commonly used kind of type in Julia is a struct, specified as a name and a
+set of fields.
- type Point
+ struct Point
x
y
end
-Fields can have type restrictions, which may be parametrised:
+Fields can have type restrictions, which may be parameterized:
- type Point{X}
+ struct Point{X}
x::X
y::Float64
end
-Type can also declare an abstract super type via `<:` syntax:
+A struct can also declare an abstract super type via `<:` syntax:
- type Point <: AbstractPoint
+ struct Point <: AbstractPoint
...
-See the manual for more details, such as information on inner constructors.
+Structs are immutable by default; an instance of one of these types cannot
+be modified after construction. Use `mutable struct` instead to declare a
+type whose instances can be modified.
+
+See the manual for more details, such as how to define constructors.
"""
-kw"type"
+kw"struct"
"""
Introduce a new name for an already expressible type. For example, in `base/boot.jl`,
@@ -655,10 +660,10 @@ some parameter choices are fixed. In `base` for example:
kw"typealias"
"""
-`immutable` acts in the same way as `type`, but declares that the fields of the type may
-not be set after construction. See `type` and the manual for more information.
+`mutable struct` is similar to `struct`, but additionally allows the fields of the type
+to be set after construction. See `struct` and the manual for more information.
"""
-kw"immutable"
+kw"mutable struct"
"""
@__LINE__ -> Int
diff --git a/base/docs/bindings.jl b/base/docs/bindings.jl
index 045b62b3bc4e4..40ca52cd09e0a 100644
--- a/base/docs/bindings.jl
+++ b/base/docs/bindings.jl
@@ -2,7 +2,7 @@
export @var
-immutable Binding
+struct Binding
mod::Module
var::Symbol
diff --git a/base/docs/helpdb/Base.jl b/base/docs/helpdb/Base.jl
index b79496acbfee0..ff06ebd8473a6 100644
--- a/base/docs/helpdb/Base.jl
+++ b/base/docs/helpdb/Base.jl
@@ -342,7 +342,7 @@ julia> sizeof(Complex128)
16
```
-If `T` is not a bitstype, an error is thrown.
+If `T` does not have a specific size, an error is thrown.
```jldoctest
julia> sizeof(Base.LinAlg.LU)
diff --git a/base/docs/utils.jl b/base/docs/utils.jl
index 173a22f8ec60a..97052991c8ff9 100644
--- a/base/docs/utils.jl
+++ b/base/docs/utils.jl
@@ -19,7 +19,7 @@ You can also use a stream for large amounts of data:
println(io, "
foo
")
end
"""
-type HTML{T}
+mutable struct HTML{T}
content::T
end
@@ -64,7 +64,7 @@ You can also use a stream for large amounts of data:
println(io, "foo")
end
"""
-type Text{T}
+mutable struct Text{T}
content::T
end
@@ -348,12 +348,12 @@ print_correction(word) = print_correction(STDOUT, word)
# Completion data
-const builtins = ["abstract", "baremodule", "begin", "bitstype", "break",
+const builtins = ["abstract type", "baremodule", "begin", "break",
"catch", "ccall", "const", "continue", "do", "else",
"elseif", "end", "export", "finally", "for", "function",
- "global", "if", "immutable", "import", "importall", "let",
- "local", "macro", "module", "quote", "return", "try", "type",
- "typealias", "using", "while"]
+ "global", "if", "import", "importall", "let",
+ "local", "macro", "module", "mutable struct", "primitive type",
+ "quote", "return", "struct", "try", "typealias", "using", "while"]
moduleusings(mod) = ccall(:jl_module_usings, Any, (Any,), mod)
diff --git a/base/env.jl b/base/env.jl
index cca18315941bc..e4bc18e39df8e 100644
--- a/base/env.jl
+++ b/base/env.jl
@@ -63,7 +63,7 @@ end # os test
A singleton of this type provides a hash table interface to environment variables.
"""
-type EnvHash <: Associative{String,String}; end
+mutable struct EnvHash <: Associative{String,String}; end
"""
ENV
diff --git a/base/error.jl b/base/error.jl
index e05d0ecdead42..e5d1cb36a7f59 100644
--- a/base/error.jl
+++ b/base/error.jl
@@ -82,7 +82,7 @@ macro assert(ex, msgs...)
return :($(esc(ex)) ? $(nothing) : throw(Main.Base.AssertionError($msg)))
end
-immutable ExponentialBackOff
+struct ExponentialBackOff
n::Int
first_delay::Float64
max_delay::Float64
diff --git a/base/essentials.jl b/base/essentials.jl
index 30d5fea5e3692..702f8af163b2f 100644
--- a/base/essentials.jl
+++ b/base/essentials.jl
@@ -6,8 +6,8 @@ typealias Callable Union{Function,Type}
const Bottom = Union{}
-abstract AbstractSet{T}
-abstract Associative{K,V}
+abstract type AbstractSet{T} end
+abstract type Associative{K,V} end
# The real @inline macro is not available until after array.jl, so this
# internal macro splices the meta Expr directly into the function body.
@@ -286,12 +286,12 @@ Very few operations are defined on Colons directly; instead they are converted
by `to_indices` to an internal vector type (`Base.Slice`) to represent the
collection of indices they span before being used.
"""
-immutable Colon
+struct Colon
end
const (:) = Colon()
# For passing constants through type inference
-immutable Val{T}
+struct Val{T}
end
# used by interpolating quote and some other things in the front end
diff --git a/base/event.jl b/base/event.jl
index 2b671aaa1d826..0d455ebf18195 100644
--- a/base/event.jl
+++ b/base/event.jl
@@ -12,7 +12,7 @@ called can be woken up. For level-triggered notifications, you must keep extra s
track of whether a notification has happened. The [`Channel`](@ref) type does
this, and so can be used for level-triggered events.
"""
-type Condition
+mutable struct Condition
waitq::Vector{Any}
Condition() = new([])
@@ -235,7 +235,7 @@ when notified from C by a call to `uv_async_send`.
Waiting tasks are woken with an error when the object is closed (by [`close`](@ref).
Use [`isopen`](@ref) to check whether it is still active.
"""
-type AsyncCondition
+mutable struct AsyncCondition
handle::Ptr{Void}
cond::Condition
@@ -308,7 +308,7 @@ Create a timer that wakes up tasks waiting for it (by calling [`wait`](@ref) on
a specified interval. Times are in seconds. Waiting tasks are woken with an error when the
timer is closed (by [`close`](@ref). Use [`isopen`](@ref) to check whether a timer is still active.
"""
-type Timer
+mutable struct Timer
handle::Ptr{Void}
cond::Condition
isopen::Bool
diff --git a/base/fft/FFTW.jl b/base/fft/FFTW.jl
index 4a595e2e937bf..950021cf20045 100644
--- a/base/fft/FFTW.jl
+++ b/base/fft/FFTW.jl
@@ -73,7 +73,7 @@ typealias fftwTypeSingle Union{Type{Float32},Type{Complex64}}
# since it is not written to. Hence, it is convenient to create an
# array-like type that carries a size and a stride like a "real" array
# but which is converted to C_NULL as a pointer.
-immutable FakeArray{T, N} <: DenseArray{T, N}
+struct FakeArray{T, N} <: DenseArray{T, N}
sz::NTuple{N, Int}
st::NTuple{N, Int}
end
@@ -154,7 +154,7 @@ end
# pointer type for fftw_plan (opaque pointer)
-immutable fftw_plan_struct end
+struct fftw_plan_struct end
typealias PlanPtr Ptr{fftw_plan_struct}
# Planner timelimits
@@ -197,10 +197,10 @@ end
# this into a type to support a finalizer on the fftw_plan.
# K is FORWARD/BACKWARD for forward/backward or r2c/c2r plans, respectively.
# For r2r plans, K is a tuple of the transform kinds along each dimension.
-abstract FFTWPlan{T<:fftwNumber,K,inplace} <: Plan{T}
+abstract type FFTWPlan{T<:fftwNumber,K,inplace} <: Plan{T} end
for P in (:cFFTWPlan, :rFFTWPlan, :r2rFFTWPlan) # complex, r2c/c2r, and r2r
@eval begin
- type $P{T<:fftwNumber,K,inplace,N} <: FFTWPlan{T,K,inplace}
+ mutable struct $P{T<:fftwNumber,K,inplace,N} <: FFTWPlan{T,K,inplace}
plan::PlanPtr
sz::NTuple{N, Int} # size of array on which plan operates (Int tuple)
osz::NTuple{N, Int} # size of output array (Int tuple)
diff --git a/base/fft/dct.jl b/base/fft/dct.jl
index f97f52ee3be0f..ef73687eff988 100644
--- a/base/fft/dct.jl
+++ b/base/fft/dct.jl
@@ -9,7 +9,7 @@ export dct, idct, dct!, idct!, plan_dct, plan_idct, plan_dct!, plan_idct!
# Unlike Matlab we compute the multidimensional transform by default,
# similar to the Julia fft functions.
-type DCTPlan{T<:fftwNumber,K,inplace} <: Plan{T}
+mutable struct DCTPlan{T<:fftwNumber,K,inplace} <: Plan{T}
plan::r2rFFTWPlan{T}
r::Array{UnitRange{Int}} # array of indices for rescaling
nrm::Float64 # normalization factor
diff --git a/base/file.jl b/base/file.jl
index 1cc1829c33d4f..30eb9696de249 100644
--- a/base/file.jl
+++ b/base/file.jl
@@ -389,7 +389,7 @@ function mktempdir(fn::Function, parent=tempdir())
end
end
-immutable uv_dirent_t
+struct uv_dirent_t
name::Ptr{UInt8}
typ::Cint
end
diff --git a/base/filesystem.jl b/base/filesystem.jl
index e90a1b821050e..f66bbfd5a0df5 100644
--- a/base/filesystem.jl
+++ b/base/filesystem.jl
@@ -57,9 +57,9 @@ include(string(length(Core.ARGS)>=2?Core.ARGS[2]:"","file_constants.jl")) # inc
## Operations with File (fd) objects ##
-abstract AbstractFile <: IO
+abstract type AbstractFile <: IO end
-type File <: AbstractFile
+mutable struct File <: AbstractFile
open::Bool
handle::RawFD
File(fd::RawFD) = new(true, fd)
diff --git a/base/generator.jl b/base/generator.jl
index 2708d65148d30..c3a4c9bf974c8 100644
--- a/base/generator.jl
+++ b/base/generator.jl
@@ -28,7 +28,7 @@ julia> collect(g)
25
```
"""
-immutable Generator{I,F}
+struct Generator{I,F}
f::F
iter::I
end
@@ -48,11 +48,11 @@ end
## iterator traits
-abstract IteratorSize
-immutable SizeUnknown <: IteratorSize end
-immutable HasLength <: IteratorSize end
-immutable HasShape <: IteratorSize end
-immutable IsInfinite <: IteratorSize end
+abstract type IteratorSize end
+struct SizeUnknown <: IteratorSize end
+struct HasLength <: IteratorSize end
+struct HasShape <: IteratorSize end
+struct IsInfinite <: IteratorSize end
"""
iteratorsize(itertype::Type) -> IteratorSize
@@ -82,9 +82,9 @@ Base.HasLength()
iteratorsize(x) = iteratorsize(typeof(x))
iteratorsize(::Type) = HasLength() # HasLength is the default
-abstract IteratorEltype
-immutable EltypeUnknown <: IteratorEltype end
-immutable HasEltype <: IteratorEltype end
+abstract type IteratorEltype end
+struct EltypeUnknown <: IteratorEltype end
+struct HasEltype <: IteratorEltype end
"""
iteratoreltype(itertype::Type) -> IteratorEltype
diff --git a/base/gmp.jl b/base/gmp.jl
index 3cdf65b6fcdec..03a61e3ae7252 100644
--- a/base/gmp.jl
+++ b/base/gmp.jl
@@ -38,7 +38,7 @@ else
end
-type BigInt <: Integer
+mutable struct BigInt <: Integer
alloc::Cint
size::Cint
d::Ptr{Limb}
diff --git a/base/grisu/bignums.jl b/base/grisu/bignums.jl
index 6dfb917d50460..db65740cfd848 100644
--- a/base/grisu/bignums.jl
+++ b/base/grisu/bignums.jl
@@ -49,7 +49,7 @@ const kBigitMask = Chunk((1 << kBigitSize) - 1)
# grow. There are no checks if the stack-allocated space is sufficient.
const kBigitCapacity = div(kMaxSignificantBits,kBigitSize)
-type Bignum
+mutable struct Bignum
bigits::Array{UInt32,1}
used_digits::Int32
exponent::Int32
diff --git a/base/grisu/float.jl b/base/grisu/float.jl
index 70de682f97d73..c545b8c10d216 100644
--- a/base/grisu/float.jl
+++ b/base/grisu/float.jl
@@ -28,7 +28,7 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-immutable Float
+struct Float
s::UInt64
e::Int32
de::Int32
diff --git a/base/inference.jl b/base/inference.jl
index 5670a6edbdede..7cbd5758041d3 100644
--- a/base/inference.jl
+++ b/base/inference.jl
@@ -6,7 +6,7 @@ import Core: _apply, svec, apply_type, Builtin, IntrinsicFunction, MethodInstanc
const MAX_TYPEUNION_LEN = 3
const MAX_TYPE_DEPTH = 8
-immutable InferenceParams
+struct InferenceParams
world::UInt
# optimization
@@ -47,20 +47,20 @@ const Slot_UsedUndef = 32
#### inference state types ####
-immutable NotFound end
+struct NotFound end
const NF = NotFound()
typealias LineNum Int
typealias VarTable Array{Any,1}
# The type of a variable load is either a value or an UndefVarError
-type VarState
+mutable struct VarState
typ
undef::Bool
VarState(typ::ANY, undef::Bool) = new(typ, undef)
end
# The type of a value might be constant
-immutable Const
+struct Const
val
Const(v::ANY) = new(v)
end
@@ -70,7 +70,7 @@ end
# limit the type of some other variable
# The Conditional type tracks the set of branches on variable type info
# that was used to create the boolean condition
-type Conditional
+mutable struct Conditional
var::Union{Slot,SSAValue}
vtype
elsetype
@@ -82,7 +82,7 @@ type Conditional
end
end
-immutable PartialTypeVar
+struct PartialTypeVar
tv::TypeVar
# N.B.: Currently unused, but would allow turning something back
# into Const, if the bounds are pulled out of this TypeVar
@@ -97,7 +97,7 @@ function rewrap(t::ANY, u::ANY)
return rewrap_unionall(t, u)
end
-type InferenceState
+mutable struct InferenceState
sp::SimpleVector # static parameters
label_counter::Int # index of the current highest label for this function
mod::Module
@@ -1929,7 +1929,7 @@ end
#### handling for statement-position expressions ####
-type StateUpdate
+mutable struct StateUpdate
var::Union{Slot,SSAValue}
vtype
state::VarTable
@@ -3309,7 +3309,7 @@ end
#### post-inference optimizations ####
-immutable InvokeData
+struct InvokeData
mt::MethodTable
entry::TypeMapEntry
types0
@@ -4891,7 +4891,7 @@ function alloc_elim_pass!(sv::InferenceState)
nv, field_names = alloc
tup = rhs.args
# This makes sure the value doesn't escape so we can elide
- # allocation of mutable types too
+ # allocation of mutable structs too
if (var !== nothing &&
occurs_outside_getfield(bexpr, var, sv, nv, field_names))
i += 1
diff --git a/base/intset.jl b/base/intset.jl
index cecbb0f2a365d..1bb2016d0a11a 100644
--- a/base/intset.jl
+++ b/base/intset.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-immutable IntSet <: AbstractSet{Int}
+struct IntSet <: AbstractSet{Int}
bits::BitVector
IntSet() = new(falses(256))
end
diff --git a/base/io.jl b/base/io.jl
index 7db13a6f8c8e3..58d443371db4c 100644
--- a/base/io.jl
+++ b/base/io.jl
@@ -101,7 +101,7 @@ end
# Generic wrappers around other IO objects
-abstract AbstractPipe <: IO
+abstract type AbstractPipe <: IO end
function pipe_reader end
function pipe_writer end
@@ -538,7 +538,7 @@ readstring(filename::AbstractString) = open(readstring, filename)
## high-level iterator interfaces ##
-type EachLine
+mutable struct EachLine
stream::IO
ondone::Function
chomp::Bool
diff --git a/base/iobuffer.jl b/base/iobuffer.jl
index 72af09462d340..af58ba1a5b1e2 100644
--- a/base/iobuffer.jl
+++ b/base/iobuffer.jl
@@ -3,7 +3,7 @@
## work with AbstractVector{UInt8} via I/O primitives ##
# Stateful string
-type AbstractIOBuffer{T<:AbstractVector{UInt8}} <: IO
+mutable struct AbstractIOBuffer{T<:AbstractVector{UInt8}} <: IO
data::T # T should support: getindex, setindex!, length, copy!, resize!, and T()
readable::Bool
writable::Bool
diff --git a/base/iostream.jl b/base/iostream.jl
index a2050119b78fb..dc0b0ac2f8618 100644
--- a/base/iostream.jl
+++ b/base/iostream.jl
@@ -4,7 +4,7 @@
const sizeof_ios_t = Int(ccall(:jl_sizeof_ios_t, Cint, ()))
-type IOStream <: IO
+mutable struct IOStream <: IO
handle::Ptr{Void}
ios::Array{UInt8,1}
name::AbstractString
diff --git a/base/irrationals.jl b/base/irrationals.jl
index d17111f500154..ae8f4d4af3f3c 100644
--- a/base/irrationals.jl
+++ b/base/irrationals.jl
@@ -2,7 +2,7 @@
## general machinery for irrational mathematical constants
-immutable Irrational{sym} <: Real end
+struct Irrational{sym} <: Real end
show{sym}(io::IO, x::Irrational{sym}) = print(io, "$sym = $(string(float(x))[1:15])...")
diff --git a/base/iterators.jl b/base/iterators.jl
index 30a864ce2a990..eb52006852af1 100644
--- a/base/iterators.jl
+++ b/base/iterators.jl
@@ -28,7 +28,7 @@ and_iteratoreltype(a, b) = EltypeUnknown()
# enumerate
-immutable Enumerate{I}
+struct Enumerate{I}
itr::I
end
@@ -71,7 +71,7 @@ iteratoreltype{I}(::Type{Enumerate{I}}) = iteratoreltype(I)
# zip
-abstract AbstractZipIterator
+abstract type AbstractZipIterator end
zip_iteratorsize(a, b) = and_iteratorsize(a,b) # as `and_iteratorsize` but inherit `Union{HasLength,IsInfinite}` of the shorter iterator
zip_iteratorsize(::HasLength, ::IsInfinite) = HasLength()
@@ -80,7 +80,7 @@ zip_iteratorsize(a::IsInfinite, b) = zip_iteratorsize(b,a)
zip_iteratorsize(a::IsInfinite, b::IsInfinite) = IsInfinite()
-immutable Zip1{I} <: AbstractZipIterator
+struct Zip1{I} <: AbstractZipIterator
a::I
end
zip(a) = Zip1(a)
@@ -98,7 +98,7 @@ end
iteratorsize{I}(::Type{Zip1{I}}) = iteratorsize(I)
iteratoreltype{I}(::Type{Zip1{I}}) = iteratoreltype(I)
-immutable Zip2{I1, I2} <: AbstractZipIterator
+struct Zip2{I1, I2} <: AbstractZipIterator
a::I1
b::I2
end
@@ -118,7 +118,7 @@ end
iteratorsize{I1,I2}(::Type{Zip2{I1,I2}}) = zip_iteratorsize(iteratorsize(I1),iteratorsize(I2))
iteratoreltype{I1,I2}(::Type{Zip2{I1,I2}}) = and_iteratoreltype(iteratoreltype(I1),iteratoreltype(I2))
-immutable Zip{I, Z<:AbstractZipIterator} <: AbstractZipIterator
+struct Zip{I, Z<:AbstractZipIterator} <: AbstractZipIterator
a::I
z::Z
end
@@ -171,7 +171,7 @@ iteratoreltype{I1,I2}(::Type{Zip{I1,I2}}) = and_iteratoreltype(iteratoreltype(I1
# filter
-immutable Filter{F,I}
+struct Filter{F,I}
flt::F
itr::I
end
@@ -212,7 +212,7 @@ iteratorsize{T<:Filter}(::Type{T}) = SizeUnknown()
# Rest -- iterate starting at the given state
-immutable Rest{I,S}
+struct Rest{I,S}
itr::I
st::S
end
@@ -237,7 +237,7 @@ iteratorsize{I,S}(::Type{Rest{I,S}}) = rest_iteratorsize(iteratorsize(I))
# Count -- infinite counting
-immutable Count{S<:Number}
+struct Count{S<:Number}
start::S
step::S
end
@@ -261,7 +261,7 @@ iteratorsize{S}(::Type{Count{S}}) = IsInfinite()
# Take -- iterate through the first n elements
-immutable Take{I}
+struct Take{I}
xs::I
n::Int
end
@@ -316,7 +316,7 @@ end
# Drop -- iterator through all but the first n elements
-immutable Drop{I}
+struct Drop{I}
xs::I
n::Int
end
@@ -374,7 +374,7 @@ done(it::Drop, state) = done(it.xs, state)
# Cycle an iterator forever
-immutable Cycle{I}
+struct Cycle{I}
xs::I
end
@@ -408,7 +408,7 @@ done(it::Cycle, state) = state[2]
# Repeated - repeat an object infinitely many times
-immutable Repeated{O}
+struct Repeated{O}
x::O
end
repeated(x) = Repeated(x)
@@ -444,7 +444,7 @@ iteratoreltype{O}(::Type{Repeated{O}}) = HasEltype()
# Product -- cartesian product of iterators
-abstract AbstractProdIterator
+abstract type AbstractProdIterator end
length(p::AbstractProdIterator) = prod(size(p))
_length(p::AbstractProdIterator) = prod(map(unsafe_length, indices(p)))
@@ -476,7 +476,7 @@ _prod_indices(a, b, A, B) =
throw(ArgumentError("Cannot construct indices for objects of types $(typeof(a)) and $(typeof(b))"))
# one iterator
-immutable Prod1{I} <: AbstractProdIterator
+struct Prod1{I} <: AbstractProdIterator
a::I
end
product(a) = Prod1(a)
@@ -496,7 +496,7 @@ iteratoreltype{I}(::Type{Prod1{I}}) = iteratoreltype(I)
iteratorsize{I}(::Type{Prod1{I}}) = iteratorsize(I)
# two iterators
-immutable Prod2{I1, I2} <: AbstractProdIterator
+struct Prod2{I1, I2} <: AbstractProdIterator
a::I1
b::I2
end
@@ -548,7 +548,7 @@ end
@inline done(p::AbstractProdIterator, st) = st[4]
# n iterators
-immutable Prod{I1, I2<:AbstractProdIterator} <: AbstractProdIterator
+struct Prod{I1, I2<:AbstractProdIterator} <: AbstractProdIterator
a::I1
b::I2
end
@@ -574,7 +574,7 @@ prod_iteratorsize(a, b) = SizeUnknown()
# flatten an iterator of iterators
-immutable Flatten{I}
+struct Flatten{I}
it::I
end
@@ -649,7 +649,7 @@ julia> collect(Iterators.partition([1,2,3,4,5], 2))
partition{T}(c::T, n::Integer) = PartitionIterator{T}(c, Int(n))
-type PartitionIterator{T}
+mutable struct PartitionIterator{T}
c::T
n::Int
end
diff --git a/base/libc.jl b/base/libc.jl
index ea0e4b3698348..d811c79aae6d9 100644
--- a/base/libc.jl
+++ b/base/libc.jl
@@ -15,7 +15,7 @@ include(string(length(Core.ARGS)>=2?Core.ARGS[2]:"","errno_h.jl")) # include($B
## RawFD ##
# Wrapper for an OS file descriptor (on both Unix and Windows)
-immutable RawFD
+struct RawFD
fd::Int32
RawFD(fd::Integer) = new(fd)
RawFD(fd::RawFD) = fd
@@ -30,7 +30,7 @@ dup(src::RawFD, target::RawFD) = systemerror("dup", -1 ==
# Wrapper for an OS file descriptor (for Windows)
if is_windows()
- immutable WindowsRawSocket
+ struct WindowsRawSocket
handle::Ptr{Void} # On Windows file descriptors are HANDLE's and 64-bit on 64-bit Windows
end
Base.cconvert(::Type{Ptr{Void}}, fd::WindowsRawSocket) = fd.handle
@@ -42,7 +42,7 @@ end
## FILE (not auto-finalized) ##
-immutable FILE
+struct FILE
ptr::Ptr{Void}
end
@@ -96,7 +96,7 @@ else
error("systemsleep undefined for this OS")
end
-immutable TimeVal
+struct TimeVal
sec::Int64
usec::Int64
end
@@ -114,7 +114,7 @@ end
Convert a number of seconds since the epoch to broken-down format, with fields `sec`, `min`,
`hour`, `mday`, `month`, `year`, `wday`, `yday`, and `isdst`.
"""
-type TmStruct
+mutable struct TmStruct
sec::Int32
min::Int32
hour::Int32
diff --git a/base/libdl.jl b/base/libdl.jl
index 5f2b696d35853..a9e65684700c3 100644
--- a/base/libdl.jl
+++ b/base/libdl.jl
@@ -180,7 +180,7 @@ File extension for dynamic libraries (e.g. dll, dylib, so) on the current platfo
dlext
if is_linux()
- immutable dl_phdr_info
+ struct dl_phdr_info
# Base address of object
addr::Cuint
diff --git a/base/libgit2/error.jl b/base/libgit2/error.jl
index 1d6c904a62e57..8e91bec65821c 100644
--- a/base/libgit2/error.jl
+++ b/base/libgit2/error.jl
@@ -58,12 +58,12 @@ export GitError
Describe,
Rebase)
-immutable ErrorStruct
+struct ErrorStruct
message::Ptr{UInt8}
class::Cint
end
-immutable GitError <: Exception
+struct GitError <: Exception
class::Class
code::Code
msg::AbstractString
diff --git a/base/libgit2/libgit2.jl b/base/libgit2/libgit2.jl
index 0ccfc2298158a..0df0561181124 100644
--- a/base/libgit2/libgit2.jl
+++ b/base/libgit2/libgit2.jl
@@ -36,7 +36,7 @@ include("callbacks.jl")
using .Error
-immutable State
+struct State
head::GitHash
index::GitHash
work::GitHash
diff --git a/base/libgit2/types.jl b/base/libgit2/types.jl
index 0c978783bd35f..10423af8e0952 100644
--- a/base/libgit2/types.jl
+++ b/base/libgit2/types.jl
@@ -6,7 +6,7 @@ const OID_RAWSZ = 20
const OID_HEXSZ = OID_RAWSZ * 2
const OID_MINPREFIXLEN = 4
-abstract AbstractGitHash
+abstract type AbstractGitHash end
"""
GitHash
@@ -14,7 +14,7 @@ abstract AbstractGitHash
A git object identifier, based on the sha-1 hash. It is a $OID_RAWSZ byte string
($OID_HEXSZ hex digits) used to identify a `GitObject` in a repository.
"""
-immutable GitHash <: AbstractGitHash
+struct GitHash <: AbstractGitHash
val::NTuple{OID_RAWSZ, UInt8}
GitHash(val::NTuple{OID_RAWSZ, UInt8}) = new(val)
end
@@ -29,7 +29,7 @@ is unique.
Internally it is stored as two fields: a full-size `GitHash` (`hash`) and a length
(`len`). Only the initial `len` hex digits of `hash` are used.
"""
-immutable GitShortHash <: AbstractGitHash
+struct GitShortHash <: AbstractGitHash
hash::GitHash # underlying hash: unused digits are ignored
len::Csize_t # length in hex digits
end
@@ -41,7 +41,7 @@ end
Time in a signature.
Matches the [`git_time`](https://libgit2.github.com/libgit2/#HEAD/type/git_time) struct.
"""
-immutable TimeStruct
+struct TimeStruct
time::Int64 # time in seconds from epoch
offset::Cint # timezone offset in minutes
end
@@ -52,7 +52,7 @@ end
An action signature (e.g. for committers, taggers, etc).
Matches the [`git_signature`](https://libgit2.github.com/libgit2/#HEAD/type/git_signature) struct.
"""
-immutable SignatureStruct
+struct SignatureStruct
name::Ptr{UInt8} # full name of the author
email::Ptr{UInt8} # email of the author
when::TimeStruct # time when the action happened
@@ -81,7 +81,7 @@ strs = String[...]
```
Note that no call to `free` is required as the data is allocated by Julia.
"""
-immutable StrArrayStruct
+struct StrArrayStruct
strings::Ptr{Cstring}
count::Csize_t
end
@@ -106,7 +106,7 @@ free(buf_ref)
```
In particular, note that `LibGit2.free` should be called afterward on the `Ref` object.
"""
-immutable Buffer
+struct Buffer
ptr::Ptr{Cchar}
asize::Csize_t
size::Csize_t
@@ -118,7 +118,7 @@ function free(buf_ref::Base.Ref{Buffer})
end
"Abstract credentials payload"
-abstract AbstractCredentials
+abstract type AbstractCredentials end
"Checks if credentials were used"
checkused!(p::AbstractCredentials) = true
@@ -131,7 +131,7 @@ reset!(p::AbstractCredentials, cnt::Int=3) = nothing
Matches the [`git_checkout_options`](https://libgit2.github.com/libgit2/#HEAD/type/git_checkout_options) struct.
"""
-@kwdef immutable CheckoutOptions
+@kwdef struct CheckoutOptions
version::Cuint = 1
checkout_strategy::Cuint = Consts.CHECKOUT_SAFE
@@ -168,7 +168,7 @@ end
Callback settings.
Matches the [`git_remote_callbacks`](https://libgit2.github.com/libgit2/#HEAD/type/git_remote_callbacks) struct.
"""
-@kwdef immutable RemoteCallbacks
+@kwdef struct RemoteCallbacks
version::Cuint = 1
sideband_progress::Ptr{Void}
completion::Ptr{Void}
@@ -195,7 +195,7 @@ Options for connecting through a proxy.
Matches the [`git_proxy_options`](https://libgit2.github.com/libgit2/#HEAD/type/git_proxy_options) struct.
"""
-@kwdef immutable ProxyOptions
+@kwdef struct ProxyOptions
version::Cuint = 1
proxytype::Cint
url::Cstring
@@ -210,7 +210,7 @@ end
Matches the [`git_fetch_options`](https://libgit2.github.com/libgit2/#HEAD/type/git_fetch_options) struct.
"""
-@kwdef immutable FetchOptions
+@kwdef struct FetchOptions
version::Cuint = 1
callbacks::RemoteCallbacks
prune::Cint = Consts.FETCH_PRUNE_UNSPECIFIED
@@ -229,7 +229,7 @@ end
Matches the [`git_clone_options`](https://libgit2.github.com/libgit2/#HEAD/type/git_clone_options) struct.
"""
-@kwdef immutable CloneOptions
+@kwdef struct CloneOptions
version::Cuint = 1
checkout_opts::CheckoutOptions
fetch_opts::FetchOptions
@@ -247,7 +247,7 @@ end
Matches the [`git_diff_options`](https://libgit2.github.com/libgit2/#HEAD/type/git_diff_options) struct.
"""
-@kwdef immutable DiffOptionsStruct
+@kwdef struct DiffOptionsStruct
version::Cuint = Consts.DIFF_OPTIONS_VERSION
flags::UInt32 = Consts.DIFF_NORMAL
@@ -275,7 +275,7 @@ end
Description of one side of a delta.
Matches the [`git_diff_file`](https://libgit2.github.com/libgit2/#HEAD/type/git_diff_file) struct.
"""
-immutable DiffFile
+struct DiffFile
id::GitHash
path::Cstring
size::Int64
@@ -292,7 +292,7 @@ end
Description of changes to one entry.
Matches the [`git_diff_file`](https://libgit2.github.com/libgit2/#HEAD/type/git_diff_file) struct.
"""
-immutable DiffDelta
+struct DiffDelta
status::Cint
flags::UInt32
similarity::UInt16
@@ -306,7 +306,7 @@ end
Matches the [`git_merge_options`](https://libgit2.github.com/libgit2/#HEAD/type/git_merge_options) struct.
"""
-@kwdef immutable MergeOptions
+@kwdef struct MergeOptions
version::Cuint = 1
flags::Cint
rename_threshold::Cuint = 50
@@ -327,7 +327,7 @@ end
Matches the [`git_push_options`](https://libgit2.github.com/libgit2/#HEAD/type/git_push_options) struct.
"""
-@kwdef immutable PushOptions
+@kwdef struct PushOptions
version::Cuint = 1
parallelism::Cint = 1
callbacks::RemoteCallbacks
@@ -344,7 +344,7 @@ end
Matches the [`git_index_time`](https://libgit2.github.com/libgit2/#HEAD/type/git_index_time) struct.
"""
-immutable IndexTime
+struct IndexTime
seconds::Int64
nanoseconds::Cuint
end
@@ -355,7 +355,7 @@ end
In-memory representation of a file entry in the index.
Matches the [`git_index_entry`](https://libgit2.github.com/libgit2/#HEAD/type/git_index_entry) struct.
"""
-immutable IndexEntry
+struct IndexEntry
ctime::IndexTime
mtime::IndexTime
@@ -380,7 +380,7 @@ Base.show(io::IO, ie::IndexEntry) = print(io, "IndexEntry($(string(ie.id)))")
Matches the `git_rebase_options` struct.
"""
-@kwdef immutable RebaseOptions
+@kwdef struct RebaseOptions
version::Cuint = 1
quiet::Cint = 1
@static if LibGit2.VERSION >= v"0.24.0"
@@ -399,7 +399,7 @@ end
Describes a single instruction/operation to be performed during the rebase.
Matches the [`git_rebase_operation`](https://libgit2.github.com/libgit2/#HEAD/type/git_rebase_operation_t) struct.
"""
-immutable RebaseOperation
+struct RebaseOperation
optype::Cint
id::GitHash
exec::Cstring
@@ -412,7 +412,7 @@ Base.show(io::IO, rbo::RebaseOperation) = print(io, "RebaseOperation($(string(rb
Options to control how `git_status_foreach_ext()` will issue callbacks.
Matches the [`git_status_opt_t`](https://libgit2.github.com/libgit2/#HEAD/type/git_status_opt_t) struct.
"""
-@kwdef immutable StatusOptions
+@kwdef struct StatusOptions
version::Cuint = 1
show::Cint = Consts.STATUS_SHOW_INDEX_AND_WORKDIR
flags::Cuint = Consts.STATUS_OPT_INCLUDE_UNTRACKED |
@@ -429,7 +429,7 @@ Providing the differences between the file as it exists in HEAD and the index, a
providing the differences between the index and the working directory.
Matches the `git_status_entry` struct.
"""
-immutable StatusEntry
+struct StatusEntry
status::Cuint
head_to_index::Ptr{DiffDelta}
index_to_workdir::Ptr{DiffDelta}
@@ -442,7 +442,7 @@ Contains the information about HEAD during a fetch, including the name and URL
of the branch fetched from, the oid of the HEAD, and whether the fetched HEAD
has been merged locally.
"""
-immutable FetchHead
+struct FetchHead
name::String
url::String
oid::GitHash
@@ -450,10 +450,10 @@ immutable FetchHead
end
# Abstract object types
-abstract AbstractGitObject
+abstract type AbstractGitObject end
Base.isempty(obj::AbstractGitObject) = (obj.ptr == C_NULL)
-abstract GitObject <: AbstractGitObject
+abstract type GitObject <: AbstractGitObject end
for (typ, reporef, sup, cname) in [
(:GitRepo, nothing, :AbstractGitObject, :git_repository),
@@ -475,7 +475,7 @@ for (typ, reporef, sup, cname) in [
(:GitTag, :GitRepo, :GitObject, :git_tag)]
if reporef === nothing
- @eval type $typ <: $sup
+ @eval mutable struct $typ <: $sup
ptr::Ptr{Void}
function $typ(ptr::Ptr{Void},fin=true)
# fin=false should only be used when the pointer should not be free'd
@@ -490,7 +490,7 @@ for (typ, reporef, sup, cname) in [
end
end
elseif reporef == :Nullable
- @eval type $typ <: $sup
+ @eval mutable struct $typ <: $sup
nrepo::Nullable{GitRepo}
ptr::Ptr{Void}
function $typ(repo::GitRepo, ptr::Ptr{Void})
@@ -509,7 +509,7 @@ for (typ, reporef, sup, cname) in [
end
end
elseif reporef == :GitRepo
- @eval type $typ <: $sup
+ @eval mutable struct $typ <: $sup
repo::GitRepo
ptr::Ptr{Void}
function $typ(repo::GitRepo, ptr::Ptr{Void})
@@ -545,7 +545,7 @@ end
This is a Julia wrapper around a pointer to a
[`git_signature`](https://libgit2.github.com/libgit2/#HEAD/type/git_signature) object.
"""
-type GitSignature <: AbstractGitObject
+mutable struct GitSignature <: AbstractGitObject
ptr::Ptr{SignatureStruct}
function GitSignature(ptr::Ptr{SignatureStruct})
@assert ptr != C_NULL
@@ -562,7 +562,7 @@ function Base.close(obj::GitSignature)
end
# Structure has the same layout as SignatureStruct
-type Signature
+mutable struct Signature
name::String
email::String
time::Int64
@@ -629,7 +629,7 @@ end
import Base.securezero!
"Credentials that support only `user` and `password` parameters"
-type UserPasswordCredentials <: AbstractCredentials
+mutable struct UserPasswordCredentials <: AbstractCredentials
user::String
pass::String
prompt_if_incorrect::Bool # Whether to allow interactive prompting if the credentials are incorrect
@@ -650,7 +650,7 @@ function securezero!(cred::UserPasswordCredentials)
end
"SSH credentials type"
-type SSHCredentials <: AbstractCredentials
+mutable struct SSHCredentials <: AbstractCredentials
user::String
pass::String
pubkey::String
@@ -676,7 +676,7 @@ function securezero!(cred::SSHCredentials)
end
"Credentials that support caching"
-type CachedCredentials <: AbstractCredentials
+mutable struct CachedCredentials <: AbstractCredentials
cred::Dict{String,AbstractCredentials}
count::Int # authentication failure protection count
CachedCredentials() = new(Dict{String,AbstractCredentials}(),3)
diff --git a/base/libuv.jl b/base/libuv.jl
index 27e2d2cd392fa..1037e7ce03d9c 100644
--- a/base/libuv.jl
+++ b/base/libuv.jl
@@ -54,7 +54,7 @@ unpreserve_handle(x) = (v = uvhandles[x]::Int; v == 1 ? pop!(uvhandles,x) : (uvh
## Libuv error handling ##
-type UVError <: Exception
+mutable struct UVError <: Exception
prefix::AbstractString
code::Int32
UVError(p::AbstractString,code::Integer)=new(p,code)
diff --git a/base/linalg/arnoldi.jl b/base/linalg/arnoldi.jl
index ff73a7c8e7a3a..f5b7cc362ae58 100644
--- a/base/linalg/arnoldi.jl
+++ b/base/linalg/arnoldi.jl
@@ -302,7 +302,7 @@ end
## svds
### Restrict operator to BlasFloat because ARPACK only supports that. Loosen restriction
### when we switch to our own implementation
-type SVDOperator{T<:BlasFloat,S} <: AbstractArray{T, 2}
+mutable struct SVDOperator{T<:BlasFloat,S} <: AbstractArray{T, 2}
X::S
m::Int
n::Int
diff --git a/base/linalg/bidiag.jl b/base/linalg/bidiag.jl
index 230948e39c362..e5e306d2013cd 100644
--- a/base/linalg/bidiag.jl
+++ b/base/linalg/bidiag.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
# Bidiagonal matrices
-type Bidiagonal{T} <: AbstractMatrix{T}
+mutable struct Bidiagonal{T} <: AbstractMatrix{T}
dv::Vector{T} # diagonal
ev::Vector{T} # sub/super diagonal
isupper::Bool # is upper bidiagonal (true) or lower (false)
diff --git a/base/linalg/bunchkaufman.jl b/base/linalg/bunchkaufman.jl
index ac155f1c3ed5f..8bc09855f614c 100644
--- a/base/linalg/bunchkaufman.jl
+++ b/base/linalg/bunchkaufman.jl
@@ -4,7 +4,7 @@
## LD for BunchKaufman, UL for CholeskyDense, LU for LUDense and
## define size methods for Factorization types using it.
-immutable BunchKaufman{T,S<:AbstractMatrix} <: Factorization{T}
+struct BunchKaufman{T,S<:AbstractMatrix} <: Factorization{T}
LD::S
ipiv::Vector{BlasInt}
uplo::Char
diff --git a/base/linalg/cholesky.jl b/base/linalg/cholesky.jl
index f01d07d9f2fa9..fa435ff564bbf 100644
--- a/base/linalg/cholesky.jl
+++ b/base/linalg/cholesky.jl
@@ -27,14 +27,14 @@
# checks of those fields before calls to LAPACK to check which version of the Cholesky
# factorization the type represents.
-immutable Cholesky{T,S<:AbstractMatrix} <: Factorization{T}
+struct Cholesky{T,S<:AbstractMatrix} <: Factorization{T}
factors::S
uplo::Char
end
Cholesky{T}(A::AbstractMatrix{T}, uplo::Symbol) = Cholesky{T,typeof(A)}(A, char_uplo(uplo))
Cholesky{T}(A::AbstractMatrix{T}, uplo::Char) = Cholesky{T,typeof(A)}(A, uplo)
-immutable CholeskyPivoted{T,S<:AbstractMatrix} <: Factorization{T}
+struct CholeskyPivoted{T,S<:AbstractMatrix} <: Factorization{T}
factors::S
uplo::Char
piv::Vector{BlasInt}
diff --git a/base/linalg/diagonal.jl b/base/linalg/diagonal.jl
index 7ef09ad1508a7..c115680ffc082 100644
--- a/base/linalg/diagonal.jl
+++ b/base/linalg/diagonal.jl
@@ -2,7 +2,7 @@
## Diagonal matrices
-immutable Diagonal{T} <: AbstractMatrix{T}
+struct Diagonal{T} <: AbstractMatrix{T}
diag::Vector{T}
end
"""
diff --git a/base/linalg/eigen.jl b/base/linalg/eigen.jl
index 87ff0da9804cb..b07894732beaf 100644
--- a/base/linalg/eigen.jl
+++ b/base/linalg/eigen.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
# Eigendecomposition
-immutable Eigen{T,V,S<:AbstractMatrix,U<:AbstractVector} <: Factorization{T}
+struct Eigen{T,V,S<:AbstractMatrix,U<:AbstractVector} <: Factorization{T}
values::U
vectors::S
Eigen{T,V,S,U}(values::AbstractVector{V}, vectors::AbstractMatrix{T}) where {T,V,S,U} =
@@ -11,7 +11,7 @@ Eigen(values::AbstractVector{V}, vectors::AbstractMatrix{T}) where {T,V} =
Eigen{T,V,typeof(vectors),typeof(values)}(values, vectors)
# Generalized eigenvalue problem.
-immutable GeneralizedEigen{T,V,S<:AbstractMatrix,U<:AbstractVector} <: Factorization{T}
+struct GeneralizedEigen{T,V,S<:AbstractMatrix,U<:AbstractVector} <: Factorization{T}
values::U
vectors::S
GeneralizedEigen{T,V,S,U}(values::AbstractVector{V}, vectors::AbstractMatrix{T}) where {T,V,S,U} =
diff --git a/base/linalg/exceptions.jl b/base/linalg/exceptions.jl
index 89dfee2e657ed..40320246f420b 100644
--- a/base/linalg/exceptions.jl
+++ b/base/linalg/exceptions.jl
@@ -6,11 +6,11 @@ export LAPACKException,
PosDefException,
RankDeficientException
-type LAPACKException <: Exception
+mutable struct LAPACKException <: Exception
info::BlasInt
end
-type ARPACKException <: Exception
+mutable struct ARPACKException <: Exception
info::String
end
@@ -25,14 +25,14 @@ function ARPACKException(i::Integer)
return ARPACKException("unspecified ARPACK error: $i")
end
-type SingularException <: Exception
+mutable struct SingularException <: Exception
info::BlasInt
end
-type PosDefException <: Exception
+mutable struct PosDefException <: Exception
info::BlasInt
end
-type RankDeficientException <: Exception
+mutable struct RankDeficientException <: Exception
info::BlasInt
end
diff --git a/base/linalg/factorization.jl b/base/linalg/factorization.jl
index ac581f5466a47..872ae195a99d1 100644
--- a/base/linalg/factorization.jl
+++ b/base/linalg/factorization.jl
@@ -2,7 +2,7 @@
## Matrix factorizations and decompositions
-abstract Factorization{T}
+abstract type Factorization{T} end
eltype{T}(::Type{Factorization{T}}) = T
transpose(F::Factorization) = error("transpose not implemented for $(typeof(F))")
diff --git a/base/linalg/givens.jl b/base/linalg/givens.jl
index 7471df3a8c19c..9100331761e5b 100644
--- a/base/linalg/givens.jl
+++ b/base/linalg/givens.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
# givensAlgorithm functions are derived from LAPACK, see below
-abstract AbstractRotation{T}
+abstract type AbstractRotation{T} end
transpose(R::AbstractRotation) = error("transpose not implemented for $(typeof(R)). Consider using conjugate transpose (') instead of transpose (.').")
@@ -24,13 +24,13 @@ therefore be multiplied with matrices of arbitrary size as long as `i2<=size(A,2
See also: [`givens`](@ref)
"""
-immutable Givens{T} <: AbstractRotation{T}
+struct Givens{T} <: AbstractRotation{T}
i1::Int
i2::Int
c::T
s::T
end
-type Rotation{T} <: AbstractRotation{T}
+mutable struct Rotation{T} <: AbstractRotation{T}
rotations::Vector{Givens{T}}
end
diff --git a/base/linalg/hessenberg.jl b/base/linalg/hessenberg.jl
index 28cdcd2187194..e84dcedf62f7e 100644
--- a/base/linalg/hessenberg.jl
+++ b/base/linalg/hessenberg.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-immutable Hessenberg{T,S<:AbstractMatrix} <: Factorization{T}
+struct Hessenberg{T,S<:AbstractMatrix} <: Factorization{T}
factors::S
τ::Vector{T}
Hessenberg{T,S}(factors::AbstractMatrix{T}, τ::Vector{T}) where {T,S<:AbstractMatrix} =
@@ -53,7 +53,7 @@ function hessfact{T}(A::StridedMatrix{T})
return hessfact!(copy_oftype(A, S))
end
-immutable HessenbergQ{T,S<:AbstractMatrix} <: AbstractMatrix{T}
+struct HessenbergQ{T,S<:AbstractMatrix} <: AbstractMatrix{T}
factors::S
τ::Vector{T}
HessenbergQ{T,S}(factors::AbstractMatrix{T}, τ::Vector{T}) where {T,S<:AbstractMatrix} = new(factors, τ)
diff --git a/base/linalg/ldlt.jl b/base/linalg/ldlt.jl
index 27989efb18436..55260cc46142e 100644
--- a/base/linalg/ldlt.jl
+++ b/base/linalg/ldlt.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-immutable LDLt{T,S<:AbstractMatrix} <: Factorization{T}
+struct LDLt{T,S<:AbstractMatrix} <: Factorization{T}
data::S
end
diff --git a/base/linalg/lq.jl b/base/linalg/lq.jl
index 8df48e9ddc6ed..a72aded3031b8 100644
--- a/base/linalg/lq.jl
+++ b/base/linalg/lq.jl
@@ -2,13 +2,13 @@
# LQ Factorizations
-immutable LQ{T,S<:AbstractMatrix} <: Factorization{T}
+struct LQ{T,S<:AbstractMatrix} <: Factorization{T}
factors::S
τ::Vector{T}
LQ{T,S}(factors::AbstractMatrix{T}, τ::Vector{T}) where {T,S<:AbstractMatrix} = new(factors, τ)
end
-immutable LQPackedQ{T,S<:AbstractMatrix} <: AbstractMatrix{T}
+struct LQPackedQ{T,S<:AbstractMatrix} <: AbstractMatrix{T}
factors::Matrix{T}
τ::Vector{T}
LQPackedQ{T,S}(factors::AbstractMatrix{T}, τ::Vector{T}) where {T,S<:AbstractMatrix} = new(factors, τ)
diff --git a/base/linalg/lu.jl b/base/linalg/lu.jl
index a53795fdbc1fc..fa3e9d312b1d1 100644
--- a/base/linalg/lu.jl
+++ b/base/linalg/lu.jl
@@ -3,7 +3,7 @@
####################
# LU Factorization #
####################
-immutable LU{T,S<:AbstractMatrix} <: Factorization{T}
+struct LU{T,S<:AbstractMatrix} <: Factorization{T}
factors::S
ipiv::Vector{BlasInt}
info::BlasInt
diff --git a/base/linalg/qr.jl b/base/linalg/qr.jl
index f4fade51b3680..d75abad392910 100644
--- a/base/linalg/qr.jl
+++ b/base/linalg/qr.jl
@@ -2,21 +2,21 @@
# QR and Hessenberg Factorizations
-immutable QR{T,S<:AbstractMatrix} <: Factorization{T}
+struct QR{T,S<:AbstractMatrix} <: Factorization{T}
factors::S
τ::Vector{T}
QR{T,S}(factors::AbstractMatrix{T}, τ::Vector{T}) where {T,S<:AbstractMatrix} = new(factors, τ)
end
QR(factors::AbstractMatrix{T}, τ::Vector{T}) where {T} = QR{T,typeof(factors)}(factors, τ)
# Note. For QRCompactWY factorization without pivoting, the WY representation based method introduced in LAPACK 3.4
-immutable QRCompactWY{S,M<:AbstractMatrix} <: Factorization{S}
+struct QRCompactWY{S,M<:AbstractMatrix} <: Factorization{S}
factors::M
T::Matrix{S}
QRCompactWY{S,M}(factors::AbstractMatrix{S}, T::AbstractMatrix{S}) where {S,M<:AbstractMatrix} = new(factors, T)
end
QRCompactWY(factors::AbstractMatrix{S}, T::AbstractMatrix{S}) where {S} = QRCompactWY{S,typeof(factors)}(factors, T)
-immutable QRPivoted{T,S<:AbstractMatrix} <: Factorization{T}
+struct QRPivoted{T,S<:AbstractMatrix} <: Factorization{T}
factors::S
τ::Vector{T}
jpvt::Vector{BlasInt}
@@ -343,14 +343,14 @@ end
getq(A::QRCompactWY) = QRCompactWYQ(A.factors,A.T)
getq(A::Union{QR, QRPivoted}) = QRPackedQ(A.factors,A.τ)
-immutable QRPackedQ{T,S<:AbstractMatrix} <: AbstractMatrix{T}
+struct QRPackedQ{T,S<:AbstractMatrix} <: AbstractMatrix{T}
factors::S
τ::Vector{T}
QRPackedQ{T,S}(factors::AbstractMatrix{T}, τ::Vector{T}) where {T,S<:AbstractMatrix} = new(factors, τ)
end
QRPackedQ(factors::AbstractMatrix{T}, τ::Vector{T}) where {T} = QRPackedQ{T,typeof(factors)}(factors, τ)
-immutable QRCompactWYQ{S, M<:AbstractMatrix} <: AbstractMatrix{S}
+struct QRCompactWYQ{S, M<:AbstractMatrix} <: AbstractMatrix{S}
factors::M
T::Matrix{S}
QRCompactWYQ{S,M}(factors::AbstractMatrix{S}, T::Matrix{S}) where {S,M<:AbstractMatrix} = new(factors, T)
diff --git a/base/linalg/rowvector.jl b/base/linalg/rowvector.jl
index b8d49eabc077b..3d8ad33b3a051 100644
--- a/base/linalg/rowvector.jl
+++ b/base/linalg/rowvector.jl
@@ -11,7 +11,7 @@ vector can be multiplied by a matrix on its right (such that `v.' * A = (A.' * v
differs from a `1×n`-sized matrix by the facts that its transpose returns a vector and the
inner product `v1.' * v2` returns a scalar, but will otherwise behave similarly.
"""
-immutable RowVector{T,V<:AbstractVector} <: AbstractMatrix{T}
+struct RowVector{T,V<:AbstractVector} <: AbstractMatrix{T}
vec::V
function RowVector{T,V}(v::V) where V<:AbstractVector where T
check_types(T,v)
diff --git a/base/linalg/schur.jl b/base/linalg/schur.jl
index 5d8a41193f21c..15cda0efbf18d 100644
--- a/base/linalg/schur.jl
+++ b/base/linalg/schur.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
# Schur decomposition
-immutable Schur{Ty,S<:AbstractMatrix} <: Factorization{Ty}
+struct Schur{Ty,S<:AbstractMatrix} <: Factorization{Ty}
T::S
Z::S
values::Vector
@@ -139,7 +139,7 @@ either both included or both excluded via `select`.
ordschur{Ty<:BlasFloat}(T::StridedMatrix{Ty}, Z::StridedMatrix{Ty}, select::Union{Vector{Bool},BitVector}) =
ordschur!(copy(T), copy(Z), select)
-immutable GeneralizedSchur{Ty,M<:AbstractMatrix} <: Factorization{Ty}
+struct GeneralizedSchur{Ty,M<:AbstractMatrix} <: Factorization{Ty}
S::M
T::M
alpha::Vector
diff --git a/base/linalg/svd.jl b/base/linalg/svd.jl
index 4c4dca7ce6f35..6854cbe99a19e 100644
--- a/base/linalg/svd.jl
+++ b/base/linalg/svd.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
# Singular Value Decomposition
-immutable SVD{T,Tr,M<:AbstractArray} <: Factorization{T}
+struct SVD{T,Tr,M<:AbstractArray} <: Factorization{T}
U::M
S::Vector{Tr}
Vt::M
@@ -170,7 +170,7 @@ function A_ldiv_B!{Ta,Tb}(A::SVD{Ta}, B::StridedVecOrMat{Tb})
end
# Generalized svd
-immutable GeneralizedSVD{T,S} <: Factorization{T}
+struct GeneralizedSVD{T,S} <: Factorization{T}
U::S
V::S
Q::S
diff --git a/base/linalg/symmetric.jl b/base/linalg/symmetric.jl
index 51edfa0e3757a..1b7b7c6317a07 100644
--- a/base/linalg/symmetric.jl
+++ b/base/linalg/symmetric.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
#Symmetric and Hermitian matrices
-immutable Symmetric{T,S<:AbstractMatrix} <: AbstractMatrix{T}
+struct Symmetric{T,S<:AbstractMatrix} <: AbstractMatrix{T}
data::S
uplo::Char
end
@@ -41,7 +41,7 @@ julia> Slower = Symmetric(A, :L)
Note that `Supper` will not be equal to `Slower` unless `A` is itself symmetric (e.g. if `A == A.'`).
"""
Symmetric(A::AbstractMatrix, uplo::Symbol=:U) = (checksquare(A);Symmetric{eltype(A),typeof(A)}(A, char_uplo(uplo)))
-immutable Hermitian{T,S<:AbstractMatrix} <: AbstractMatrix{T}
+struct Hermitian{T,S<:AbstractMatrix} <: AbstractMatrix{T}
data::S
uplo::Char
end
diff --git a/base/linalg/triangular.jl b/base/linalg/triangular.jl
index 10446edbe908a..45208cd4a822c 100644
--- a/base/linalg/triangular.jl
+++ b/base/linalg/triangular.jl
@@ -3,13 +3,13 @@
## Triangular
# could be renamed to Triangular when that name has been fully deprecated
-abstract AbstractTriangular{T,S<:AbstractMatrix} <: AbstractMatrix{T}
+abstract type AbstractTriangular{T,S<:AbstractMatrix} <: AbstractMatrix{T} end
# First loop through all methods that don't need special care for upper/lower and unit diagonal
for t in (:LowerTriangular, :UnitLowerTriangular, :UpperTriangular,
:UnitUpperTriangular)
@eval begin
- immutable $t{T,S<:AbstractMatrix} <: AbstractTriangular{T,S}
+ struct $t{T,S<:AbstractMatrix} <: AbstractTriangular{T,S}
data::S
end
$t(A::$t) = A
diff --git a/base/linalg/tridiag.jl b/base/linalg/tridiag.jl
index bb00136bc8cb2..9662501d0942d 100644
--- a/base/linalg/tridiag.jl
+++ b/base/linalg/tridiag.jl
@@ -3,7 +3,7 @@
#### Specialized matrix types ####
## (complex) symmetric tridiagonal matrices
-immutable SymTridiagonal{T} <: AbstractMatrix{T}
+struct SymTridiagonal{T} <: AbstractMatrix{T}
dv::Vector{T} # diagonal
ev::Vector{T} # subdiagonal
function SymTridiagonal{T}(dv::Vector{T}, ev::Vector{T}) where T
@@ -294,7 +294,7 @@ end
###################
#Needed for inv_usmani()
-type ZeroOffsetVector
+mutable struct ZeroOffsetVector
data::Vector
end
getindex( a::ZeroOffsetVector, i) = a.data[i+1]
@@ -385,7 +385,7 @@ function setindex!(A::SymTridiagonal, x, i::Integer, j::Integer)
end
## Tridiagonal matrices ##
-immutable Tridiagonal{T} <: AbstractMatrix{T}
+struct Tridiagonal{T} <: AbstractMatrix{T}
dl::Vector{T} # sub-diagonal
d::Vector{T} # diagonal
du::Vector{T} # sup-diagonal
diff --git a/base/linalg/uniformscaling.jl b/base/linalg/uniformscaling.jl
index bad9ddff58a5b..be0a4f92562e4 100644
--- a/base/linalg/uniformscaling.jl
+++ b/base/linalg/uniformscaling.jl
@@ -4,7 +4,7 @@ import Base: copy, ctranspose, getindex, show, transpose, one, zero, inv,
@_pure_meta, hcat, vcat, hvcat
import Base.LinAlg: SingularException
-immutable UniformScaling{T<:Number}
+struct UniformScaling{T<:Number}
λ::T
end
diff --git a/base/loading.jl b/base/loading.jl
index 0e62463bc738b..aa746cdb01820 100644
--- a/base/loading.jl
+++ b/base/loading.jl
@@ -277,7 +277,7 @@ end
# We throw PrecompilableError(true) when a module wants to be precompiled but isn't,
# and PrecompilableError(false) when a module doesn't want to be precompiled but is
-immutable PrecompilableError <: Exception
+struct PrecompilableError <: Exception
isprecompilable::Bool
end
function show(io::IO, ex::PrecompilableError)
diff --git a/base/lock.jl b/base/lock.jl
index e0bd86dfeff81..00d0fb9a93d95 100644
--- a/base/lock.jl
+++ b/base/lock.jl
@@ -10,7 +10,7 @@ Each `lock` must be matched with an `unlock`.
This lock is NOT threadsafe. See `Threads.Mutex` for a threadsafe lock.
"""
-type ReentrantLock
+mutable struct ReentrantLock
locked_by::Nullable{Task}
cond_wait::Condition
reentrancy_cnt::Int
@@ -124,7 +124,7 @@ Each acquire must be mached with a release.
This construct is NOT threadsafe.
"""
-type Semaphore
+mutable struct Semaphore
sem_size::Int
curr_cnt::Int
cond_wait::Condition
diff --git a/base/locks.jl b/base/locks.jl
index 5f699c3f7507c..7ece049fe989b 100644
--- a/base/locks.jl
+++ b/base/locks.jl
@@ -17,7 +17,7 @@ Abstract supertype describing types that
implement the thread-safe synchronization primitives:
`lock`, `trylock`, `unlock`, and `islocked`
"""
-abstract AbstractLock
+abstract type AbstractLock end
# Test-and-test-and-set spin locks are quickest up to about 30ish
# contending threads. If you have more contention than that, perhaps
@@ -27,7 +27,7 @@ abstract AbstractLock
See SpinLock.
"""
-immutable TatasLock <: AbstractLock
+struct TatasLock <: AbstractLock
handle::Atomic{Int}
TatasLock() = new(Atomic{Int}(0))
end
@@ -86,7 +86,7 @@ end
See RecursiveSpinLock.
"""
-immutable RecursiveTatasLock <: AbstractLock
+struct RecursiveTatasLock <: AbstractLock
ownertid::Atomic{Int16}
handle::Atomic{Int}
RecursiveTatasLock() = new(Atomic{Int16}(0), Atomic{Int}(0))
@@ -179,7 +179,7 @@ on pthreads, this is a `pthread_mutex_t`.
See also SpinLock for a lighter-weight lock.
"""
-type Mutex <: AbstractLock
+mutable struct Mutex <: AbstractLock
ownertid::Int16
handle::Ptr{Void}
function Mutex()
diff --git a/base/markdown/Common/block.jl b/base/markdown/Common/block.jl
index 9a8aed8de78f6..0594ffe48fabc 100644
--- a/base/markdown/Common/block.jl
+++ b/base/markdown/Common/block.jl
@@ -4,7 +4,7 @@
# Paragraphs
# ––––––––––
-type Paragraph
+mutable struct Paragraph
content
end
@@ -40,7 +40,7 @@ end
# Headers
# –––––––
-type Header{level}
+mutable struct Header{level}
text
end
@@ -96,7 +96,7 @@ end
# Code
# ––––
-type Code
+mutable struct Code
language::String
code::String
end
@@ -125,7 +125,7 @@ end
# Footnote
# --------
-type Footnote
+mutable struct Footnote
id::String
text
end
@@ -160,7 +160,7 @@ end
# Quotes
# ––––––
-type BlockQuote
+mutable struct BlockQuote
content
end
@@ -189,7 +189,7 @@ end
# Admonitions
# -----------
-type Admonition
+mutable struct Admonition
category::String
title::String
content::Vector
@@ -247,7 +247,7 @@ end
# Lists
# –––––
-type List
+mutable struct List
items::Vector{Any}
ordered::Int # `-1` is unordered, `>= 0` is ordered.
@@ -332,7 +332,7 @@ pushitem!(list, buffer) = push!(list.items, parse(String(take!(buffer))).content
# HorizontalRule
# ––––––––––––––
-type HorizontalRule
+mutable struct HorizontalRule
end
function horizontalrule(stream::IO, block::MD)
diff --git a/base/markdown/Common/inline.jl b/base/markdown/Common/inline.jl
index 46f94264d4761..1ef1171a9f647 100644
--- a/base/markdown/Common/inline.jl
+++ b/base/markdown/Common/inline.jl
@@ -4,7 +4,7 @@
# Emphasis
# ––––––––
-type Italic
+mutable struct Italic
text
end
@@ -14,7 +14,7 @@ function asterisk_italic(stream::IO, md::MD)
return result === nothing ? nothing : Italic(parseinline(result, md))
end
-type Bold
+mutable struct Bold
text
end
@@ -54,7 +54,7 @@ end
# Images & Links
# ––––––––––––––
-type Image
+mutable struct Image
url::String
alt::String
end
@@ -73,7 +73,7 @@ function image(stream::IO, md::MD)
end
end
-type Link
+mutable struct Link
text
url::String
end
@@ -147,7 +147,7 @@ end
# Punctuation
# –––––––––––
-type LineBreak end
+mutable struct LineBreak end
@trigger '\\' ->
function linebreak(stream::IO, md::MD)
diff --git a/base/markdown/GitHub/table.jl b/base/markdown/GitHub/table.jl
index 04485669dc936..dc31fad954143 100644
--- a/base/markdown/GitHub/table.jl
+++ b/base/markdown/GitHub/table.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-type Table
+mutable struct Table
rows::Vector{Vector{Any}}
align::Vector{Symbol}
end
diff --git a/base/markdown/IPython/IPython.jl b/base/markdown/IPython/IPython.jl
index 47d564b2df21d..1cceb3e616d4d 100644
--- a/base/markdown/IPython/IPython.jl
+++ b/base/markdown/IPython/IPython.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-type LaTeX
+mutable struct LaTeX
formula::String
end
diff --git a/base/markdown/parse/config.jl b/base/markdown/parse/config.jl
index d004a82009bdd..eba41283e5377 100644
--- a/base/markdown/parse/config.jl
+++ b/base/markdown/parse/config.jl
@@ -2,7 +2,7 @@
typealias InnerConfig Dict{Char, Vector{Function}}
-type Config
+mutable struct Config
breaking::Vector{Function}
regular::Vector{Function}
inner::InnerConfig
diff --git a/base/markdown/parse/parse.jl b/base/markdown/parse/parse.jl
index 0b22c8306e8ea..c061ee6d10ee8 100644
--- a/base/markdown/parse/parse.jl
+++ b/base/markdown/parse/parse.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-type MD
+mutable struct MD
content::Vector{Any}
meta::Dict{Any, Any}
diff --git a/base/mmap.jl b/base/mmap.jl
index 96ba008e1d6e7..e9402b39442de 100644
--- a/base/mmap.jl
+++ b/base/mmap.jl
@@ -5,7 +5,7 @@ module Mmap
const PAGESIZE = Int(is_unix() ? ccall(:jl_getpagesize, Clong, ()) : ccall(:jl_getallocationgranularity, Clong, ()))
# for mmaps not backed by files
-type Anonymous <: IO
+mutable struct Anonymous <: IO
name::AbstractString
readonly::Bool
create::Bool
diff --git a/base/mpfr.jl b/base/mpfr.jl
index 024860ef1ef39..214367a811616 100644
--- a/base/mpfr.jl
+++ b/base/mpfr.jl
@@ -61,7 +61,7 @@ julia> big"2.1"
2.099999999999999999999999999999999999999999999999999999999999999999999999999986
```
"""
-type BigFloat <: AbstractFloat
+mutable struct BigFloat <: AbstractFloat
prec::Clong
sign::Cint
exp::Clong
diff --git a/base/multidimensional.jl b/base/multidimensional.jl
index b99e4002f1132..a074afbc70ff7 100644
--- a/base/multidimensional.jl
+++ b/base/multidimensional.jl
@@ -13,7 +13,7 @@ module IteratorsMD
export CartesianIndex, CartesianRange
# CartesianIndex
- immutable CartesianIndex{N} <: AbstractCartesianIndex{N}
+ struct CartesianIndex{N} <: AbstractCartesianIndex{N}
I::NTuple{N,Int}
CartesianIndex{N}(index::NTuple{N,Integer}) where {N} = new(index)
end
@@ -77,7 +77,7 @@ module IteratorsMD
icmp(a, b) = ifelse(isless(a,b), 1, ifelse(a==b, 0, -1))
# Iteration
- immutable CartesianRange{I<:CartesianIndex}
+ struct CartesianRange{I<:CartesianIndex}
start::I
stop::I
end
@@ -273,7 +273,7 @@ where `mask[I]` is true. This specialized type does not support indexing
directly as doing so would require O(n) lookup time. `AbstractArray{Bool}` are
wrapped with `LogicalIndex` upon calling `to_indices`.
"""
-immutable LogicalIndex{T, A<:AbstractArray{Bool}} <: AbstractVector{T}
+struct LogicalIndex{T, A<:AbstractArray{Bool}} <: AbstractVector{T}
mask::A
sum::Int
LogicalIndex{T,A}(mask::A) where {T,A<:AbstractArray{Bool}} = new(mask, countnz(mask))
@@ -1149,7 +1149,7 @@ end
# TODO: this doesn't fit into the new hashing scheme in any obvious way
-immutable Prehashed
+struct Prehashed
hash::UInt
end
hash(x::Prehashed) = x.hash
diff --git a/base/multimedia.jl b/base/multimedia.jl
index c364dedebef10..377874407ab36 100644
--- a/base/multimedia.jl
+++ b/base/multimedia.jl
@@ -12,7 +12,7 @@ export Display, display, pushdisplay, popdisplay, displayable, redisplay,
# dispatch show and to add conversions for new types.
# defined in sysimg.jl for bootstrapping:
-# immutable MIME{mime} end
+# struct MIME{mime} end
# macro MIME_str(s)
import Base: MIME, @MIME_str
@@ -119,7 +119,7 @@ end
# cannot be displayed. The return value of display(...) is up to the
# Display type.
-abstract Display
+abstract type Display end
# it is convenient to accept strings instead of ::MIME
display(d::Display, mime::AbstractString, x) = display(d, MIME(mime), x)
@@ -145,7 +145,7 @@ Returns a `TextDisplay <: Display`, which displays any object as the text/plain
(by default), writing the text representation to the given I/O stream. (This is how
objects are printed in the Julia REPL.)
"""
-immutable TextDisplay <: Display
+struct TextDisplay <: Display
io::IO
end
display(d::TextDisplay, M::MIME"text/plain", x) = show(d.io, M, x)
diff --git a/base/multinverses.jl b/base/multinverses.jl
index c1a72ec84ecde..765d5a55f0804 100644
--- a/base/multinverses.jl
+++ b/base/multinverses.jl
@@ -13,7 +13,7 @@ unsigned(::Type{Int64}) = UInt64
unsigned(::Type{Int128}) = UInt128
unsigned{T<:Unsigned}(::Type{T}) = T
-abstract MultiplicativeInverse{T}
+abstract type MultiplicativeInverse{T} end
# Computes integer division by a constant using multiply, add, and bitshift.
@@ -43,7 +43,7 @@ abstract MultiplicativeInverse{T}
#
# Further details can be found in Hacker's Delight, Chapter 10.
-immutable SignedMultiplicativeInverse{T<:Signed} <: MultiplicativeInverse{T}
+struct SignedMultiplicativeInverse{T<:Signed} <: MultiplicativeInverse{T}
divisor::T
multiplier::T
addmul::Int8
@@ -88,7 +88,7 @@ immutable SignedMultiplicativeInverse{T<:Signed} <: MultiplicativeInverse{T}
end
SignedMultiplicativeInverse(x::Signed) = SignedMultiplicativeInverse{typeof(x)}(x)
-immutable UnsignedMultiplicativeInverse{T<:Unsigned} <: MultiplicativeInverse{T}
+struct UnsignedMultiplicativeInverse{T<:Unsigned} <: MultiplicativeInverse{T}
divisor::T
multiplier::T
add::Bool
diff --git a/base/nullable.jl b/base/nullable.jl
index f249d1ab712ce..1b301f7c0e396 100644
--- a/base/nullable.jl
+++ b/base/nullable.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-immutable NullException <: Exception
+struct NullException <: Exception
end
"""
diff --git a/base/operators.jl b/base/operators.jl
index ebf140ca0e599..091c3f71feb5c 100644
--- a/base/operators.jl
+++ b/base/operators.jl
@@ -1138,7 +1138,7 @@ ranges with the same indices as those they wrap. This means that indexing into
Slice objects with an integer always returns that exact integer, and they
iterate over all the wrapped indices, even supporting offset indices.
"""
-immutable Slice{T<:AbstractUnitRange} <: AbstractUnitRange{Int}
+struct Slice{T<:AbstractUnitRange} <: AbstractUnitRange{Int}
indices::T
end
indices(S::Slice) = (S.indices,)
@@ -1191,7 +1191,7 @@ end
# Pair
-immutable Pair{A,B}
+struct Pair{A,B}
first::A
second::B
end
diff --git a/base/options.jl b/base/options.jl
index f3ef8d1a7cd24..ac8d7643680d5 100644
--- a/base/options.jl
+++ b/base/options.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
# NOTE: This type needs to be kept in sync with jl_options in src/julia.h
-immutable JLOptions
+struct JLOptions
quiet::Int8
julia_home::Ptr{UInt8}
julia_bin::Ptr{UInt8}
diff --git a/base/ordering.jl b/base/ordering.jl
index c3015f76315f8..7bfd85f8facb6 100644
--- a/base/ordering.jl
+++ b/base/ordering.jl
@@ -11,10 +11,10 @@ export # not exported by Base
DirectOrdering,
lt, ord, ordtype
-abstract Ordering
+abstract type Ordering end
-immutable ForwardOrdering <: Ordering end
-immutable ReverseOrdering{Fwd<:Ordering} <: Ordering
+struct ForwardOrdering <: Ordering end
+struct ReverseOrdering{Fwd<:Ordering} <: Ordering
fwd::Fwd
end
@@ -26,18 +26,18 @@ typealias DirectOrdering Union{ForwardOrdering,ReverseOrdering{ForwardOrdering}}
const Forward = ForwardOrdering()
const Reverse = ReverseOrdering(Forward)
-immutable LexicographicOrdering <: Ordering end
+struct LexicographicOrdering <: Ordering end
const Lexicographic = LexicographicOrdering()
-immutable By{T} <: Ordering
+struct By{T} <: Ordering
by::T
end
-immutable Lt{T} <: Ordering
+struct Lt{T} <: Ordering
lt::T
end
-immutable Perm{O<:Ordering,V<:AbstractVector} <: Ordering
+struct Perm{O<:Ordering,V<:AbstractVector} <: Ordering
order::O
data::V
end
diff --git a/base/parallel/cluster.jl b/base/parallel/cluster.jl
index 847a8270f3979..5225b33edb507 100644
--- a/base/parallel/cluster.jl
+++ b/base/parallel/cluster.jl
@@ -1,8 +1,8 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract ClusterManager
+abstract type ClusterManager end
-type WorkerConfig
+mutable struct WorkerConfig
# Common fields relevant to all cluster managers
io::Nullable{IO}
host::Nullable{AbstractString}
@@ -51,7 +51,7 @@ type WorkerConfig
end
@enum WorkerState W_CREATED W_CONNECTED W_TERMINATING W_TERMINATED
-type Worker
+mutable struct Worker
id::Int
del_msgs::Array{Any,1}
add_msgs::Array{Any,1}
@@ -119,7 +119,7 @@ end
## process group creation ##
-type LocalProcess
+mutable struct LocalProcess
id::Int
bind_addr::AbstractString
bind_port::UInt16
@@ -557,7 +557,7 @@ let next_pid = 2 # 1 is reserved for the client (always)
end
end
-type ProcessGroup
+mutable struct ProcessGroup
name::AbstractString
workers::Array{Any,1}
refs::Dict # global references
@@ -736,7 +736,7 @@ After a client Julia process has exited, further attempts to reference the dead
throw this exception.
"""
ProcessExitedException()
-type ProcessExitedException <: Exception end
+mutable struct ProcessExitedException <: Exception end
worker_from_id(i) = worker_from_id(PGRP, i)
function worker_from_id(pg::ProcessGroup, i)
diff --git a/base/parallel/clusterserialize.jl b/base/parallel/clusterserialize.jl
index 5aed58c648152..f89d7992a5aff 100644
--- a/base/parallel/clusterserialize.jl
+++ b/base/parallel/clusterserialize.jl
@@ -4,7 +4,7 @@ using Base.Serializer: known_object_data, object_number, serialize_cycle, deseri
__deserialized_types__, serialize_typename, deserialize_typename,
TYPENAME_TAG, object_numbers, reset_state, serialize_type
-type ClusterSerializer{I<:IO} <: AbstractSerializer
+mutable struct ClusterSerializer{I<:IO} <: AbstractSerializer
io::I
counter::Int
table::ObjectIdDict
@@ -86,7 +86,7 @@ end
# Send/resend a global object if
# a) has not been sent previously, i.e., we are seeing this object_id for the first time, or,
# b) hash value has changed or
-# c) is a bitstype
+# c) is a bits type
function syms_2b_sent(s::ClusterSerializer, identifier)
lst = Symbol[]
check_syms = get(s.glbs_in_tnobj, identifier, [])
diff --git a/base/parallel/managers.jl b/base/parallel/managers.jl
index c270183c40587..f06d3fa0245ed 100644
--- a/base/parallel/managers.jl
+++ b/base/parallel/managers.jl
@@ -2,7 +2,7 @@
# Built-in SSH and Local Managers
-immutable SSHManager <: ClusterManager
+struct SSHManager <: ClusterManager
machines::Dict
function SSHManager(machines)
@@ -282,7 +282,7 @@ end
# LocalManager
-immutable LocalManager <: ClusterManager
+struct LocalManager <: ClusterManager
np::Integer
restrict::Bool # Restrict binding to 127.0.0.1 only
end
@@ -365,7 +365,7 @@ manage
# DefaultClusterManager for the default TCP transport - used by both SSHManager and LocalManager
-immutable DefaultClusterManager <: ClusterManager
+struct DefaultClusterManager <: ClusterManager
end
const tunnel_hosts_map = Dict{AbstractString, Semaphore}()
diff --git a/base/parallel/messages.jl b/base/parallel/messages.jl
index 39c2d1c49f2b3..dc95b032e2efa 100644
--- a/base/parallel/messages.jl
+++ b/base/parallel/messages.jl
@@ -1,13 +1,13 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract AbstractMsg
+abstract type AbstractMsg end
let REF_ID::Int = 1
global next_ref_id
next_ref_id() = (id = REF_ID; REF_ID += 1; id)
end
-immutable RRID
+struct RRID
whence::Int
id::Int
@@ -26,7 +26,7 @@ hash(r::RRID, h::UInt) = hash(r.whence, hash(r.id, h))
# Message header stored separately from body to be able to send back errors if
# a deserialization error occurs when reading the message body.
-immutable MsgHeader
+struct MsgHeader
response_oid::RRID
notify_oid::RRID
MsgHeader(respond_oid=RRID(0,0), notify_oid=RRID(0,0)) =
@@ -37,41 +37,41 @@ end
# Used instead of Nullable to decrease wire size of header.
null_id(id) = id == RRID(0, 0)
-immutable CallMsg{Mode} <: AbstractMsg
+struct CallMsg{Mode} <: AbstractMsg
f::Function
args::Tuple
kwargs::Array
end
-immutable CallWaitMsg <: AbstractMsg
+struct CallWaitMsg <: AbstractMsg
f::Function
args::Tuple
kwargs::Array
end
-immutable RemoteDoMsg <: AbstractMsg
+struct RemoteDoMsg <: AbstractMsg
f::Function
args::Tuple
kwargs::Array
end
-immutable ResultMsg <: AbstractMsg
+struct ResultMsg <: AbstractMsg
value::Any
end
# Worker initialization messages
-immutable IdentifySocketMsg <: AbstractMsg
+struct IdentifySocketMsg <: AbstractMsg
from_pid::Int
end
-immutable IdentifySocketAckMsg <: AbstractMsg
+struct IdentifySocketAckMsg <: AbstractMsg
end
-immutable JoinPGRPMsg <: AbstractMsg
+struct JoinPGRPMsg <: AbstractMsg
self_pid::Int
other_workers::Array
topology::Symbol
enable_threaded_blas::Bool
end
-immutable JoinCompleteMsg <: AbstractMsg
+struct JoinCompleteMsg <: AbstractMsg
cpu_cores::Int
ospid::Int
end
diff --git a/base/parallel/pmap.jl b/base/parallel/pmap.jl
index 926f4f776549a..9e8c6530796f1 100644
--- a/base/parallel/pmap.jl
+++ b/base/parallel/pmap.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-type BatchProcessingError <: Exception
+mutable struct BatchProcessingError <: Exception
data
ex
end
diff --git a/base/parallel/process_messages.jl b/base/parallel/process_messages.jl
index e0c8cf5f0e7ac..d9bac73f9545e 100644
--- a/base/parallel/process_messages.jl
+++ b/base/parallel/process_messages.jl
@@ -2,7 +2,7 @@
# data stored by the owner of a remote reference
def_rv_channel() = Channel(1)
-type RemoteValue
+mutable struct RemoteValue
c::AbstractChannel
clientset::IntSet # Set of workerids that have a reference to this channel.
# Keeping ids instead of a count aids in cleaning up upon
@@ -16,7 +16,7 @@ end
wait(rv::RemoteValue) = wait(rv.c)
## core messages: do, call, fetch, wait, ref, put! ##
-type RemoteException <: Exception
+mutable struct RemoteException <: Exception
pid::Int
captured::CapturedException
end
diff --git a/base/parallel/remotecall.jl b/base/parallel/remotecall.jl
index 0cbef021603a5..eed3fa2eeba24 100644
--- a/base/parallel/remotecall.jl
+++ b/base/parallel/remotecall.jl
@@ -10,9 +10,9 @@ The `client_refs` lock is also used to synchronize access to `.refs` and associa
"""
const client_refs = WeakKeyDict{Any, Void}() # used as a WeakKeySet
-abstract AbstractRemoteRef
+abstract type AbstractRemoteRef end
-type Future <: AbstractRemoteRef
+mutable struct Future <: AbstractRemoteRef
where::Int
whence::Int
id::Int
@@ -22,7 +22,7 @@ type Future <: AbstractRemoteRef
Future(w::Int, rrid::RRID, v) = (r = new(w,rrid.whence,rrid.id,v); return test_existing_ref(r))
end
-type RemoteChannel{T<:AbstractChannel} <: AbstractRemoteRef
+mutable struct RemoteChannel{T<:AbstractChannel} <: AbstractRemoteRef
where::Int
whence::Int
id::Int
diff --git a/base/parallel/workerpool.jl b/base/parallel/workerpool.jl
index bb390c8b94c7a..2c5f772f706a0 100644
--- a/base/parallel/workerpool.jl
+++ b/base/parallel/workerpool.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract AbstractWorkerPool
+abstract type AbstractWorkerPool end
# An AbstractWorkerPool should implement
#
@@ -15,7 +15,7 @@ abstract AbstractWorkerPool
# workers::Set{Int}
#
-type WorkerPool <: AbstractWorkerPool
+mutable struct WorkerPool <: AbstractWorkerPool
channel::Channel{Int}
workers::Set{Int}
ref::RemoteChannel
@@ -214,7 +214,7 @@ using [`remotecall_fetch`](@ref).
remote(f) = (args...; kwargs...)->remotecall_fetch(f, default_worker_pool(), args...; kwargs...)
remote(p::AbstractWorkerPool, f) = (args...; kwargs...)->remotecall_fetch(f, p, args...; kwargs...)
-type CachingPool <: AbstractWorkerPool
+mutable struct CachingPool <: AbstractWorkerPool
channel::Channel{Int}
workers::Set{Int}
diff --git a/base/permuteddimsarray.jl b/base/permuteddimsarray.jl
index 133ad971871b1..591298551caab 100644
--- a/base/permuteddimsarray.jl
+++ b/base/permuteddimsarray.jl
@@ -5,7 +5,7 @@ module PermutedDimsArrays
export permutedims, PermutedDimsArray
# Some day we will want storage-order-aware iteration, so put perm in the parameters
-immutable PermutedDimsArray{T,N,perm,iperm,AA<:AbstractArray} <: AbstractArray{T,N}
+struct PermutedDimsArray{T,N,perm,iperm,AA<:AbstractArray} <: AbstractArray{T,N}
parent::AA
function PermutedDimsArray{T,N,perm,iperm,AA}(data::AA) where {T,N,perm,iperm,AA<:AbstractArray}
diff --git a/base/pkg/entry.jl b/base/pkg/entry.jl
index 13eb492f1f785..0d53268f96d5a 100644
--- a/base/pkg/entry.jl
+++ b/base/pkg/entry.jl
@@ -732,7 +732,7 @@ function test!(pkg::AbstractString,
isfile(reqs_path) && resolve()
end
-type PkgTestError <: Exception
+mutable struct PkgTestError <: Exception
msg::String
end
diff --git a/base/pkg/pkg.jl b/base/pkg/pkg.jl
index edb3a03a010f9..c5d9836a0b949 100644
--- a/base/pkg/pkg.jl
+++ b/base/pkg/pkg.jl
@@ -9,7 +9,7 @@ export dir, init, rm, add, available, installed, status, clone, checkout,
const DEFAULT_META = "https://github.com/JuliaLang/METADATA.jl"
const META_BRANCH = "metadata-v2"
-type PkgError <: Exception
+mutable struct PkgError <: Exception
msg::AbstractString
ex::Nullable{Exception}
end
diff --git a/base/pkg/reqs.jl b/base/pkg/reqs.jl
index 003b82496e3c9..131cf06a40d7d 100644
--- a/base/pkg/reqs.jl
+++ b/base/pkg/reqs.jl
@@ -8,11 +8,11 @@ using ..Types
# representing lines of REQUIRE files
-abstract Line
-immutable Comment <: Line
+abstract type Line end
+struct Comment <: Line
content::AbstractString
end
-immutable Requirement <: Line
+struct Requirement <: Line
content::AbstractString
package::AbstractString
versions::VersionSet
diff --git a/base/pkg/resolve/fieldvalue.jl b/base/pkg/resolve/fieldvalue.jl
index 701c1a26f252c..20a79b44f9591 100644
--- a/base/pkg/resolve/fieldvalue.jl
+++ b/base/pkg/resolve/fieldvalue.jl
@@ -19,7 +19,7 @@ export FieldValue, Field, validmax, secondmax
# l4 : for favoring dependants over dependencies
# l5 : for symmetry-breaking random noise
#
-immutable FieldValue
+struct FieldValue
l0::Int
l1::VersionWeight
l2::VersionWeight
diff --git a/base/pkg/resolve/interface.jl b/base/pkg/resolve/interface.jl
index a9b8f35ab7313..67eda62e39ddc 100644
--- a/base/pkg/resolve/interface.jl
+++ b/base/pkg/resolve/interface.jl
@@ -9,7 +9,7 @@ export Interface, compute_output_dict, greedysolver,
# A collection of objects which allow interfacing external (Pkg) and
# internal (MaxSum) representation
-type Interface
+mutable struct Interface
# requirements and dependencies, in external representation
reqs::Requires
deps::Dict{String,Dict{VersionNumber,Available}}
diff --git a/base/pkg/resolve/maxsum.jl b/base/pkg/resolve/maxsum.jl
index acc172fc23782..55c02a2925a9c 100644
--- a/base/pkg/resolve/maxsum.jl
+++ b/base/pkg/resolve/maxsum.jl
@@ -10,12 +10,12 @@ export UnsatError, Graph, Messages, maxsum
# An exception type used internally to signal that an unsatisfiable
# constraint was detected
-type UnsatError <: Exception
+mutable struct UnsatError <: Exception
info
end
# Some parameters to drive the decimation process
-type MaxSumParams
+mutable struct MaxSumParams
nondec_iterations # number of initial iterations before starting
# decimation
dec_interval # number of iterations between decimations
@@ -36,7 +36,7 @@ end
# Graph holds the graph structure onto which max-sum is run, in
# sparse format
-type Graph
+mutable struct Graph
# adjacency matrix:
# for each package, has the list of neighbors
# indices (both dependencies and dependants)
@@ -158,7 +158,7 @@ end
# Messages has the cavity messages and the total fields, and
# gets updated iteratively (and occasionally decimated) until
# convergence
-type Messages
+mutable struct Messages
# cavity incoming messages: for each package p0,
# for each neighbor p1 of p0,
# msg[p0][p1] is a vector of length spp[p0]
diff --git a/base/pkg/resolve/versionweight.jl b/base/pkg/resolve/versionweight.jl
index 0593544a05ee6..faa16874d59d1 100644
--- a/base/pkg/resolve/versionweight.jl
+++ b/base/pkg/resolve/versionweight.jl
@@ -6,7 +6,7 @@ importall ....Base.Operators
export VersionWeight
-immutable HierarchicalValue{T}
+struct HierarchicalValue{T}
v::Vector{T}
rest::T
end
@@ -68,7 +68,7 @@ Base.:(==){T}(a::HierarchicalValue{T}, b::HierarchicalValue{T}) = cmp(a,b) == 0
Base.abs{T}(a::HierarchicalValue{T}) = HierarchicalValue(T[abs(x) for x in a.v], abs(a.rest))
-immutable VWPreBuildItem
+struct VWPreBuildItem
nonempty::Int
s::HierarchicalValue{Int}
i::Int
@@ -96,7 +96,7 @@ Base.:(==)(a::VWPreBuildItem, b::VWPreBuildItem) = cmp(a,b) == 0
Base.abs(a::VWPreBuildItem) = VWPreBuildItem(abs(a.nonempty), abs(a.s), abs(a.i))
-immutable VWPreBuild
+struct VWPreBuild
nonempty::Int
w::HierarchicalValue{VWPreBuildItem}
end
@@ -153,7 +153,7 @@ end
# The numeric type used to determine how the different
# versions of a package should be weighed
-immutable VersionWeight
+struct VersionWeight
major::Int
minor::Int
patch::Int
diff --git a/base/pkg/types.jl b/base/pkg/types.jl
index 1c05659f380b4..6ca8a0f389a98 100644
--- a/base/pkg/types.jl
+++ b/base/pkg/types.jl
@@ -6,7 +6,7 @@ export VersionInterval, VersionSet, Requires, Available, Fixed, merge_requires!,
ResolveBacktraceItem, ResolveBacktrace
import Base: show, isempty, in, intersect, union!, union, ==, hash, copy, deepcopy_internal, push!
-immutable VersionInterval
+struct VersionInterval
lower::VersionNumber
upper::VersionNumber
end
@@ -20,7 +20,7 @@ intersect(a::VersionInterval, b::VersionInterval) = VersionInterval(max(a.lower,
==(a::VersionInterval, b::VersionInterval) = a.lower == b.lower && a.upper == b.upper
hash(i::VersionInterval, h::UInt) = hash((i.lower, i.upper), h + (0x0f870a92db508386 % UInt))
-immutable VersionSet
+struct VersionSet
intervals::Vector{VersionInterval}
end
function VersionSet(versions::Vector{VersionNumber})
@@ -121,7 +121,7 @@ end
satisfies(pkg::AbstractString, ver::VersionNumber, reqs::Requires) =
!haskey(reqs, pkg) || in(ver, reqs[pkg])
-immutable Available
+struct Available
sha1::String
requires::Requires
end
@@ -134,7 +134,7 @@ show(io::IO, a::Available) = isempty(a.requires) ?
print(io, "Available(", repr(a.sha1), ")") :
print(io, "Available(", repr(a.sha1), ",", a.requires, ")")
-immutable Fixed
+struct Fixed
version::VersionNumber
requires::Requires
end
diff --git a/base/poll.jl b/base/poll.jl
index 9fa13085bda2d..6cda7fa4ad8ca 100644
--- a/base/poll.jl
+++ b/base/poll.jl
@@ -20,7 +20,7 @@ end
# libuv file watching event flags
const UV_RENAME = 1
const UV_CHANGE = 2
-immutable FileEvent
+struct FileEvent
renamed::Bool
changed::Bool
timedout::Bool
@@ -31,7 +31,7 @@ FileEvent(flags::Integer) = FileEvent((flags & UV_RENAME) != 0,
(flags & FD_TIMEDOUT) != 0)
fetimeout() = FileEvent(false, false, true)
-immutable FDEvent
+struct FDEvent
readable::Bool
writable::Bool
disconnect::Bool
@@ -57,7 +57,7 @@ fdtimeout() = FDEvent(false, false, false, true)
a.disconnect | b.disconnect,
a.timedout | b.timedout)
-type FileMonitor
+mutable struct FileMonitor
handle::Ptr{Void}
file::String
notify::Condition
@@ -76,7 +76,7 @@ type FileMonitor
end
end
-type PollingFileWatcher
+mutable struct PollingFileWatcher
handle::Ptr{Void}
file::String
interval::UInt32
@@ -96,7 +96,7 @@ type PollingFileWatcher
end
end
-type _FDWatcher
+mutable struct _FDWatcher
handle::Ptr{Void}
fdnum::Int # this is NOT the file descriptor
refcount::Tuple{Int, Int}
@@ -195,7 +195,7 @@ type _FDWatcher
end
end
-type FDWatcher
+mutable struct FDWatcher
watcher::_FDWatcher
readable::Bool
writable::Bool
diff --git a/base/process.jl b/base/process.jl
index cb8859cb60183..09f45f466b0dd 100644
--- a/base/process.jl
+++ b/base/process.jl
@@ -1,13 +1,13 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract AbstractCmd
+abstract type AbstractCmd end
# libuv process option flags
const UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = UInt8(1 << 2)
const UV_PROCESS_DETACHED = UInt8(1 << 3)
const UV_PROCESS_WINDOWS_HIDE = UInt8(1 << 4)
-immutable Cmd <: AbstractCmd
+struct Cmd <: AbstractCmd
exec::Vector{String}
ignorestatus::Bool
flags::UInt32 # libuv process flags
@@ -76,19 +76,19 @@ hash(x::Cmd, h::UInt) = hash(x.exec, hash(x.env, hash(x.ignorestatus, hash(x.dir
==(x::Cmd, y::Cmd) = x.exec == y.exec && x.env == y.env && x.ignorestatus == y.ignorestatus &&
x.dir == y.dir && isequal(x.flags, y.flags)
-immutable OrCmds <: AbstractCmd
+struct OrCmds <: AbstractCmd
a::AbstractCmd
b::AbstractCmd
OrCmds(a::AbstractCmd, b::AbstractCmd) = new(a, b)
end
-immutable ErrOrCmds <: AbstractCmd
+struct ErrOrCmds <: AbstractCmd
a::AbstractCmd
b::AbstractCmd
ErrOrCmds(a::AbstractCmd, b::AbstractCmd) = new(a, b)
end
-immutable AndCmds <: AbstractCmd
+struct AndCmds <: AbstractCmd
a::AbstractCmd
b::AbstractCmd
AndCmds(a::AbstractCmd, b::AbstractCmd) = new(a, b)
@@ -137,7 +137,7 @@ const STDIN_NO = 0
const STDOUT_NO = 1
const STDERR_NO = 2
-immutable FileRedirect
+struct FileRedirect
filename::AbstractString
append::Bool
function FileRedirect(filename, append)
@@ -161,7 +161,7 @@ uvtype(x::RawFD) = UV_RAW_FD
typealias Redirectable Union{IO, FileRedirect, RawFD}
typealias StdIOSet NTuple{3, Union{Redirectable, Ptr{Void}}} # XXX: remove Ptr{Void} once libuv is refactored to use upstream release
-immutable CmdRedirect <: AbstractCmd
+struct CmdRedirect <: AbstractCmd
cmd::AbstractCmd
handle::Redirectable
stream_no::Int
@@ -305,7 +305,7 @@ run(pipeline("out.txt", `grep xyz`))
"""
pipeline(a, b, c, d...) = pipeline(pipeline(a,b), c, d...)
-type Process <: AbstractPipe
+mutable struct Process <: AbstractPipe
cmd::Cmd
handle::Ptr{Void}
in::IO
@@ -339,7 +339,7 @@ end
pipe_reader(p::Process) = p.out
pipe_writer(p::Process) = p.in
-immutable ProcessChain <: AbstractPipe
+struct ProcessChain <: AbstractPipe
processes::Vector{Process}
in::Redirectable
out::Redirectable
diff --git a/base/profile.jl b/base/profile.jl
index bda1c761f1b95..325d8693c4151 100644
--- a/base/profile.jl
+++ b/base/profile.jl
@@ -76,7 +76,7 @@ clear() = ccall(:jl_profile_clear_data, Void, ())
typealias LineInfoDict Dict{UInt64, Vector{StackFrame}}
typealias LineInfoFlatDict Dict{UInt64, StackFrame}
-immutable ProfileFormat
+struct ProfileFormat
maxdepth::Int
mincount::Int
noisefloor::Float64
diff --git a/base/random.jl b/base/random.jl
index ed7cd3174567e..1e731d750fee0 100644
--- a/base/random.jl
+++ b/base/random.jl
@@ -19,18 +19,18 @@ export srand,
GLOBAL_RNG, randjump
-abstract AbstractRNG
+abstract type AbstractRNG end
-abstract FloatInterval
-type CloseOpen <: FloatInterval end
-type Close1Open2 <: FloatInterval end
+abstract type FloatInterval end
+mutable struct CloseOpen <: FloatInterval end
+mutable struct Close1Open2 <: FloatInterval end
## RandomDevice
if is_windows()
- immutable RandomDevice <: AbstractRNG
+ struct RandomDevice <: AbstractRNG
buffer::Vector{UInt128}
RandomDevice() = new(Array{UInt128}(1))
@@ -43,7 +43,7 @@ if is_windows()
rand!{T<:Union{Bool, Base.BitInteger}}(rd::RandomDevice, A::Array{T}) = (win32_SystemFunction036!(A); A)
else # !windows
- immutable RandomDevice <: AbstractRNG
+ struct RandomDevice <: AbstractRNG
file::IOStream
unlimited::Bool
@@ -73,7 +73,7 @@ rand(rng::RandomDevice, ::Type{CloseOpen}) = rand(rng, Close1Open2) - 1.0
const MTCacheLength = dsfmt_get_min_array_size()
-type MersenneTwister <: AbstractRNG
+mutable struct MersenneTwister <: AbstractRNG
seed::Vector{UInt32}
state::DSFMT_state
vals::Vector{Float64}
@@ -528,9 +528,9 @@ maxmultiple{T<:Unsigned}(k::T) = (div(typemax(T) - k + oneunit(k), k + (k == 0))
# maximum multiple of k within 1:2^32 or 1:2^64 decremented by one, depending on size
maxmultiplemix(k::UInt64) = if k >> 32 != 0; maxmultiple(k); else (div(0x0000000100000000, k + (k == 0))*k - oneunit(k))::UInt64; end
-abstract RangeGenerator
+abstract type RangeGenerator end
-immutable RangeGeneratorInt{T<:Integer, U<:Unsigned} <: RangeGenerator
+struct RangeGeneratorInt{T<:Integer, U<:Unsigned} <: RangeGenerator
a::T # first element of the range
k::U # range length or zero for full range
u::U # rejection threshold
@@ -561,7 +561,7 @@ for (T, U) in [(UInt8, UInt32), (UInt16, UInt32),
end
if GMP_VERSION.major >= 6
- immutable RangeGeneratorBigInt <: RangeGenerator
+ struct RangeGeneratorBigInt <: RangeGenerator
a::BigInt # first
m::BigInt # range length - 1
nlimbs::Int # number of limbs in generated BigInt's
@@ -569,7 +569,7 @@ if GMP_VERSION.major >= 6
end
else
- immutable RangeGeneratorBigInt <: RangeGenerator
+ struct RangeGeneratorBigInt <: RangeGenerator
a::BigInt # first
m::BigInt # range length - 1
limbs::Vector{Limb} # buffer to be copied into generated BigInt's
@@ -1302,7 +1302,7 @@ end
## random UUID generation
-immutable UUID
+struct UUID
value::UInt128
UUID(u::UInt128) = new(u)
diff --git a/base/range.jl b/base/range.jl
index 6089c32c8e982..e195bf1efbcd6 100644
--- a/base/range.jl
+++ b/base/range.jl
@@ -58,14 +58,14 @@ range(a::AbstractFloat, st::Real, len::Integer) = range(a, float(st), len)
## 1-dimensional ranges ##
-abstract Range{T} <: AbstractArray{T,1}
+abstract type Range{T} <: AbstractArray{T,1} end
## ordinal ranges
-abstract OrdinalRange{T,S} <: Range{T}
-abstract AbstractUnitRange{T} <: OrdinalRange{T,Int}
+abstract type OrdinalRange{T,S} <: Range{T} end
+abstract type AbstractUnitRange{T} <: OrdinalRange{T,Int} end
-immutable StepRange{T,S} <: OrdinalRange{T,S}
+struct StepRange{T,S} <: OrdinalRange{T,S}
start::T
step::S
stop::T
@@ -125,7 +125,7 @@ steprem(start,stop,step) = (stop-start) % step
StepRange(start::T, step::S, stop::T) where {T,S} = StepRange{T,S}(start, step, stop)
-immutable UnitRange{T<:Real} <: AbstractUnitRange{T}
+struct UnitRange{T<:Real} <: AbstractUnitRange{T}
start::T
stop::T
UnitRange{T}(start, stop) where T<:Real = new(start, unitrange_last(start,stop))
@@ -146,7 +146,7 @@ Define an `AbstractUnitRange` that behaves like `1:n`, with the added
distinction that the lower limit is guaranteed (by the type system) to
be 1.
"""
-immutable OneTo{T<:Integer} <: AbstractUnitRange{T}
+struct OneTo{T<:Integer} <: AbstractUnitRange{T}
stop::T
OneTo{T}(stop) where T<:Integer = new(max(zero(T), stop))
end
@@ -164,7 +164,7 @@ value of `r[offset]` for some other index `1 <= offset <= len`. In
conjunction with `TwicePrecision` this can be used to implement ranges
that are free of roundoff error.
"""
-immutable StepRangeLen{T,R,S} <: Range{T}
+struct StepRangeLen{T,R,S} <: Range{T}
ref::R # reference value (might be smallest-magnitude value in the range)
step::S # step value
len::Int # length of the range
@@ -182,7 +182,7 @@ StepRangeLen(ref::R, step::S, len::Integer, offset::Integer = 1) where {R,S} =
## linspace and logspace
-immutable LinSpace{T} <: Range{T}
+struct LinSpace{T} <: Range{T}
start::T
stop::T
len::Int
diff --git a/base/rational.jl b/base/rational.jl
index 6c5df9f117344..5b26062155281 100644
--- a/base/rational.jl
+++ b/base/rational.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-immutable Rational{T<:Integer} <: Real
+struct Rational{T<:Integer} <: Real
num::T
den::T
diff --git a/base/reflection.jl b/base/reflection.jl
index 41c15cee63b7b..087a6ad5e938f 100644
--- a/base/reflection.jl
+++ b/base/reflection.jl
@@ -172,7 +172,7 @@ isconst(m::Module, s::Symbol) =
# return an integer such that object_id(x)==object_id(y) if x===y
object_id(x::ANY) = ccall(:jl_object_id, UInt, (Any,), x)
-immutable DataTypeLayout
+struct DataTypeLayout
nfields::UInt32
alignment::UInt32
# alignment : 28;
@@ -198,7 +198,7 @@ datatype_fielddesc_type(dt::DataType) = dt.layout == C_NULL ? throw(UndefRefErro
"""
isimmutable(v)
-Return `true` iff value `v` is immutable. See [Immutable Composite Types](@ref)
+Return `true` iff value `v` is immutable. See [Mutable Composite Types](@ref)
for a discussion of immutability. Note that this function works on values, so if you give it
a type, it will tell you that a value of `DataType` is mutable.
"""
@@ -250,7 +250,7 @@ end
Determine the upper bound of a type parameter in the underlying type. E.g.:
```jldoctest
-julia> immutable Foo{T<:AbstractFloat, N}
+julia> struct Foo{T<:AbstractFloat, N}
x::Tuple{T, N}
end
@@ -279,7 +279,7 @@ typeseq(a::ANY,b::ANY) = (@_pure_meta; a<:b && b<:a)
fieldoffset(type, i)
The byte offset of field `i` of a type relative to the data start. For example, we could
-use it in the following manner to summarize information about a struct type:
+use it in the following manner to summarize information about a struct:
```jldoctest
julia> structinfo(T) = [(fieldoffset(T,i), fieldname(T,i), fieldtype(T,i)) for i = 1:nfields(T)];
@@ -484,7 +484,7 @@ end
# high-level, more convenient method lookup functions
# type for reflecting and pretty-printing a subset of methods
-type MethodList
+mutable struct MethodList
ms::Array{Method,1}
mt::MethodTable
end
@@ -583,7 +583,7 @@ function uncompressed_ast(m::Method, s::CodeInfo)
end
# this type mirrors jl_cghooks_t (documented in julia.h)
-immutable CodegenHooks
+struct CodegenHooks
module_setup::Ptr{Void}
module_activation::Ptr{Void}
raise_exception::Ptr{Void}
@@ -595,7 +595,7 @@ immutable CodegenHooks
end
# this type mirrors jl_cgparams_t (documented in julia.h)
-immutable CodegenParams
+struct CodegenParams
cached::Cint
runtime::Cint
diff --git a/base/refpointer.jl b/base/refpointer.jl
index e12ebbf284520..8941a83c01c4a 100644
--- a/base/refpointer.jl
+++ b/base/refpointer.jl
@@ -18,11 +18,11 @@ Ref
# instead of Ptr{Cchar} and Ptr{Cwchar_t}, respectively, to enforce
# a check for embedded NUL chars in the string (to avoid silent truncation).
if Int === Int64
- bitstype 64 Cstring
- bitstype 64 Cwstring
+ primitive type Cstring 64 end
+ primitive type Cwstring 64 end
else
- bitstype 32 Cstring
- bitstype 32 Cwstring
+ primitive type Cstring 32 end
+ primitive type Cwstring 32 end
end
### General Methods for Ref{T} type
@@ -35,7 +35,7 @@ unsafe_convert{T}(::Type{Ref{T}}, x) = unsafe_convert(Ptr{T}, x)
### Methods for a Ref object that can store a single value of any type
-type RefValue{T} <: Ref{T}
+mutable struct RefValue{T} <: Ref{T}
x::T
RefValue{T}() where {T} = new()
RefValue{T}(x) where {T} = new(x)
@@ -64,7 +64,7 @@ end
unsafe_convert{T}(::Type{Ptr{Void}}, b::RefValue{T}) = convert(Ptr{Void}, unsafe_convert(Ptr{T}, b))
### Methods for a Ref object that is backed by an array at index i
-immutable RefArray{T, A<:AbstractArray{T}, R} <: Ref{T}
+struct RefArray{T, A<:AbstractArray{T}, R} <: Ref{T}
x::A
i::Int
roots::R # should be either ::Void or ::Any
diff --git a/base/regex.jl b/base/regex.jl
index 16926728d0402..e2161c90874f3 100644
--- a/base/regex.jl
+++ b/base/regex.jl
@@ -7,7 +7,7 @@ include("pcre.jl")
const DEFAULT_COMPILER_OPTS = PCRE.UTF | PCRE.NO_UTF_CHECK | PCRE.ALT_BSUX
const DEFAULT_MATCH_OPTS = PCRE.NO_UTF_CHECK
-type Regex
+mutable struct Regex
pattern::String
compile_options::UInt32
match_options::UInt32
@@ -104,7 +104,7 @@ end
# TODO: map offsets into strings in other encodings back to original indices.
# or maybe it's better to just fail since that would be quite slow
-immutable RegexMatch
+struct RegexMatch
match::SubString{String}
captures::Vector{Union{Void,SubString{String}}}
offset::Int
@@ -226,7 +226,7 @@ search(s::AbstractString, r::Regex, idx::Integer) = throw(ArgumentError(
))
search(s::AbstractString, r::Regex) = search(s,r,start(s))
-immutable SubstitutionString{T<:AbstractString} <: AbstractString
+struct SubstitutionString{T<:AbstractString} <: AbstractString
string::T
end
@@ -309,7 +309,7 @@ function _replace(io, repl_s::SubstitutionString, str, r, re)
end
end
-immutable RegexMatchIterator
+struct RegexMatchIterator
regex::Regex
string::String
overlap::Bool
diff --git a/base/reshapedarray.jl b/base/reshapedarray.jl
index 7f1308a16718c..1f94977c35c9a 100644
--- a/base/reshapedarray.jl
+++ b/base/reshapedarray.jl
@@ -2,7 +2,7 @@
using Base.MultiplicativeInverses: SignedMultiplicativeInverse
-immutable ReshapedArray{T,N,P<:AbstractArray,MI<:Tuple{Vararg{SignedMultiplicativeInverse{Int}}}} <: AbstractArray{T,N}
+struct ReshapedArray{T,N,P<:AbstractArray,MI<:Tuple{Vararg{SignedMultiplicativeInverse{Int}}}} <: AbstractArray{T,N}
parent::P
dims::NTuple{N,Int}
mi::MI
@@ -13,7 +13,7 @@ ReshapedArray{T,N}(parent::AbstractArray{T}, dims::NTuple{N,Int}, mi) = Reshaped
typealias ReshapedArrayLF{T,N,P<:AbstractArray} ReshapedArray{T,N,P,Tuple{}}
# Fast iteration on ReshapedArrays: use the parent iterator
-immutable ReshapedArrayIterator{I,M}
+struct ReshapedArrayIterator{I,M}
iter::I
mi::NTuple{M,SignedMultiplicativeInverse{Int}}
end
@@ -23,7 +23,7 @@ function _rs_iterator{M}(P, mi::NTuple{M})
ReshapedArrayIterator{typeof(iter),M}(iter, mi)
end
-immutable ReshapedIndex{T}
+struct ReshapedIndex{T}
parentindex::T
end
diff --git a/base/rounding.jl b/base/rounding.jl
index 3e9342a781f76..96bad342c2bf3 100644
--- a/base/rounding.jl
+++ b/base/rounding.jl
@@ -41,7 +41,7 @@ Currently supported rounding modes are:
- [`RoundUp`](@ref)
- [`RoundDown`](@ref)
"""
-immutable RoundingMode{T} end
+struct RoundingMode{T} end
"""
RoundNearest
diff --git a/base/serialize.jl b/base/serialize.jl
index ee40289720394..9e8b835e9b5b6 100644
--- a/base/serialize.jl
+++ b/base/serialize.jl
@@ -8,7 +8,7 @@ using Base: ViewIndex, Slice, index_lengths, unwrap_unionall
export serialize, deserialize, SerializationState
-type SerializationState{I<:IO} <: AbstractSerializer
+mutable struct SerializationState{I<:IO} <: AbstractSerializer
io::I
counter::Int
table::ObjectIdDict
@@ -784,7 +784,7 @@ function deserialize_typename(s::AbstractSerializer, number)
types = deserialize(s)::SimpleVector
has_instance = deserialize(s)::Bool
abstr = deserialize(s)::Bool
- mutable = deserialize(s)::Bool
+ mutabl = deserialize(s)::Bool
ninitialized = deserialize(s)::Int32
if makenew
@@ -794,7 +794,7 @@ function deserialize_typename(s::AbstractSerializer, number)
# tn.wrapper and throw UndefRefException before we get to this point
ndt = ccall(:jl_new_datatype, Any, (Any, Any, Any, Any, Any, Cint, Cint, Cint),
tn, super, parameters, names, types,
- abstr, mutable, ninitialized)
+ abstr, mutabl, ninitialized)
tn.wrapper = ndt.name.wrapper
ccall(:jl_set_const, Void, (Any, Any, Any), tn.module, tn.name, tn.wrapper)
ty = tn.wrapper
diff --git a/base/set.jl b/base/set.jl
index c3210bdbed0f6..d2f61c2a0aac2 100644
--- a/base/set.jl
+++ b/base/set.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-type Set{T} <: AbstractSet{T}
+mutable struct Set{T} <: AbstractSet{T}
dict::Dict{T,Void}
Set{T}() where {T} = new(Dict{T,Void}())
diff --git a/base/sharedarray.jl b/base/sharedarray.jl
index 823eb715134f9..c6aeaee945f88 100644
--- a/base/sharedarray.jl
+++ b/base/sharedarray.jl
@@ -2,7 +2,7 @@
import .Serializer: serialize_cycle_header, serialize_type, writetag, UNDEFREF_TAG
-type SharedArray{T,N} <: DenseArray{T,N}
+mutable struct SharedArray{T,N} <: DenseArray{T,N}
dims::NTuple{N,Int}
pids::Vector{Int}
refs::Vector
@@ -32,7 +32,7 @@ end
SharedArray{T}(dims::NTuple; init=false, pids=Int[])
SharedArray{T,N}(...)
-Construct a `SharedArray` of a bitstype `T` and size `dims` across the
+Construct a `SharedArray` of a bits type `T` and size `dims` across the
processes specified by `pids` - all of which have to be on the same
host. If `N` is specified by calling `SharedArray{T,N}(dims)`, then
`N` must match the length of `dims`.
@@ -49,7 +49,7 @@ the participating workers.
SharedArray{T,N}(...)
Construct a `SharedArray` backed by the file `filename`, with element
-type `T` (must be a `bitstype`) and size `dims`, across the processes
+type `T` (must be a bits type) and size `dims`, across the processes
specified by `pids` - all of which have to be on the same host. This
file is mmapped into the host memory, with the following consequences:
diff --git a/base/show.jl b/base/show.jl
index 928bbe53acb35..e0a0d2bb76359 100644
--- a/base/show.jl
+++ b/base/show.jl
@@ -10,7 +10,7 @@ print(io::IO, s::Symbol) = (write(io,s); nothing)
In short, it is an immutable dictionary that is a subclass of `IO`. It supports standard
dictionary operations such as [`getindex`](@ref), and can also be used as an I/O stream.
"""
-immutable IOContext{IO_t <: IO} <: AbstractPipe
+struct IOContext{IO_t <: IO} <: AbstractPipe
io::IO_t
dict::ImmutableDict{Symbol, Any}
@@ -851,12 +851,18 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int)
# type declaration
elseif head === :type && nargs==3
- show_block(io, args[1] ? :type : :immutable, args[2], args[3], indent)
+ show_block(io, args[1] ? Symbol("mutable struct") : Symbol("struct"), args[2], args[3], indent)
print(io, "end")
elseif head === :bitstype && nargs == 2
- print(io, "bitstype ")
+ print(io, "primitive type ")
+ show_list(io, reverse(args), ' ', indent)
+ print(io, " end")
+
+ elseif head === :abstract && nargs == 1
+ print(io, "abstract type ")
show_list(io, args, ' ', indent)
+ print(io, " end")
# empty return (i.e. "function f() return end")
elseif head === :return && nargs == 1 && args[1] === nothing
@@ -876,7 +882,7 @@ function show_unquoted(io::IO, ex::Expr, indent::Int, prec::Int)
elseif (nargs == 0 && head in (:break, :continue))
print(io, head)
- elseif (nargs == 1 && head in (:return, :abstract, :const)) ||
+ elseif (nargs == 1 && head in (:return, :const)) ||
head in (:local, :global, :export)
print(io, head, ' ')
show_list(io, args, ", ", indent)
diff --git a/base/simdloop.jl b/base/simdloop.jl
index e20fe75d994ae..9f1946e35ee15 100644
--- a/base/simdloop.jl
+++ b/base/simdloop.jl
@@ -7,7 +7,7 @@ module SimdLoop
export @simd, simd_outer_range, simd_inner_length, simd_index
# Error thrown from ill-formed uses of @simd
-type SimdError <: Exception
+mutable struct SimdError <: Exception
msg::String
end
diff --git a/base/socket.jl b/base/socket.jl
index b4598efca6d81..fee666b71c0c3 100644
--- a/base/socket.jl
+++ b/base/socket.jl
@@ -1,12 +1,12 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
## IP ADDRESS HANDLING ##
-abstract IPAddr
+abstract type IPAddr end
Base.isless{T<:IPAddr}(a::T, b::T) = isless(a.host, b.host)
Base.convert{T<:Integer}(dt::Type{T}, ip::IPAddr) = dt(ip.host)
-immutable IPv4 <: IPAddr
+struct IPv4 <: IPAddr
host::UInt32
IPv4(host::UInt32) = new(host)
IPv4(a::UInt8,b::UInt8,c::UInt8,d::UInt8) = new(UInt32(a)<<24|
@@ -45,7 +45,7 @@ print(io::IO,ip::IPv4) = print(io,dec((ip.host&(0xFF000000))>>24),".",
dec((ip.host&(0xFF00))>>8),".",
dec(ip.host&0xFF))
-immutable IPv6 <: IPAddr
+struct IPv6 <: IPAddr
host::UInt128
IPv6(host::UInt128) = new(host)
IPv6(a::UInt16,b::UInt16,c::UInt16,d::UInt16,
@@ -236,7 +236,7 @@ macro ip_str(str)
return parse(IPAddr, str)
end
-immutable InetAddr{T<:IPAddr}
+struct InetAddr{T<:IPAddr}
host::T
port::UInt16
end
@@ -245,7 +245,7 @@ InetAddr(ip::IPAddr, port) = InetAddr{typeof(ip)}(ip, port)
## SOCKETS ##
-type TCPSocket <: LibuvStream
+mutable struct TCPSocket <: LibuvStream
handle::Ptr{Void}
status::Int
buffer::IOBuffer
@@ -281,7 +281,7 @@ function TCPSocket()
return tcp
end
-type TCPServer <: LibuvServer
+mutable struct TCPServer <: LibuvServer
handle::Ptr{Void}
status::Int
connectnotify::Condition
@@ -329,7 +329,7 @@ accept(server::PipeServer) = accept(server, init_pipe!(PipeEndpoint();
# UDP
-type UDPSocket <: LibuvStream
+mutable struct UDPSocket <: LibuvStream
handle::Ptr{Void}
status::Int
recvnotify::Condition
@@ -561,7 +561,7 @@ end
##
-type DNSError <: Exception
+mutable struct DNSError <: Exception
host::AbstractString
code::Int32
end
diff --git a/base/sort.jl b/base/sort.jl
index 61bef81914c28..864b37cd525d3 100644
--- a/base/sort.jl
+++ b/base/sort.jl
@@ -206,13 +206,13 @@ end
## sorting algorithms ##
-abstract Algorithm
+abstract type Algorithm end
-immutable InsertionSortAlg <: Algorithm end
-immutable QuickSortAlg <: Algorithm end
-immutable MergeSortAlg <: Algorithm end
+struct InsertionSortAlg <: Algorithm end
+struct QuickSortAlg <: Algorithm end
+struct MergeSortAlg <: Algorithm end
-immutable PartialQuickSort{T <: Union{Int,OrdinalRange}} <: Algorithm
+struct PartialQuickSort{T <: Union{Int,OrdinalRange}} <: Algorithm
k::T
end
@@ -690,8 +690,8 @@ import ...Order: lt, DirectOrdering
typealias Floats Union{Float32,Float64}
-immutable Left <: Ordering end
-immutable Right <: Ordering end
+struct Left <: Ordering end
+struct Right <: Ordering end
left(::DirectOrdering) = Left()
right(::DirectOrdering) = Right()
diff --git a/base/sparse/abstractsparse.jl b/base/sparse/abstractsparse.jl
index 60d70f97cc9f6..ace29a16677f5 100644
--- a/base/sparse/abstractsparse.jl
+++ b/base/sparse/abstractsparse.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract AbstractSparseArray{Tv,Ti,N} <: AbstractArray{Tv,N}
+abstract type AbstractSparseArray{Tv,Ti,N} <: AbstractArray{Tv,N} end
typealias AbstractSparseVector{Tv,Ti} AbstractSparseArray{Tv,Ti,1}
typealias AbstractSparseMatrix{Tv,Ti} AbstractSparseArray{Tv,Ti,2}
diff --git a/base/sparse/cholmod.jl b/base/sparse/cholmod.jl
index e26b07143aafd..0827b4e444788 100644
--- a/base/sparse/cholmod.jl
+++ b/base/sparse/cholmod.jl
@@ -175,7 +175,7 @@ end
# Type definitions #
####################
-abstract SuiteSparseStruct
+abstract type SuiteSparseStruct end
# The three core data types for CHOLMOD: Dense, Sparse and Factor.
# CHOLMOD manages the memory, so the Julia versions only wrap a
@@ -183,7 +183,7 @@ abstract SuiteSparseStruct
# time a pointer is returned from CHOLMOD.
# Dense
-immutable C_Dense{T<:VTypes} <: SuiteSparseStruct
+struct C_Dense{T<:VTypes} <: SuiteSparseStruct
nrow::Csize_t
ncol::Csize_t
nzmax::Csize_t
@@ -194,12 +194,12 @@ immutable C_Dense{T<:VTypes} <: SuiteSparseStruct
dtype::Cint
end
-type Dense{T<:VTypes} <: DenseMatrix{T}
+mutable struct Dense{T<:VTypes} <: DenseMatrix{T}
p::Ptr{C_Dense{T}}
end
# Sparse
-immutable C_Sparse{Tv<:VTypes} <: SuiteSparseStruct
+struct C_Sparse{Tv<:VTypes} <: SuiteSparseStruct
nrow::Csize_t
ncol::Csize_t
nzmax::Csize_t
@@ -219,7 +219,7 @@ end
# Corresponds to the exact definition of cholmod_sparse_struct in the library.
# Useful when reading matrices of unknown type from files as in
# cholmod_read_sparse
-immutable C_SparseVoid <: SuiteSparseStruct
+struct C_SparseVoid <: SuiteSparseStruct
nrow::Csize_t
ncol::Csize_t
nzmax::Csize_t
@@ -236,7 +236,7 @@ immutable C_SparseVoid <: SuiteSparseStruct
packed::Cint
end
-type Sparse{Tv<:VTypes} <: AbstractSparseMatrix{Tv,SuiteSparse_long}
+mutable struct Sparse{Tv<:VTypes} <: AbstractSparseMatrix{Tv,SuiteSparse_long}
p::Ptr{C_Sparse{Tv}}
function Sparse{Tv}(p::Ptr{C_Sparse{Tv}}) where Tv<:VTypes
if p == C_NULL
@@ -251,7 +251,7 @@ Sparse(p::Ptr{C_Sparse{Tv}}) where Tv<:VTypes = Sparse{Tv}(p)
# Factor
if build_version >= v"2.1.0" # CHOLMOD version 2.1.0 or later
- immutable C_Factor{Tv<:VTypes} <: SuiteSparseStruct
+ struct C_Factor{Tv<:VTypes} <: SuiteSparseStruct
n::Csize_t
minor::Csize_t
Perm::Ptr{SuiteSparse_long}
@@ -283,7 +283,7 @@ if build_version >= v"2.1.0" # CHOLMOD version 2.1.0 or later
dtype::Cint
end
else
- immutable C_Factor{Tv<:VTypes} <: SuiteSparseStruct
+ struct C_Factor{Tv<:VTypes} <: SuiteSparseStruct
n::Csize_t
minor::Csize_t
Perm::Ptr{SuiteSparse_long}
@@ -315,7 +315,7 @@ else
end
end
-type Factor{Tv} <: Factorization{Tv}
+mutable struct Factor{Tv} <: Factorization{Tv}
p::Ptr{C_Factor{Tv}}
function Factor{Tv}(p::Ptr{C_Factor{Tv}}) where Tv
if p == C_NULL
@@ -341,7 +341,7 @@ function get{T<:SuiteSparseStruct}(p::Ptr{T})
end
# FactorComponent, for encoding particular factors from a factorization
-type FactorComponent{Tv,S} <: AbstractMatrix{Tv}
+mutable struct FactorComponent{Tv,S} <: AbstractMatrix{Tv}
F::Factor{Tv}
function FactorComponent{Tv,S}(F::Factor{Tv}) where {Tv,S}
diff --git a/base/sparse/cholmod_h.jl b/base/sparse/cholmod_h.jl
index 922b3b772b7cc..7be23f78e4074 100644
--- a/base/sparse/cholmod_h.jl
+++ b/base/sparse/cholmod_h.jl
@@ -70,7 +70,7 @@ end
typealias VTypes Union{Complex128, Float64}
typealias VRealTypes Union{Float64}
-type CHOLMODException <: Exception
+mutable struct CHOLMODException <: Exception
msg::AbstractString
end
diff --git a/base/sparse/higherorderfns.jl b/base/sparse/higherorderfns.jl
index ea947b9336eba..cfe312bb52bbf 100644
--- a/base/sparse/higherorderfns.jl
+++ b/base/sparse/higherorderfns.jl
@@ -1002,7 +1002,7 @@ broadcast{Tf,T}(f::Tf, A::SparseMatrixCSC, ::Type{T}) = broadcast(x -> f(x, T),
# first (Broadcast containertype) dispatch layer's promotion logic
-immutable PromoteToSparse end
+struct PromoteToSparse end
# broadcast containertype definitions for structured matrices
StructuredMatrix = Union{Diagonal,Bidiagonal,Tridiagonal,SymTridiagonal}
diff --git a/base/sparse/sparsematrix.jl b/base/sparse/sparsematrix.jl
index 7ebaae7c0b5fd..f1d74c97ecb7e 100644
--- a/base/sparse/sparsematrix.jl
+++ b/base/sparse/sparsematrix.jl
@@ -5,7 +5,7 @@
# Assumes that row values in rowval for each column are sorted
# issorted(rowval[colptr[i]:(colptr[i+1]-1)]) == true
-immutable SparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrix{Tv,Ti}
+struct SparseMatrixCSC{Tv,Ti<:Integer} <: AbstractSparseMatrix{Tv,Ti}
m::Int # Number of rows
n::Int # Number of columns
colptr::Vector{Ti} # Column i is in colptr[i]:(colptr[i+1]-1)
@@ -3178,7 +3178,7 @@ end
## diag and related using an iterator
-type SpDiagIterator{Tv,Ti}
+mutable struct SpDiagIterator{Tv,Ti}
A::SparseMatrixCSC{Tv,Ti}
n::Int
end
diff --git a/base/sparse/sparsevector.jl b/base/sparse/sparsevector.jl
index f9478910d66f7..593dc1281231b 100644
--- a/base/sparse/sparsevector.jl
+++ b/base/sparse/sparsevector.jl
@@ -9,7 +9,7 @@ import Base.LinAlg: promote_to_array_type, promote_to_arrays_
### Types
-immutable SparseVector{Tv,Ti<:Integer} <: AbstractSparseVector{Tv,Ti}
+struct SparseVector{Tv,Ti<:Integer} <: AbstractSparseVector{Tv,Ti}
n::Int # the number of elements
nzind::Vector{Ti} # the indices of nonzeros
nzval::Vector{Tv} # the values of nonzeros
diff --git a/base/sparse/spqr.jl b/base/sparse/spqr.jl
index 435a87f1dd195..66deb05e5d320 100644
--- a/base/sparse/spqr.jl
+++ b/base/sparse/spqr.jl
@@ -45,12 +45,12 @@ import Base: size
import Base.LinAlg: qrfact
import ..SparseArrays.CHOLMOD: convert, free!
-immutable C_Factorization{Tv<:VTypes} <: SuiteSparseStruct
+struct C_Factorization{Tv<:VTypes} <: SuiteSparseStruct
xtype::Cint
factors::Ptr{Tv}
end
-type Factorization{Tv<:VTypes} <: Base.LinAlg.Factorization{Tv}
+mutable struct Factorization{Tv<:VTypes} <: Base.LinAlg.Factorization{Tv}
m::Int
n::Int
p::Ptr{C_Factorization{Tv}}
diff --git a/base/sparse/umfpack.jl b/base/sparse/umfpack.jl
index 496faf5552d89..f4cc9b4217ea5 100644
--- a/base/sparse/umfpack.jl
+++ b/base/sparse/umfpack.jl
@@ -11,7 +11,7 @@ importall ..SparseArrays
import ..SparseArrays: increment, increment!, decrement, decrement!, nnz
include("umfpack_h.jl")
-type MatrixIllConditionedException <: Exception
+mutable struct MatrixIllConditionedException <: Exception
message::AbstractString
end
@@ -91,7 +91,7 @@ function show_umf_info(level::Real = 2.0)
end
## Should this type be immutable?
-type UmfpackLU{Tv<:UMFVTypes,Ti<:UMFITypes} <: Factorization{Tv}
+mutable struct UmfpackLU{Tv<:UMFVTypes,Ti<:UMFITypes} <: Factorization{Tv}
symbolic::Ptr{Void}
numeric::Ptr{Void}
m::Int
diff --git a/base/special/bessel.jl b/base/special/bessel.jl
index 17e9b905af534..1c3636f8cd796 100644
--- a/base/special/bessel.jl
+++ b/base/special/bessel.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-type AmosException <: Exception
+mutable struct AmosException <: Exception
info::Int32
end
diff --git a/base/special/trig.jl b/base/special/trig.jl
index 291503aec000c..80a0d9073bf61 100644
--- a/base/special/trig.jl
+++ b/base/special/trig.jl
@@ -1,11 +1,11 @@
# This file is a part of Julia. Except for the *_kernel functions (see below),
# license is MIT: http://julialang.org/license
-immutable DoubleFloat64
+struct DoubleFloat64
hi::Float64
lo::Float64
end
-immutable DoubleFloat32
+struct DoubleFloat32
hi::Float64
end
diff --git a/base/stacktraces.jl b/base/stacktraces.jl
index 612f127e55e05..8dc816096008d 100644
--- a/base/stacktraces.jl
+++ b/base/stacktraces.jl
@@ -42,7 +42,7 @@ Stack information representing execution context, with the following fields:
Representation of the pointer to the execution context as returned by `backtrace`.
"""
-immutable StackFrame # this type should be kept platform-agnostic so that profiles can be dumped on one machine and read on another
+struct StackFrame # this type should be kept platform-agnostic so that profiles can be dumped on one machine and read on another
"the name of the function containing the execution context"
func::Symbol
"the path to the file containing the execution context"
diff --git a/base/stat.jl b/base/stat.jl
index 7e102c57fc3b2..d6922fc626572 100644
--- a/base/stat.jl
+++ b/base/stat.jl
@@ -25,7 +25,7 @@ export
stat,
uperm
-immutable StatStruct
+struct StatStruct
device :: UInt
inode :: UInt
mode :: UInt
diff --git a/base/stream.jl b/base/stream.jl
index 80514c305bace..04b05d6bf5e63 100644
--- a/base/stream.jl
+++ b/base/stream.jl
@@ -6,9 +6,9 @@ if is_windows()
end
## types ##
-abstract IOServer
-abstract LibuvServer <: IOServer
-abstract LibuvStream <: IO
+abstract type IOServer end
+abstract type LibuvServer <: IOServer end
+abstract type LibuvStream <: IO end
# IO
# +- AbstractIOBuffer{T<:AbstractArray{UInt8,1}} (not exported)
@@ -99,7 +99,7 @@ function uv_status_string(x)
return "invalid status"
end
-type PipeEndpoint <: LibuvStream
+mutable struct PipeEndpoint <: LibuvStream
handle::Ptr{Void}
status::Int
buffer::IOBuffer
@@ -127,7 +127,7 @@ type PipeEndpoint <: LibuvStream
end
end
-type PipeServer <: LibuvServer
+mutable struct PipeServer <: LibuvServer
handle::Ptr{Void}
status::Int
connectnotify::Condition
@@ -150,7 +150,7 @@ function PipeServer()
return init_pipe!(p; readable=true)
end
-type TTY <: LibuvStream
+mutable struct TTY <: LibuvStream
handle::Ptr{Void}
status::Int
buffer::IOBuffer
@@ -529,7 +529,7 @@ end
# (composed of two half-pipes: .in and .out)
##########################################
-type Pipe <: AbstractPipe
+mutable struct Pipe <: AbstractPipe
in::PipeEndpoint # writable
out::PipeEndpoint # readable
end
@@ -1103,7 +1103,7 @@ reset(x::LibuvStream) = reset(x.buffer)
ismarked(x::LibuvStream) = ismarked(x.buffer)
# BufferStream's are non-OS streams, backed by a regular IOBuffer
-type BufferStream <: LibuvStream
+mutable struct BufferStream <: LibuvStream
buffer::IOBuffer
r_c::Condition
close_c::Condition
diff --git a/base/strings/basic.jl b/base/strings/basic.jl
index 2305ab422950f..48a29d5db0a18 100644
--- a/base/strings/basic.jl
+++ b/base/strings/basic.jl
@@ -310,7 +310,7 @@ function chr2ind(s::AbstractString, i::Integer)
end
end
-immutable EachStringIndex{T<:AbstractString}
+struct EachStringIndex{T<:AbstractString}
s::T
end
eachindex(s::AbstractString) = EachStringIndex(s)
diff --git a/base/strings/errors.jl b/base/strings/errors.jl
index c0ca38ff28db2..8f80e5b1f8c30 100644
--- a/base/strings/errors.jl
+++ b/base/strings/errors.jl
@@ -5,7 +5,7 @@
const UTF_ERR_SHORT = "invalid UTF-8 sequence starting at index <<1>> (0x<<2>> missing one or more continuation bytes)"
const UTF_ERR_INVALID_INDEX = "invalid character index"
-type UnicodeError <: Exception
+mutable struct UnicodeError <: Exception
errmsg::AbstractString ##< A UTF_ERR_ message
errpos::Int32 ##< Position of invalid character
errchr::UInt32 ##< Invalid character
diff --git a/base/strings/types.jl b/base/strings/types.jl
index 5442d14346f78..d3f56d707404a 100644
--- a/base/strings/types.jl
+++ b/base/strings/types.jl
@@ -4,7 +4,7 @@
## substrings reference original strings ##
-immutable SubString{T<:AbstractString} <: AbstractString
+struct SubString{T<:AbstractString} <: AbstractString
string::T
offset::Int
endof::Int
@@ -100,7 +100,7 @@ end
## reversed strings without data movement ##
-immutable RevString{T<:AbstractString} <: AbstractString
+struct RevString{T<:AbstractString} <: AbstractString
string::T
end
diff --git a/base/strings/utf8proc.jl b/base/strings/utf8proc.jl
index 27683d1d4defb..591d0b5793dd8 100644
--- a/base/strings/utf8proc.jl
+++ b/base/strings/utf8proc.jl
@@ -338,7 +338,7 @@ isgraphemebreak(c1::Char, c2::Char) =
isgraphemebreak!(state::Ref{Int32}, c1::Char, c2::Char) =
ccall(:utf8proc_grapheme_break_stateful, Bool, (UInt32, UInt32, Ref{Int32}), c1, c2, state)
-immutable GraphemeIterator{S<:AbstractString}
+struct GraphemeIterator{S<:AbstractString}
s::S # original string (for generation of SubStrings)
end
diff --git a/base/subarray.jl b/base/subarray.jl
index 334f5e59ddcc3..23fab73ddbb1f 100644
--- a/base/subarray.jl
+++ b/base/subarray.jl
@@ -1,11 +1,11 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-abstract AbstractCartesianIndex{N} # This is a hacky forward declaration for CartesianIndex
+abstract type AbstractCartesianIndex{N} end # This is a hacky forward declaration for CartesianIndex
typealias ViewIndex Union{Real, AbstractArray}
typealias ScalarIndex Real
# L is true if the view itself supports fast linear indexing
-immutable SubArray{T,N,P,I,L} <: AbstractArray{T,N}
+struct SubArray{T,N,P,I,L} <: AbstractArray{T,N}
parent::P
indexes::I
offset1::Int # for linear indexing and pointer, only valid when L==true
diff --git a/base/summarysize.jl b/base/summarysize.jl
index 25b7679795e48..174f18f3cf8fc 100644
--- a/base/summarysize.jl
+++ b/base/summarysize.jl
@@ -1,4 +1,4 @@
-immutable SummarySize
+struct SummarySize
seen::ObjectIdDict
frontier_x::Vector{Any}
frontier_i::Vector{Int}
diff --git a/base/sysimg.jl b/base/sysimg.jl
index 4d5fd140c73f8..bddd182a77f34 100644
--- a/base/sysimg.jl
+++ b/base/sysimg.jl
@@ -112,7 +112,7 @@ include("abstractarraymath.jl")
include("arraymath.jl")
# define MIME"foo/bar" early so that we can overload 3-arg show
-immutable MIME{mime} end
+struct MIME{mime} end
macro MIME_str(s)
:(MIME{$(Expr(:quote, Symbol(s)))})
end
diff --git a/base/sysinfo.jl b/base/sysinfo.jl
index d96af3366c5c7..d23f709a140f4 100644
--- a/base/sysinfo.jl
+++ b/base/sysinfo.jl
@@ -67,7 +67,7 @@ function __init__()
global JIT = ccall(:jl_get_JIT, Ref{String}, ())
end
-type UV_cpu_info_t
+mutable struct UV_cpu_info_t
model::Ptr{UInt8}
speed::Int32
cpu_times!user::UInt64
@@ -76,7 +76,7 @@ type UV_cpu_info_t
cpu_times!idle::UInt64
cpu_times!irq::UInt64
end
-type CPUinfo
+mutable struct CPUinfo
model::String
speed::Int32
cpu_times!user::UInt64
diff --git a/base/task.jl b/base/task.jl
index 94901a8754a54..a25bc78cd65b6 100644
--- a/base/task.jl
+++ b/base/task.jl
@@ -3,7 +3,7 @@
## basic task functions and TLS
# Container for a captured exception and its backtrace. Can be serialized.
-type CapturedException <: Exception
+mutable struct CapturedException <: Exception
ex::Any
processed_bt::Vector{Any}
@@ -26,7 +26,7 @@ function showerror(io::IO, ce::CapturedException)
showerror(io, ce.ex, ce.processed_bt, backtrace=true)
end
-type CompositeException <: Exception
+mutable struct CompositeException <: Exception
exceptions::Vector{Any}
CompositeException() = new(Any[])
CompositeException(exceptions) = new(exceptions)
diff --git a/base/test.jl b/base/test.jl
index 23eff2c191f9a..f460b97a73989 100644
--- a/base/test.jl
+++ b/base/test.jl
@@ -52,7 +52,7 @@ end
All tests produce a result object. This object may or may not be
stored, depending on whether the test is part of a test set.
"""
-abstract Result
+abstract type Result end
"""
Pass
@@ -60,7 +60,7 @@ abstract Result
The test condition was true, i.e. the expression evaluated to true or
the correct exception was thrown.
"""
-immutable Pass <: Result
+struct Pass <: Result
test_type::Symbol
orig_expr
data
@@ -87,7 +87,7 @@ end
The test condition was false, i.e. the expression evaluated to false or
the correct exception was not thrown.
"""
-type Fail <: Result
+mutable struct Fail <: Result
test_type::Symbol
orig_expr
data
@@ -119,7 +119,7 @@ it evaluated to something other than a `Bool`.
In the case of `@test_broken` it is used to indicate that an
unexpected `Pass` `Result` occurred.
"""
-type Error <: Result
+mutable struct Error <: Result
test_type::Symbol
orig_expr
value
@@ -159,7 +159,7 @@ end
The test condition is the expected (failed) result of a broken test,
or was explicitly skipped with `@test_skip`.
"""
-type Broken <: Result
+mutable struct Broken <: Result
test_type::Symbol
orig_expr
end
@@ -174,14 +174,14 @@ end
#-----------------------------------------------------------------------
-abstract ExecutionResult
+abstract type ExecutionResult end
-immutable Returned <: ExecutionResult
+struct Returned <: ExecutionResult
value
data
end
-immutable Threw <: ExecutionResult
+struct Threw <: ExecutionResult
exception
backtrace
end
@@ -455,7 +455,7 @@ end
# Called by do_test after a test is evaluated
# finish(AbstractTestSet)
# Called after the test set has been popped from the test set stack
-abstract AbstractTestSet
+abstract type AbstractTestSet end
"""
record(ts::AbstractTestSet, res::Result)
@@ -482,7 +482,7 @@ function finish end
Thrown when a test set finishes and not all tests passed.
"""
-type TestSetException <: Exception
+mutable struct TestSetException <: Exception
pass::Int
fail::Int
error::Int
@@ -509,11 +509,11 @@ end
A simple fallback test set that throws immediately on a failure.
"""
-immutable FallbackTestSet <: AbstractTestSet
+struct FallbackTestSet <: AbstractTestSet
end
fallback_testset = FallbackTestSet()
-type FallbackTestSetException <: Exception
+mutable struct FallbackTestSetException <: Exception
msg::String
end
@@ -540,7 +540,7 @@ If using the DefaultTestSet, the test results will be recorded. If there
are any `Fail`s or `Error`s, an exception will be thrown only at the end,
along with a summary of the test results.
"""
-type DefaultTestSet <: AbstractTestSet
+mutable struct DefaultTestSet <: AbstractTestSet
description::AbstractString
results::Vector
n_passed::Int
@@ -1163,7 +1163,7 @@ The `GenericString` can be used to test generic string APIs that program to
the `AbstractString` interface, in order to ensure that functions can work
with string types besides the standard `String` type.
"""
-immutable GenericString <: AbstractString
+struct GenericString <: AbstractString
string::AbstractString
end
Base.convert(::Type{GenericString}, s::AbstractString) = GenericString(s)
diff --git a/base/traits.jl b/base/traits.jl
index 62bc9ecb4d6da..e22d87d0b4530 100644
--- a/base/traits.jl
+++ b/base/traits.jl
@@ -2,19 +2,19 @@
## numeric/object traits
# trait for objects that have an ordering
-abstract TypeOrder
-immutable HasOrder <: TypeOrder end
-immutable Unordered <: TypeOrder end
+abstract type TypeOrder end
+struct HasOrder <: TypeOrder end
+struct Unordered <: TypeOrder end
(::Type{TypeOrder})(instance) = TypeOrder(typeof(instance))
(::Type{TypeOrder}){T<:Real}(::Type{T}) = HasOrder()
(::Type{TypeOrder}){T}(::Type{T}) = Unordered()
# trait for objects that support arithmetic
-abstract TypeArithmetic
-immutable ArithmeticRounds <: TypeArithmetic end # least significant bits can be lost
-immutable ArithmeticOverflows <: TypeArithmetic end # most significant bits can be lost
-immutable ArithmeticUnknown <: TypeArithmetic end
+abstract type TypeArithmetic end
+struct ArithmeticRounds <: TypeArithmetic end # least significant bits can be lost
+struct ArithmeticOverflows <: TypeArithmetic end # most significant bits can be lost
+struct ArithmeticUnknown <: TypeArithmetic end
(::Type{TypeArithmetic})(instance) = TypeArithmetic(typeof(instance))
(::Type{TypeArithmetic}){T<:AbstractFloat}(::Type{T}) = ArithmeticRounds()
diff --git a/base/twiceprecision.jl b/base/twiceprecision.jl
index 3eea580df5f3c..9f1259e7d25ce 100644
--- a/base/twiceprecision.jl
+++ b/base/twiceprecision.jl
@@ -30,7 +30,7 @@ roundoff error). If `step` has an exact rational representation
where `nb` is the number of trailing zero bits of `step.hi`. For
ranges, you can set `nb = ceil(Int, log2(len-1))`.
"""
-immutable TwicePrecision{T}
+struct TwicePrecision{T}
hi::T # most significant bits
lo::T # least significant bits
end
diff --git a/base/util.jl b/base/util.jl
index d3945fc32df33..f92360bc124ac 100644
--- a/base/util.jl
+++ b/base/util.jl
@@ -14,7 +14,7 @@ Get the time in nanoseconds. The time corresponding to 0 is undefined, and wraps
time_ns() = ccall(:jl_hrtime, UInt64, ())
# This type must be kept in sync with the C struct in src/gc.h
-immutable GC_Num
+struct GC_Num
allocd ::Int64 # GC internal
deferred_alloc::Int64 # GC internal
freed ::Int64 # GC internal
@@ -34,7 +34,7 @@ end
gc_num() = ccall(:jl_gc_num, GC_Num, ())
# This type is to represent differences in the counters, so fields may be negative
-immutable GC_Diff
+struct GC_Diff
allocd ::Int64 # Bytes allocated
malloc ::Int64 # Number of GC aware malloc()
realloc ::Int64 # Number of GC aware realloc()
@@ -670,7 +670,7 @@ end
# Windows authentication prompt
if is_windows()
- immutable CREDUI_INFO
+ struct CREDUI_INFO
cbSize::UInt32
parent::Ptr{Void}
pszMessageText::Ptr{UInt16}
@@ -771,13 +771,13 @@ crc32c(a::Union{Array{UInt8},String}, crc::UInt32=0x00000000) =
@kwdef typedef
This is a helper macro that automatically defines a keyword-based constructor for the type
-declared in the expression `typedef`, which must be a `type` or `immutable`
+declared in the expression `typedef`, which must be a `struct` or `mutable struct`
expression. The default argument is supplied by declaring fields of the form `field::T =
default`. If no default is provided then the default is provided by the `kwdef_val(T)`
function.
```julia
-@kwdef immutable Foo
+@kwdef struct Foo
a::Cint # implied default Cint(0)
b::Cint = 1 # specified default
z::Cstring # implied default Cstring(C_NULL)
diff --git a/base/version.jl b/base/version.jl
index 9d7bf3a8198f0..956763ce27344 100644
--- a/base/version.jl
+++ b/base/version.jl
@@ -2,7 +2,7 @@
## semantic version numbers (http://semver.org)
-immutable VersionNumber
+struct VersionNumber
major::Int
minor::Int
patch::Int
diff --git a/base/version_git.sh b/base/version_git.sh
index 110ef86ee0d9b..35f54e92bf177 100644
--- a/base/version_git.sh
+++ b/base/version_git.sh
@@ -4,7 +4,7 @@
# This file collects git info and create a julia file with the GIT_VERSION_INFO struct
echo "# This file was autogenerated in base/version_git.sh"
-echo "immutable GitVersionInfo"
+echo "struct GitVersionInfo"
echo " commit::AbstractString"
echo " commit_short::AbstractString"
echo " branch::AbstractString"
diff --git a/base/weakkeydict.jl b/base/weakkeydict.jl
index ea28c9805f0ba..a20be01394a26 100644
--- a/base/weakkeydict.jl
+++ b/base/weakkeydict.jl
@@ -9,7 +9,7 @@ referenced in a hash table.
See [`Dict`](@ref) for further help.
"""
-type WeakKeyDict{K,V} <: Associative{K,V}
+mutable struct WeakKeyDict{K,V} <: Associative{K,V}
ht::Dict{WeakRef,V}
lock::Threads.RecursiveSpinLock
finalizer::Function
diff --git a/contrib/Julia_Notepad++.xml b/contrib/Julia_Notepad++.xml
index fe0f0a0f27c3f..2d548197bd9de 100644
--- a/contrib/Julia_Notepad++.xml
+++ b/contrib/Julia_Notepad++.xml
@@ -26,7 +26,7 @@
true false C_NULL Inf NaN Inf32 NaN32 nothing
AbstractArray AbstractMatrix AbstractRemoteRef AbstractSparseMatrix AbstractString AbstractVector Any ArgumentError Array Associative BigFloat BigInt BitArray BitMatrix BitVector Bool BunchKaufman Cchar Cdouble Cfloat Char CharString CholeskyDense CholeskyPivotedDense Cint Cintmax_t Clong Clonglong Colon Complex Complex128 Complex64 ComplexPair Cptrdiff_t Cshort Csize_t Cuchar Cuint Cuintmax_t Culong Culonglong Cushort DArray Dict Dims DisconnectException EOFError EachLine EnvHash ErrorException Exception Expr Factorization Filter Float Float32 Float64 Function GSVDDense IO IOBuffer IOStream ImaginaryUnit InsertionSort Int Int128 Int16 Int32 Int64 Int8 IntSet Integer KeyError LDLTTridiagonal LUDense LUTridiagonal LoadError LocalProcess Matrix MergeSort MethodError NTuple Number ObjectIdDict ObjectIdDict OrdinalRange ParseError PipeBuffer ProcessGroup Ptr QRDense QRPivotedDense QuickSort Range Range1 RangeIndex Ranges Rational Real Regex RegexMatch RegexMatchIterator RepString RevString Reverse SVDDense Set Signed SparseMatrixCSC SpawnNullStream Stat StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubDArray SubOrDArray SubString SymTridiagonal Symbol SystemError Task TCPSocket TimSort Tridiagonal Tuple Type TypeError UInt UInt128 UInt16 UInt32 UInt64 UInt8 UVError Union Unsigned VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef Zip
- abstract begin baremodule bitstype break catch ccall const continue do else elseif end export finally for function global if immutable import importall let local macro module quote return try type typealias using while
+ abstract begin baremodule primitive break catch ccall const continue do else elseif end export finally for function global if struct import importall let local macro module quote return try mutable typealias using while
close enumerate error info open print println read write warn
print println
diff --git a/contrib/ctags b/contrib/ctags
index 9b0977a0e627f..b5a431a99f45d 100644
--- a/contrib/ctags
+++ b/contrib/ctags
@@ -1,4 +1,4 @@
--langdef=julia
--langmap=julia:.jl
---regex-julia=/^[ \t]*(function|macro|abstract|type|typealias|immutable)[ \t]+([^ \t({[]+).*$/\2/f,function/
+--regex-julia=/^[ \t]*(function|macro|abstract type|primitive type|struct|mutable struct|typealias)[ \t]+([^ \t({[]+).*$/\2/f,function/
--regex-julia=/^[ \t]*(([^@#$ \t({[]+)|\(([^@#$ \t({[]+)\)|\((\$)\))[ \t]*(\{.*\})?[ \t]*\([^#]*\)[ \t]*=([^=].*$|$)/\2\3\4/f,function/
diff --git a/contrib/julia.hrc b/contrib/julia.hrc
index 4ab36ca633ee4..5162fc0447b13 100644
--- a/contrib/julia.hrc
+++ b/contrib/julia.hrc
@@ -34,8 +34,8 @@
-
-
+
+
@@ -85,11 +85,11 @@
-
+
-
+
@@ -97,7 +97,7 @@
-
+
@@ -105,7 +105,7 @@
-
+
diff --git a/contrib/julia.lang b/contrib/julia.lang
index 7427ed635d4c6..95fed9c9c0fd5 100644
--- a/contrib/julia.lang
+++ b/contrib/julia.lang
@@ -154,11 +154,11 @@
in
function
if
- immutable
+ struct
let
quote
try
- type
+ mutable type
while
catch
finally
@@ -166,8 +166,8 @@
elseif
end
- abstract
- bitstype
+ abstract type
+ primitive type
break
ccall
const
diff --git a/contrib/julia.xml b/contrib/julia.xml
index 578d6e4650ba5..978dc6e0b726e 100644
--- a/contrib/julia.xml
+++ b/contrib/julia.xml
@@ -38,11 +38,11 @@
- for
- function
- if
- - immutable
+ - struct
- let
- quote
- try
- - type
+ - mutable struct
- while
@@ -55,8 +55,8 @@
- end
- - abstract
- - bitstype
+ - abstract type
+ - primitive type
- break
- ccall
- const
diff --git a/doc/src/manual/calling-c-and-fortran-code.md b/doc/src/manual/calling-c-and-fortran-code.md
index 2ca50b7c996b5..bae4528bd693a 100644
--- a/doc/src/manual/calling-c-and-fortran-code.md
+++ b/doc/src/manual/calling-c-and-fortran-code.md
@@ -264,15 +264,15 @@ First, a review of some relevant Julia type terminology:
| Syntax / Keyword | Example | Description |
|:----------------------------- |:------------------------------------------- |:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| `type` | `String` | "Leaf Type" :: A group of related data that includes a type-tag, is managed by the Julia GC, and is defined by object-identity. The type parameters of a leaf type must be fully defined (no `TypeVars` are allowed) in order for the instance to be constructed. |
-| `abstract` | `Any`, `AbstractArray{T, N}`, `Complex{T}` | "Super Type" :: A super-type (not a leaf-type) that cannot be instantiated, but can be used to describe a group of types. |
-| `{T}` | `Vector{Int}` | "Type Parameter" :: A specialization of a type (typically used for dispatch or storage optimization). |
+| `mutable struct` | `String` | "Leaf Type" :: A group of related data that includes a type-tag, is managed by the Julia GC, and is defined by object-identity. The type parameters of a leaf type must be fully defined (no `TypeVars` are allowed) in order for the instance to be constructed. |
+| `abstract type` | `Any`, `AbstractArray{T, N}`, `Complex{T}` | "Super Type" :: A super-type (not a leaf-type) that cannot be instantiated, but can be used to describe a group of types. |
+| `T{A}` | `Vector{Int}` | "Type Parameter" :: A specialization of a type (typically used for dispatch or storage optimization). |
| | | "TypeVar" :: The `T` in the type parameter declaration is referred to as a TypeVar (short for type variable). |
-| `bitstype` | `Int`, `Float64` | "Bits Type" :: A type with no fields, but a size. It is stored and defined by-value. |
-| `immutable` | `Pair{Int, Int}` | "Immutable" :: A type with all fields defined to be constant. It is defined by-value. And may be stored with a type-tag. |
-| | `Complex128` (`isbits`) | "Is-Bits" :: A `bitstype`, or an `immutable` type where all fields are other `isbits` types. It is defined by-value, and is stored without a type-tag. |
-| `type ...; end` | `nothing` | "Singleton" :: a Leaf Type or Immutable with no fields. |
-| `(...)` or `tuple(...)` | `(1, 2, 3)` | "Tuple" :: an immutable data-structure similar to an anonymous immutable type, or a constant array. Represented as either an array or a struct. |
+| `primitive type` | `Int`, `Float64` | "Primitive Type" :: A type with no fields, but a size. It is stored and defined by-value. |
+| `struct` | `Pair{Int, Int}` | "Struct" :: A type with all fields defined to be constant. It is defined by-value. And may be stored with a type-tag. |
+| | `Complex128` (`isbits`) | "Is-Bits" :: A `primitive type`, or a `struct` type where all fields are other `isbits` types. It is defined by-value, and is stored without a type-tag. |
+| `struct ...; end` | `nothing` | "Singleton" :: a Leaf Type or Struct with no fields. |
+| `(...)` or `tuple(...)` | `(1, 2, 3)` | "Tuple" :: an immutable data-structure similar to an anonymous struct type, or a constant array. Represented as either an array or a struct. |
| `typealias` | Not applicable here | Type aliases, and other similar mechanisms of doing type indirection, are resolved to their base type (this includes assigning a type to another name, or getting the type out of a function call). |
### Bits Types:
@@ -427,13 +427,13 @@ checks and is only meant to improve readability of the call.
### Struct Type correspondences
Composite types, aka `struct` in C or `TYPE` in Fortran90 (or `STRUCTURE` / `RECORD` in some variants
-of F77), can be mirrored in Julia by creating a `type` or `immutable` definition with the same
+of F77), can be mirrored in Julia by creating a `struct` definition with the same
field layout.
When used recursively, `isbits` types are stored inline. All other types are stored as a pointer
to the data. When mirroring a struct used by-value inside another struct in C, it is imperative
that you do not attempt to manually copy the fields over, as this will not preserve the correct
-field alignment. Instead, declare an immutable `isbits` type and use that instead. Unnamed structs
+field alignment. Instead, declare an `isbits` struct type and use that instead. Unnamed structs
are not possible in the translation to Julia.
Packed structs and union declarations are not supported by Julia.
@@ -491,7 +491,7 @@ the static parameters of the function are considered to be part of this static e
The static parameters of the function may be used as type parameters in the `ccall` signature,
as long as they don't affect the layout of the type.
For example, `f{T}(x::T) = ccall(:valid, Ptr{T}, (Ptr{T},), x)`
-is valid, since `Ptr` is always a word-size bitstype.
+is valid, since `Ptr` is always a word-size primitive type.
But, `g{T}(x::T) = ccall(:notvalid, T, (T,), x)`
is not valid, since the type layout of `T` is not known statically.
@@ -504,7 +504,7 @@ Julia type is a homogeneous tuple of `VecElement` that naturally maps to the SIM
> * The tuple must be the same size as the SIMD type. For example, a tuple representing an `__m128`
> on x86 must have a size of 16 bytes.
-> * The element type of the tuple must be an instance of `VecElement{T}` where `T` is a bitstype that
+> * The element type of the tuple must be an instance of `VecElement{T}` where `T` is a primitive type that
> is 1, 2, 4 or 8 bytes.
For instance, consider this C routine that uses AVX intrinsics:
@@ -554,7 +554,7 @@ pointers, `Ref{T}` should generally be used for the types of input arguments, al
of pointers to memory managed by either Julia or C through the implicit call to [`Base.cconvert()`](@ref).
In contrast, pointers returned by the C function called should be declared to be of output type
`Ptr{T}`, reflecting that the memory pointed to is managed by C only. Pointers contained in C
-structs should be represented as fields of type `Ptr{T}` within the corresponding Julia immutable
+structs should be represented as fields of type `Ptr{T}` within the corresponding Julia struct
types designed to mimic the internal structure of corresponding C structs.
In Julia code wrapping calls to external Fortran routines, all input arguments should be declared
@@ -691,7 +691,7 @@ end
The meaning of prefix `&` is not quite the same as in C. In particular, any changes to the referenced
variables will not be visible in Julia unless the type is mutable (declared via `type`). However,
-even for immutable types it will not cause any harm for called functions to attempt such modifications
+even for immutable structs it will not cause any harm for called functions to attempt such modifications
(that is, writing through the passed pointers). Moreover, `&` may be used with any expression,
such as `&0` or `&f(x)`.
@@ -937,12 +937,12 @@ back to a Julia object reference by [`unsafe_pointer_to_objref(ptr)`](@ref). (Ju
can be converted to `jl_value_t*` pointers, as `Ptr{Void}`, by calling [`pointer_from_objref(v)`](@ref).)
The reverse operation (writing data to a `Ptr{T}`), can be performed using [`unsafe_store!(ptr, value, [index])`](@ref).
- Currently, this is only supported for bitstypes or other pointer-free (`isbits`) immutable types.
+Currently, this is only supported for primitive types or other pointer-free (`isbits`) immutable struct types.
Any operation that throws an error is probably currently unimplemented and should be posted as
a bug so that it can be resolved.
-If the pointer of interest is a plain-data array (bitstype or immutable), the function [`unsafe_wrap(Array, ptr,dims,[own])`](@ref)
+If the pointer of interest is a plain-data array (primitive type or immutable struct), the function [`unsafe_wrap(Array, ptr,dims,[own])`](@ref)
may be more useful. The final parameter should be true if Julia should "take ownership" of the
underlying buffer and call `free(ptr)` when the returned `Array` object is finalized. If the
`own` parameter is omitted or false, the caller must ensure the buffer remains in existence until
diff --git a/doc/src/manual/constructors.md b/doc/src/manual/constructors.md
index 6aa899cf50085..1ad1743a4c4ab 100644
--- a/doc/src/manual/constructors.md
+++ b/doc/src/manual/constructors.md
@@ -6,7 +6,7 @@ when applied to an argument tuple as a function. This much was already mentioned
composite types were introduced. For example:
```jldoctest footype
-julia> type Foo
+julia> struct Foo
bar
baz
end
@@ -88,7 +88,7 @@ the constraint that the first number is not greater than the second one. One cou
like this:
```jldoctest pairtype
-julia> type OrderedPair
+julia> struct OrderedPair
x::Real
y::Real
OrderedPair(x,y) = x > y ? error("out of order") : new(x,y)
@@ -108,18 +108,15 @@ Stacktrace:
[1] OrderedPair(::Int64, ::Int64) at ./none:4
```
-You can still reach in and directly change the field values to violate this invariant, but messing
-around with an object's internals uninvited is considered poor form. You (or someone else) can
-also provide additional outer constructor methods at any later point, but once a type is declared,
-there is no way to add more inner constructor methods. Since outer constructor methods can only
-create objects by calling other constructor methods, ultimately, some inner constructor must be
-called to create an object. This guarantees that all objects of the declared type must come into
+If the type were declared `mutable`, you could reach in and directly change the field values to
+violate this invariant, but messing around with an object's internals uninvited is considered poor form.
+You (or someone else) can also provide additional outer constructor methods at any later point, but
+once a type is declared, there is no way to add more inner constructor methods. Since outer constructor
+methods can only create objects by calling other constructor methods, ultimately, some inner constructor
+must be called to create an object. This guarantees that all objects of the declared type must come into
existence by a call to one of the inner constructor methods provided with the type, thereby giving
some degree of enforcement of a type's invariants.
-Of course, if the type is declared as `immutable`, then its constructor-provided invariants are
-fully enforced. This is an important consideration when deciding whether a type should be immutable.
-
If any inner constructor method is defined, no default constructor method is provided: it is presumed
that you have supplied yourself with all the inner constructors you need. The default constructor
is equivalent to writing your own inner constructor method that takes all of the object's fields
@@ -127,7 +124,7 @@ as parameters (constrained to be of the correct type, if the corresponding field
and passes them to `new`, returning the resulting object:
```jldoctest
-julia> type Foo
+julia> struct Foo
bar
baz
Foo(bar,baz) = new(bar,baz)
@@ -140,11 +137,11 @@ inner constructor method. The following two types are equivalent -- one with a d
the other with an explicit constructor:
```jldoctest
-julia> type T1
+julia> struct T1
x::Int64
end
-julia> type T2
+julia> struct T2
x::Int64
T2(x) = new(x)
end
@@ -175,7 +172,7 @@ or more generally, recursive data structures. Since the fundamental difficulty m
obvious, let us briefly explain it. Consider the following recursive type declaration:
```jldoctest selfrefer
-julia> type SelfReferential
+julia> mutable struct SelfReferential
obj::SelfReferential
end
@@ -201,7 +198,7 @@ at defining the `SelfReferential` type, with a zero-argument inner constructor r
having `obj` fields pointing to themselves:
```jldoctest selfrefer2
-julia> type SelfReferential
+julia> mutable struct SelfReferential
obj::SelfReferential
SelfReferential() = (x = new(); x.obj = x)
end
@@ -227,7 +224,7 @@ Although it is generally a good idea to return a fully initialized object from a
incompletely initialized objects can be returned:
```jldoctest incomplete
-julia> type Incomplete
+julia> mutable struct Incomplete
xx
Incomplete() = new()
end
@@ -245,12 +242,12 @@ ERROR: UndefRefError: access to undefined reference
This avoids the need to continually check for `null` values. However, not all object fields are
references. Julia considers some types to be "plain data", meaning all of their data is self-contained
-and does not reference other objects. The plain data types consist of bits types (e.g. `Int`)
+and does not reference other objects. The plain data types consist of primitive types (e.g. `Int`)
and immutable structs of other plain data types. The initial contents of a plain data type is
undefined:
```julia
-julia> type HasPlain
+julia> struct HasPlain
n::Int
HasPlain() = new()
end
@@ -264,7 +261,7 @@ Arrays of plain data types exhibit the same behavior.
You can pass incomplete objects to other functions from inner constructors to delegate their completion:
```jldoctest
-julia> type Lazy
+julia> mutable struct Lazy
xx
Lazy(v) = complete_me(new(), v)
end
@@ -282,7 +279,7 @@ given type parameters or with type parameters implied by the types of the argume
constructor. Here are some examples:
```jldoctest parametric
-julia> type Point{T<:Real}
+julia> struct Point{T<:Real}
x::T
y::T
end
@@ -331,7 +328,7 @@ outer `Point` constructor that takes pairs of real arguments, which must be of t
This automatic provision of constructors is equivalent to the following explicit declaration:
```jldoctest parametric2
-julia> type Point{T<:Real}
+julia> struct Point{T<:Real}
x::T
y::T
Point{T}(x,y) where T<:Real = new(x,y)
@@ -416,7 +413,7 @@ parametric composite type and its constructor methods. To that end, here is the
which implements Julia's [Rational Numbers](@ref):
```jldoctest rational
-julia> immutable OurRational{T<:Integer} <: Real
+julia> struct OurRational{T<:Integer} <: Real
num::T
den::T
function OurRational{T}(num::T, den::T) where T<:Integer
@@ -462,7 +459,7 @@ julia> function //(x::Complex, y::Complex)
// (generic function with 6 methods)
```
-The first line -- `immutable OurRational{T<:Integer} <: Real` -- declares that `OurRational` takes one
+The first line -- `struct OurRational{T<:Integer} <: Real` -- declares that `OurRational` takes one
type parameter of an integer type, and is itself a real type. The field declarations `num::T`
and `den::T` indicate that the data held in a `OurRational{T}` object are a pair of integers of type
`T`, one representing the rational value's numerator and the other representing its denominator.
@@ -546,7 +543,7 @@ For example, say we define a type that stores a vector along with an accurate re
its sum:
```jldoctest
-julia> type SummedArray{T<:Number,S<:Number}
+julia> struct SummedArray{T<:Number,S<:Number}
data::Vector{T}
sum::S
end
@@ -562,7 +559,7 @@ Therefore we want to avoid an interface that allows the user to construct instan
but inside the `type` definition block to suppress generation of default constructors:
```jldoctest
-julia> type SummedArray{T<:Number,S<:Number}
+julia> struct SummedArray{T<:Number,S<:Number}
data::Vector{T}
sum::S
function SummedArray(a::Vector{T}) where T
diff --git a/doc/src/manual/control-flow.md b/doc/src/manual/control-flow.md
index eec97d5df6d06..7d43f557c948e 100644
--- a/doc/src/manual/control-flow.md
+++ b/doc/src/manual/control-flow.md
@@ -577,7 +577,7 @@ Stacktrace:
You may define your own exceptions in the following way:
```jldoctest
-julia> type MyCustomException <: Exception end
+julia> struct MyCustomException <: Exception end
```
### The [`throw()`](@ref) function
@@ -621,7 +621,7 @@ This mechanism can be implemented easily by custom exception types following the
is written:
```jldoctest
-julia> type MyUndefVarError <: Exception
+julia> struct MyUndefVarError <: Exception
var::Symbol
end
diff --git a/doc/src/manual/documentation.md b/doc/src/manual/documentation.md
index a14a1e1e3bc06..bbf8adc2fcc78 100644
--- a/doc/src/manual/documentation.md
+++ b/doc/src/manual/documentation.md
@@ -359,15 +359,15 @@ Adds docstring `"..."` to the macro named `@m`.
```
"..."
-abstract T1
+abstract type T1 end
"..."
-type T2
+mutable struct T2
...
end
"..."
-immutable T3
+struct T3
...
end
```
@@ -376,7 +376,7 @@ Adds the docstring `"..."` to types `T1`, `T2`, and `T3`.
```julia
"..."
-type T
+struct T
"x"
x
"y"
@@ -385,7 +385,7 @@ end
```
Adds docstring `"..."` to type `T`, `"x"` to field `T.x` and `"y"` to field `T.y`. Also applicable
-to `immutable` types.
+to `mutable struct` types.
```julia
"..."
diff --git a/doc/src/manual/faq.md b/doc/src/manual/faq.md
index f20ed7204ca5e..23dd41e4e1721 100644
--- a/doc/src/manual/faq.md
+++ b/doc/src/manual/faq.md
@@ -12,7 +12,7 @@ If memory usage is your concern, you can always replace objects with ones that c
with `A = 0`. The memory will be released the next time the garbage collector runs; you can force
this to happen with [`gc()`](@ref).
-### How can I modify the declaration of a type/immutable in my session?
+### How can I modify the declaration of a type in my session?
Perhaps you've defined a type and then realize you need to add a new field. If you try this at
the REPL, you get the error:
@@ -610,7 +610,7 @@ that, rather than storing the result in the same location in memory as `x`, it a
array to store the result.
While this behavior might surprise some, the choice is deliberate. The main reason is the presence
-of `immutable` objects within Julia, which cannot change their value once created. Indeed, a
+of immutable objects within Julia, which cannot change their value once created. Indeed, a
number is an immutable object; the statements `x = 5; x += 1` do not modify the meaning of `5`,
they modify the value bound to `x`. For an immutable, the only way to change the value is to reassign
it.
diff --git a/doc/src/manual/interfaces.md b/doc/src/manual/interfaces.md
index f639a7802847d..04d4f550a5c66 100644
--- a/doc/src/manual/interfaces.md
+++ b/doc/src/manual/interfaces.md
@@ -61,7 +61,7 @@ end
A simple example is an iterable sequence of square numbers with a defined length:
```jldoctest squaretype
-julia> immutable Squares
+julia> struct Squares
count::Int
end
@@ -238,7 +238,7 @@ Returning to the sequence of squares from above, we could instead define it as a
`AbstractArray{Int, 1}`:
```jldoctest squarevectype
-julia> immutable SquaresVector <: AbstractArray{Int, 1}
+julia> struct SquaresVector <: AbstractArray{Int, 1}
count::Int
end
@@ -283,7 +283,7 @@ As a more complicated example, let's define our own toy N-dimensional sparse-lik
on top of [`Dict`](@ref):
```jldoctest squarevectype
-julia> immutable SparseArray{T,N} <: AbstractArray{T,N}
+julia> struct SparseArray{T,N} <: AbstractArray{T,N}
data::Dict{NTuple{N,Int}, T}
dims::NTuple{N,Int}
end
diff --git a/doc/src/manual/methods.md b/doc/src/manual/methods.md
index 42dd84f5c9fc1..1f6c9cc8c0062 100644
--- a/doc/src/manual/methods.md
+++ b/doc/src/manual/methods.md
@@ -590,7 +590,7 @@ For example, you can define a type that stores the coefficients of a polynomial,
a function evaluating the polynomial:
```jldoctest polynomial
-julia> immutable Polynomial{R}
+julia> struct Polynomial{R}
coeffs::Vector{R}
end
diff --git a/doc/src/manual/parallel-computing.md b/doc/src/manual/parallel-computing.md
index c9731bc61e38b..70c7619f5460a 100644
--- a/doc/src/manual/parallel-computing.md
+++ b/doc/src/manual/parallel-computing.md
@@ -1029,7 +1029,7 @@ As an example let us see how the `LocalManager`, the manager responsible for sta
on the same host, is implemented:
```
-immutable LocalManager <: ClusterManager
+struct LocalManager <: ClusterManager
np::Integer
end
diff --git a/doc/src/manual/performance-tips.md b/doc/src/manual/performance-tips.md
index 4cdd7ac568bc4..8dbc3912ee5b0 100644
--- a/doc/src/manual/performance-tips.md
+++ b/doc/src/manual/performance-tips.md
@@ -162,7 +162,7 @@ specific instances where declarations are helpful.
Types can be declared without specifying the types of their fields:
```jldoctest myambig
-julia> type MyAmbiguousType
+julia> struct MyAmbiguousType
a
end
```
@@ -196,7 +196,7 @@ You can do better by declaring the type of `a`. Here, we are focused on the case
be any one of several types, in which case the natural solution is to use parameters. For example:
```jldoctest myambig2
-julia> type MyType{T<:AbstractFloat}
+julia> mutable struct MyType{T<:AbstractFloat}
a::T
end
```
@@ -204,7 +204,7 @@ julia> type MyType{T<:AbstractFloat}
This is a better choice than
```jldoctest myambig2
-julia> type MyStillAmbiguousType
+julia> mutable struct MyStillAmbiguousType
a::AbstractFloat
end
```
@@ -296,11 +296,11 @@ to resolve the type at run-time. This results in shorter and faster code.
The same best practices also work for container types:
```jldoctest containers
-julia> type MySimpleContainer{A<:AbstractVector}
+julia> mutable struct MySimpleContainer{A<:AbstractVector}
a::A
end
-julia> type MyAmbiguousContainer{T}
+julia> mutable struct MyAmbiguousContainer{T}
a::AbstractVector{T}
end
```
@@ -372,7 +372,7 @@ or other abstract types. To prevent such tedium, you can use two parameters in t
of `MyContainer`:
```jldoctest containers2
-julia> type MyContainer{T, A<:AbstractVector}
+julia> mutable struct MyContainer{T, A<:AbstractVector}
a::A
end
@@ -439,7 +439,7 @@ MyContainer{Int64,UnitRange{Float64}}
To prevent this, we can add an inner constructor:
```jldoctest containers3
-julia> type MyBetterContainer{T<:Real, A<:AbstractVector}
+julia> mutable struct MyBetterContainer{T<:Real, A<:AbstractVector}
a::A
MyBetterContainer(v::AbstractVector{T}) = new(v)
end
@@ -731,7 +731,7 @@ and try to use it for everything. For example, you might imagine using it to sto
e.g.
```
-immutable Car{Make,Model}
+struct Car{Make,Model}
year::Int
...more fields...
end
diff --git a/doc/src/manual/strings.md b/doc/src/manual/strings.md
index f04f55b65f594..a1231da2fa912 100644
--- a/doc/src/manual/strings.md
+++ b/doc/src/manual/strings.md
@@ -29,7 +29,7 @@ There are a few noteworthy high-level features about Julia's strings:
a string argument, you should declare the type as `AbstractString` in order to accept any string
type.
* Like C and Java, but unlike most dynamic languages, Julia has a first-class type representing
- a single character, called `Char`. This is just a special kind of 32-bit bitstype whose numeric
+ a single character, called `Char`. This is just a special kind of 32-bit primitive type whose numeric
value represents a Unicode code point.
* As in Java, strings are immutable: the value of an `AbstractString` object cannot be changed.
To construct a different string value, you construct a new string from parts of other strings.
@@ -41,7 +41,7 @@ There are a few noteworthy high-level features about Julia's strings:
## [Characters](@id man-characters)
-A `Char` value represents a single character: it is just a 32-bit bitstype with a special literal
+A `Char` value represents a single character: it is just a 32-bit primitive type with a special literal
representation and appropriate arithmetic behaviors, whose numeric value is interpreted as a
[Unicode code point](https://en.wikipedia.org/wiki/Code_point). Here is how `Char` values are
input and shown:
diff --git a/doc/src/manual/style-guide.md b/doc/src/manual/style-guide.md
index e4063f58e2f3b..2b0b0fc09dba7 100644
--- a/doc/src/manual/style-guide.md
+++ b/doc/src/manual/style-guide.md
@@ -154,7 +154,7 @@ uses (e.g. `a[i]::Int`) than to try to pack many alternatives into one type.
## Use naming conventions consistent with Julia's `base/`
- * modules and type names use capitalization and camel case: `module SparseArrays`, `immutable UnitRange`.
+ * modules and type names use capitalization and camel case: `module SparseArrays`, `struct UnitRange`.
* functions are lowercase ([`maximum()`](@ref), [`convert()`](@ref)) and, when readable, with multiple
words squashed together ([`isequal()`](@ref), [`haskey()`](@ref)). When necessary, use underscores
as word separators. Underscores are also used to indicate a combination of concepts ([`remotecall_fetch()`](@ref)
@@ -225,7 +225,7 @@ it.
The preferred style is to use instances by default, and only add methods involving `Type{MyType}`
later if they become necessary to solve some problem.
-If a type is effectively an enumeration, it should be defined as a single (ideally `immutable`)
+If a type is effectively an enumeration, it should be defined as a single (ideally immutable struct or primitive)
type, with the enumeration values being instances of it. Constructors and conversions can check
whether values are valid. This design is preferred over making the enumeration an abstract type,
with the "values" as subtypes.
diff --git a/doc/src/manual/types.md b/doc/src/manual/types.md
index 86abb5ebe1d3c..0659db24d0e44 100644
--- a/doc/src/manual/types.md
+++ b/doc/src/manual/types.md
@@ -146,12 +146,12 @@ of a hierarchy of types, providing a context into which concrete types can fit.
for example, to easily program to any type that is an integer, without restricting an algorithm
to a specific type of integer.
-Abstract types are declared using the `abstract` keyword. The general syntaxes for declaring an
+Abstract types are declared using the `abstract type` keyword. The general syntaxes for declaring an
abstract type are:
```
-abstract «name»
-abstract «name» <: «supertype»
+abstract type «name» end
+abstract type «name» <: «supertype» end
```
The `abstract` keyword introduces a new abstract type, whose name is given by `«name»`. This
@@ -167,12 +167,12 @@ opposite of `Any`: no object is an instance of `Union{}` and all types are super
Let's consider some of the abstract types that make up Julia's numerical hierarchy:
```julia
-abstract Number
-abstract Real <: Number
-abstract AbstractFloat <: Real
-abstract Integer <: Real
-abstract Signed <: Integer
-abstract Unsigned <: Integer
+abstract type Number end
+abstract type Real <: Number end
+abstract type AbstractFloat <: Real end
+abstract type Integer <: Real end
+abstract type Signed <: Integer end
+abstract type Unsigned <: Integer end
```
The `Number` type is a direct child type of `Any`, and `Real` is its child. In turn, `Real` has
@@ -231,42 +231,42 @@ a function whose arguments are abstract types, because it is recompiled for each
concrete types with which it is invoked. (There may be a performance issue, however, in the case
of function arguments that are containers of abstract types; see [Performance Tips](@ref man-performance-tips).)
-## Bits Types
+## Primitive Types
-A bits type is a concrete type whose data consists of plain old bits. Classic examples of bits
+A primitive type is a concrete type whose data consists of plain old bits. Classic examples of primitive
types are integers and floating-point values. Unlike most languages, Julia lets you declare your
-own bits types, rather than providing only a fixed set of built-in bits types. In fact, the standard
-bits types are all defined in the language itself:
+own primitive types, rather than providing only a fixed set of built-in ones. In fact, the standard
+primitive types are all defined in the language itself:
```julia
-bitstype 16 Float16 <: AbstractFloat
-bitstype 32 Float32 <: AbstractFloat
-bitstype 64 Float64 <: AbstractFloat
+primitive type Float16 <: AbstractFloat 16 end
+primitive type Float32 <: AbstractFloat 32 end
+primitive type Float64 <: AbstractFloat 64 end
-bitstype 8 Bool <: Integer
-bitstype 32 Char
+primitive type Bool <: Integer 8 end
+primitive type Char 32 end
-bitstype 8 Int8 <: Signed
-bitstype 8 UInt8 <: Unsigned
-bitstype 16 Int16 <: Signed
-bitstype 16 UInt16 <: Unsigned
-bitstype 32 Int32 <: Signed
-bitstype 32 UInt32 <: Unsigned
-bitstype 64 Int64 <: Signed
-bitstype 64 UInt64 <: Unsigned
-bitstype 128 Int128 <: Signed
-bitstype 128 UInt128 <: Unsigned
+primitive type Int8 <: Signed 8 end
+primitive type UInt8 <: Unsigned 8 end
+primitive type Int16 <: Signed 16 end
+primitive type UInt16 <: Unsigned 16 end
+primitive type Int32 <: Signed 32 end
+primitive type UInt32 <: Unsigned 32 end
+primitive type Int64 <: Signed 64 end
+primitive type UInt64 <: Unsigned 64 end
+primitive type Int128 <: Signed 128 end
+primitive type UInt128 <: Unsigned 128 end
```
-The general syntaxes for declaration of a `bitstype` are:
+The general syntaxes for declaring a primitive type are:
```
-bitstype «bits» «name»
-bitstype «bits» «name» <: «supertype»
+primitive type «name» «bits» end
+primitive type «name» <: «supertype» «bits» end
```
The number of bits indicates how much storage the type requires and the name gives the new type
-a name. A bits type can optionally be declared to be a subtype of some supertype. If a supertype
+a name. A primitive type can optionally be declared to be a subtype of some supertype. If a supertype
is omitted, then the type defaults to having `Any` as its immediate supertype. The declaration
of `Bool` above therefore means that a boolean value takes eight bits to store, and has `Integer`
as its immediate supertype. Currently, only sizes that are multiples of 8 bits are supported.
@@ -284,8 +284,8 @@ be impossible to make `Bool` behave any differently than `Int8` or `UInt8`.
## Composite Types
-[Composite types](https://en.wikipedia.org/wiki/Composite_data_type) are called records, structures
-(`struct`s in C), or objects in various languages. A composite type is a collection of named fields,
+[Composite types](https://en.wikipedia.org/wiki/Composite_data_type) are called records, structs,
+or objects in various languages. A composite type is a collection of named fields,
an instance of which can be treated as a single value. In many languages, composite types are
the only kind of user-definable type, and they are by far the most commonly used user-defined
type in Julia as well.
@@ -304,12 +304,11 @@ for more information on methods and dispatch). Thus, it would be inappropriate f
named bags of methods "inside" each object ends up being a highly beneficial aspect of the language
design.
-Since composite types are the most common form of user-defined concrete type, they are simply
-introduced with the `type` keyword followed by a block of field names, optionally annotated with
-types using the `::` operator:
+Composite types are introduced with the `struct` keyword followed by a block of field names, optionally
+annotated with types using the `::` operator:
```jldoctest footype
-julia> type Foo
+julia> struct Foo
bar
baz::Int
qux::Float64
@@ -318,7 +317,7 @@ julia> type Foo
Fields with no type annotation default to `Any`, and can accordingly hold any type of value.
-New objects of composite type `Foo` are created by applying the `Foo` type object like a function
+New objects of type `Foo` are created by applying the `Foo` type object like a function
to values for its fields:
```jldoctest footype
@@ -369,20 +368,25 @@ julia> foo.qux
1.5
```
-You can also change the values as one would expect:
+Composite objects declared with `struct` are *immutable*; they cannot be modified
+after construction. This may seem odd at first, but it has several advantages:
-```jldoctest footype
-julia> foo.qux = 2
-2
+ * It can be more efficient. Some structs can be packed efficiently into arrays, and in some cases the
+ compiler is able to avoid allocating immutable objects entirely.
+ * It is not possible to violate the invariants provided by the type's constructors.
+ * Code using immutable objects can be easier to reason about.
-julia> foo.bar = 1//2
-1//2
-```
+An immutable object might contain mutable objects, such as arrays, as fields. Those contained
+objects will remain mutable; only the fields of the immutable object itself cannot be changed
+to point to different objects.
+
+Where required, mutable composite objects can be declared with the keyword `mutable struct`, to be
+discussed in the next section.
Composite types with no fields are singletons; there can be only one instance of such types:
```jldoctest
-julia> type NoFields
+julia> struct NoFields
end
julia> NoFields() === NoFields()
@@ -396,34 +400,33 @@ There is much more to say about how instances of composite types are created, bu
depends on both [Parametric Types](@ref) and on [Methods](@ref), and is sufficiently important
to be addressed in its own section: [Constructors](@ref man-constructors).
-## Immutable Composite Types
+## Mutable Composite Types
-It is also possible to define *immutable* composite types by using the keyword `immutable` instead
-of `type`:
+If a composite type is declared with `mutable struct` instead of `struct`, then instances of
+it can be modified:
-```julia
-immutable Complex
- real::Float64
- imag::Float64
-end
-```
+```jldoctest bartype
+julia> mutable struct Bar
+ baz
+ qux::Float64
+ end
-Such types behave much like other composite types, except that instances of them cannot be modified.
-Immutable types have several advantages:
+julia> bar = Bar("Hello", 1.5);
- * They are more efficient in some cases. Types like the `Complex` example above can be packed efficiently
- into arrays, and in some cases the compiler is able to avoid allocating immutable objects entirely.
- * It is not possible to violate the invariants provided by the type's constructors.
- * Code using immutable objects can be easier to reason about.
+julia> bar.qux = 2.0
+2.0
-An immutable object might contain mutable objects, such as arrays, as fields. Those contained
-objects will remain mutable; only the fields of the immutable object itself cannot be changed
-to point to different objects.
+julia> bar.baz = 1//2
+1//2
+```
-A useful way to think about immutable composites is that each instance is associated with specific
-field values -- the field values alone tell you everything about the object. In contrast, a mutable
-object is like a little container that might hold different values over time, and so is not identified
-with specific field values. In deciding whether to make a type immutable, ask whether two instances
+In order to support mutation, such objects are generally allocated on the heap, and have
+stable memory addresses.
+A mutable object is like a little container that might hold different values over time,
+and so can only be reliably identified with its address.
+In contrast, an instance of an immutable type is associated with specific field values ---
+the field values alone tell you everything about the object.
+In deciding whether to make a type mutable, ask whether two instances
with the same field values would be considered identical, or if they might need to change independently
over time. If they would be considered identical, the type should probably be immutable.
@@ -517,7 +520,7 @@ abstract types, and finally parametric bits types.
Type parameters are introduced immediately after the type name, surrounded by curly braces:
```jldoctest pointtype
-julia> type Point{T}
+julia> struct Point{T}
x::T
y::T
end
@@ -690,7 +693,7 @@ Parametric abstract type declarations declare a collection of abstract types, in
way:
```jldoctest pointytype
-julia> abstract Pointy{T}
+julia> abstract type Pointy{T} end
```
With this declaration, `Pointy{T}` is a distinct abstract type for each type or integer value
@@ -730,7 +733,7 @@ parametric abstract types serve the same purpose with respect to parametric comp
could, for example, have declared `Point{T}` to be a subtype of `Pointy{T}` as follows:
```jldoctest pointytype
-julia> type Point{T} <: Pointy{T}
+julia> struct Point{T} <: Pointy{T}
x::T
y::T
end
@@ -764,7 +767,7 @@ implementation that only requires a single coordinate because the point is on th
*x = y*:
```jldoctest pointytype
-julia> type DiagPoint{T} <: Pointy{T}
+julia> struct DiagPoint{T} <: Pointy{T}
x::T
end
```
@@ -779,7 +782,7 @@ There are situations where it may not make sense for type parameters to range fr
possible types. In such situations, one can constrain the range of `T` like so:
```jldoctest realpointytype
-julia> abstract Pointy{T<:Real}
+julia> abstract type Pointy{T<:Real} end
```
With such a declaration, it is acceptable to use any type that is a subtype of `Real` in place
@@ -802,7 +805,7 @@ ERROR: TypeError: Pointy: in T, expected T<:Real, got Int64
Type parameters for parametric composite types can be restricted in the same manner:
```julia
-type Point{T<:Real} <: Pointy{T}
+struct Point{T<:Real} <: Pointy{T}
x::T
y::T
end
@@ -813,7 +816,7 @@ the actual definition of Julia's `Rational` immutable type (except that we omit
here for simplicity), representing an exact ratio of integers:
```julia
-immutable Rational{T<:Integer} <: Real
+struct Rational{T<:Integer} <: Real
num::T
den::T
end
@@ -831,7 +834,7 @@ to a parameterized immutable type where each parameter is the type of one field.
a 2-element tuple type resembles the following immutable type:
```julia
-immutable Tuple2{A,B}
+struct Tuple2{A,B}
a::A
b::B
end
@@ -953,17 +956,17 @@ the term "singleton type" refers to a type whose only instance is a single value
applies to Julia's singleton types, but with that caveat that only type objects have singleton
types.
-### Parametric Bits Types
+### Parametric Primitive Types
-Bits types can also be declared parametrically. For example, pointers are represented as boxed
-bits types which would be declared in Julia like this:
+Primitive types can also be declared parametrically. For example, pointers are represented as
+primitive types which would be declared in Julia like this:
```julia
# 32-bit system:
-bitstype 32 Ptr{T}
+primitive type Ptr{T} 32 end
# 64-bit system:
-bitstype 64 Ptr{T}
+primitive type Ptr{T} 64 end
```
The slightly odd feature of these declarations as compared to typical parametric composite types,
@@ -1159,7 +1162,7 @@ overloading the [`show()`](@ref) function. For example, suppose we define a typ
complex numbers in polar form:
```jldoctest polartype
-julia> type Polar{T<:Real} <: Number
+julia> struct Polar{T<:Real} <: Number
r::T
Θ::T
end
@@ -1250,7 +1253,7 @@ elaborate hierarchy.
`Val` is defined as:
```jldoctest valtype
-julia> immutable Val{T}
+julia> struct Val{T}
end
```
diff --git a/doc/src/manual/variables-and-scoping.md b/doc/src/manual/variables-and-scoping.md
index ba6b85c1046e8..af4d02bfcefc8 100644
--- a/doc/src/manual/variables-and-scoping.md
+++ b/doc/src/manual/variables-and-scoping.md
@@ -17,7 +17,7 @@ constructs introducing scope blocks are:
|:-------------------- |:-------------------------------------------------------------------------------------------------------- |
| [Global Scope](@ref) | `module`, `baremodule`, at interactive prompt (REPL) |
| [Local Scope](@ref) | [Soft Local Scope](@ref): `for`, `while`, comprehensions, try-catch-finally, `let` |
-| [Local Scope](@ref) | [Hard Local Scope](@ref): functions (either syntax, anonymous & do-blocks), `type`, `immutable`, `macro` |
+| [Local Scope](@ref) | [Hard Local Scope](@ref): functions (either syntax, anonymous & do-blocks), `struct`, `macro` |
Notably missing from this table are [begin blocks](@ref man-compound-expressions) and [if blocks](@ref man-conditional-evaluation), which do *not*
introduce new scope blocks. All three types of scopes follow somewhat different rules which will
@@ -186,7 +186,7 @@ ERROR: syntax: `global j`: j is local variable in the enclosing scope
### Hard Local Scope
-Hard local scopes are introduced by function definitions (in all their forms), type & immutable-blocks,
+Hard local scopes are introduced by function definitions (in all their forms), struct type definition blocks,
and macro-definitions.
> In a hard local scope, all variables are inherited from its parent scope unless:
@@ -488,7 +488,7 @@ not change, adding a `const` declaration solves this performance problem.
Local constants are quite different. The compiler is able to determine automatically when a local
variable is constant, so local constant declarations are not necessary for performance purposes.
-Special top-level assignments, such as those performed by the `function` and `type` keywords,
+Special top-level assignments, such as those performed by the `function` and `struct` keywords,
are constant by default.
Note that `const` only affects the variable binding; the variable may be bound to a mutable object
diff --git a/examples/ModInts.jl b/examples/ModInts.jl
index 0effca60b1c0d..d811722814843 100644
--- a/examples/ModInts.jl
+++ b/examples/ModInts.jl
@@ -5,7 +5,7 @@ export ModInt
import Base: +, -, *, /, inv
-immutable ModInt{n} <: Integer
+struct ModInt{n} <: Integer
k::Int
ModInt{n}(k) where n = new(mod(k,n))
end
diff --git a/examples/bubblesort.jl b/examples/bubblesort.jl
index e1b215b9bc5b7..8b39e6793ded4 100644
--- a/examples/bubblesort.jl
+++ b/examples/bubblesort.jl
@@ -1,7 +1,7 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
import Base.Sort
-immutable BubbleSortAlg <: Sort.Algorithm end
+struct BubbleSortAlg <: Sort.Algorithm end
const BubbleSort = BubbleSortAlg()
function Base.sort!(v::AbstractVector, lo::Int, hi::Int, ::BubbleSortAlg, o::Sort.Ordering)
diff --git a/examples/clustermanager/0mq/ZMQCM.jl b/examples/clustermanager/0mq/ZMQCM.jl
index 1fd7fad73c0df..4d89de0ed029c 100644
--- a/examples/clustermanager/0mq/ZMQCM.jl
+++ b/examples/clustermanager/0mq/ZMQCM.jl
@@ -17,7 +17,7 @@ const REQUEST_ACK = "R"
const ACK_MSG = "A"
const KILL_MSG = "K"
-type ZMQCMan <: ClusterManager
+mutable struct ZMQCMan <: ClusterManager
map_zmq_julia::Dict{Int, Tuple}
c::Condition
isfree::Bool
diff --git a/examples/clustermanager/simple/UnixDomainCM.jl b/examples/clustermanager/simple/UnixDomainCM.jl
index 0822997d70149..f96c6e0fcf7a6 100644
--- a/examples/clustermanager/simple/UnixDomainCM.jl
+++ b/examples/clustermanager/simple/UnixDomainCM.jl
@@ -2,7 +2,7 @@
import Base: launch, manage, connect, exit
-type UnixDomainCM <: ClusterManager
+mutable struct UnixDomainCM <: ClusterManager
np::Integer
end
diff --git a/examples/dictchannel.jl b/examples/dictchannel.jl
index 5ac2e28e9f800..83c8e1eebc70c 100644
--- a/examples/dictchannel.jl
+++ b/examples/dictchannel.jl
@@ -2,7 +2,7 @@
import Base: put!, wait, isready, take!, fetch
-type DictChannel <: AbstractChannel
+mutable struct DictChannel <: AbstractChannel
d::Dict
cond_take::Condition # waiting for data to become available
DictChannel() = new(Dict(), Condition())
diff --git a/examples/juliatypes.jl b/examples/juliatypes.jl
index effb8bd0884bb..efd924c18e828 100644
--- a/examples/juliatypes.jl
+++ b/examples/juliatypes.jl
@@ -2,9 +2,9 @@
import Base: convert, show
-abstract Ty
+abstract type Ty end
-type TypeName
+mutable struct TypeName
name::Symbol
abs::Bool
super::Ty # actually TagT
@@ -17,7 +17,7 @@ end
show(io::IO, x::TypeName) = print(io, x.name)
-type TagT <: Ty
+mutable struct TagT <: Ty
name::TypeName
params
vararg::Bool
@@ -40,12 +40,12 @@ function show(io::IO, t::TagT)
print(io, '}')
end
-type BottomTy <: Ty
+mutable struct BottomTy <: Ty
end
show(io::IO, ::BottomTy) = print(io, "BottomT")
-type UnionT <: Ty
+mutable struct UnionT <: Ty
a
b
UnionT() = BottomT
@@ -69,7 +69,7 @@ function show(io::IO, t::UnionT)
print(io, ')')
end
-type Var
+mutable struct Var
name::Symbol
lb
ub
@@ -96,7 +96,7 @@ end
show(io::IO, v::Var) = print(io, v.name)
-type UnionAllT <: Ty
+mutable struct UnionAllT <: Ty
var::Var
T
UnionAllT(v::Var, t) = new(v, t)
@@ -151,7 +151,7 @@ subst(t, env) = t
isequal_type(x, y) = issub(x, y) && issub(y, x)
-type Bounds
+mutable struct Bounds
# record current lower and upper bounds of a Var
# right: whether this Var is on the right-hand side of A <: B
lb
@@ -159,14 +159,14 @@ type Bounds
right::Bool
end
-type UnionState
+mutable struct UnionState
depth::Int # number of union decision points we're inside
more::Bool # new union found; need to grow stack
stack::Vector{Bool} # stack of decisions
UnionState() = new(1,0,Bool[])
end
-type Env
+mutable struct Env
vars::Dict{Var,Bounds}
Lunions::UnionState
Runions::UnionState
diff --git a/examples/lru.jl b/examples/lru.jl
index a8342d8d1f221..dd682ba5177e7 100644
--- a/examples/lru.jl
+++ b/examples/lru.jl
@@ -25,17 +25,17 @@ import Base.haskey, Base.get
import Base.setindex!, Base.getindex, Base.delete!, Base.empty!
import Base.show
-abstract LRU{K,V} <: Associative{K,V}
+abstract type LRU{K,V} <: Associative{K,V} end
# Default cache size
const __MAXCACHE = 1024
-type CacheItem{K,V}
+mutable struct CacheItem{K,V}
k::K
v::V
end
-type UnboundedLRU{K,V} <: LRU{K,V}
+mutable struct UnboundedLRU{K,V} <: LRU{K,V}
ht::Dict
q::Vector{CacheItem}
@@ -43,7 +43,7 @@ type UnboundedLRU{K,V} <: LRU{K,V}
end
UnboundedLRU() = UnboundedLRU{Any, Any}()
-type BoundedLRU{K,V} <: LRU{K,V}
+mutable struct BoundedLRU{K,V} <: LRU{K,V}
ht::Dict
q::Vector{CacheItem}
maxsize::Int
diff --git a/examples/time.jl b/examples/time.jl
index a69d348becd54..98f14449c8d81 100644
--- a/examples/time.jl
+++ b/examples/time.jl
@@ -5,7 +5,7 @@ export TimeDelta
import Base.show, Base.+, Base.-, Base.convert, Base.promote_rule
-immutable TimeDelta{p}
+struct TimeDelta{p}
v::Int64
end
diff --git a/examples/typetree.jl b/examples/typetree.jl
index a86bc7c3e4aaa..bda8fe239459a 100644
--- a/examples/typetree.jl
+++ b/examples/typetree.jl
@@ -5,7 +5,7 @@ module TypeTrees
# Generate a text graphic of Julia modules type tree
##
-immutable Binding
+struct Binding
mod::Module
sym::Symbol
end
@@ -13,7 +13,7 @@ Binding(tn::TypeName) = Binding(tn.module, tn.name)
Base.isless(a::Binding, b::Binding) = isless(a.sym, b.sym)
# The node type holds the type of the current node and a dict of subtypes
-immutable TTNode
+struct TTNode
typ::Type
subtypes::Dict{Binding, TTNode}
diff --git a/src/abi_aarch64.cpp b/src/abi_aarch64.cpp
index e2334490317d4..ac624e2a330a2 100644
--- a/src/abi_aarch64.cpp
+++ b/src/abi_aarch64.cpp
@@ -45,7 +45,7 @@ Type *get_llvm_vectype(jl_datatype_t *dt) const
// the homogeneity check.
jl_datatype_t *ft0 = (jl_datatype_t*)jl_field_type(dt, 0);
// `ft0` should be a `VecElement` type and the true element type
- // should be a `bitstype`
+ // should be a primitive type
if (ft0->name != jl_vecelement_typename ||
((jl_datatype_t*)jl_field_type(ft0, 0))->layout->nfields)
return nullptr;
diff --git a/src/intrinsics.cpp b/src/intrinsics.cpp
index 7323bc077b50e..52db8098c2ea1 100644
--- a/src/intrinsics.cpp
+++ b/src/intrinsics.cpp
@@ -409,10 +409,10 @@ static jl_cgval_t generic_bitcast(const jl_cgval_t *argv, jl_codectx_t *ctx)
if (!jl_is_bitstype(v.typ)) {
if (isboxed) {
Value *isbits = emit_datatype_isbitstype(typ);
- error_unless(isbits, "bitcast: expected bitstype value for second argument", ctx);
+ error_unless(isbits, "bitcast: expected primitive type value for second argument", ctx);
}
else {
- emit_error("bitcast: expected bitstype value for second argument", ctx);
+ emit_error("bitcast: expected primitive type value for second argument", ctx);
return jl_cgval_t();
}
}
diff --git a/src/julia-parser.scm b/src/julia-parser.scm
index 241cbe1ea7618..62f240040598c 100644
--- a/src/julia-parser.scm
+++ b/src/julia-parser.scm
@@ -113,8 +113,9 @@
(define operator? (Set operators))
(define initial-reserved-words '(begin while if for try return break continue
- function macro quote let local global const
- abstract typealias type bitstype immutable do
+ function macro quote let local global const do
+ struct
+ abstract typealias bitstype type immutable ;; to be deprecated
module baremodule using import export importall))
(define initial-reserved-word? (Set initial-reserved-words))
@@ -978,7 +979,7 @@
;; also handles looking for syntactic reserved words
(define (parse-call s)
(let ((ex (parse-unary-prefix s)))
- (if (initial-reserved-word? ex)
+ (if (or (initial-reserved-word? ex) (memq ex '(mutable primitive)))
(parse-resword s ex)
(parse-call-chain s ex #f))))
@@ -1134,6 +1135,13 @@
(and (eq? (car sig) 'where)
(valid-func-sig? paren (cadr sig))))))
+(define (parse-struct-def s mut? word)
+ (if (reserved-word? (peek-token s))
+ (error (string "invalid type name \"" (take-token s) "\"")))
+ (let ((sig (parse-subtype-spec s)))
+ (begin0 (list 'type (if mut? 'true 'false) sig (parse-block s))
+ (expect-end s word))))
+
;; parse expressions or blocks introduced by syntactic reserved words
(define (parse-resword s word)
(with-bindings
@@ -1254,22 +1262,51 @@
(body (parse-block s)))
(expect-end s word)
(list word def body)))))
+
((abstract)
- (list 'abstract (parse-subtype-spec s)))
- ((type immutable)
- (let ((immu? (eq? word 'immutable)))
- (if (reserved-word? (peek-token s))
- (error (string "invalid type name \"" (take-token s) "\"")))
- (let ((sig (parse-subtype-spec s)))
- (begin0 (list 'type (if (eq? word 'type) 'true 'false)
- sig (parse-block s))
- (expect-end s word)))))
+ (let ((ty (eq? (peek-token s) 'type)))
+ (if ty
+ (take-token s))
+ (let ((spec (parse-subtype-spec s)))
+ (if (not ty)
+ (syntax-deprecation s (string "abstract " (deparse spec))
+ (string "abstract type " (deparse spec) " end")))
+ (begin0 (list 'abstract spec)
+ (if ty (expect-end s "abstract type"))))))
+ ((struct)
+ (begin (take-token s)
+ (parse-struct-def s #f word)))
+ ((mutable)
+ (if (not (eq? (peek-token s) 'struct))
+ (parse-call-chain s word #f)
+ (begin (take-token s)
+ (parse-struct-def s #t word))))
+ ((primitive)
+ (if (not (eq? (peek-token s) 'type))
+ (parse-call-chain s word #f)
+ (begin (take-token s)
+ (let* ((spec (with-space-sensitive (parse-subtype-spec s)))
+ (nb (with-space-sensitive (parse-cond s))))
+ (begin0 (list 'bitstype nb spec)
+ (expect-end s "primitive type"))))))
+ ;; deprecated type keywords
+ ((type)
+ ;; TODO fully deprecate post-0.6
+ ;;(syntax-deprecation s "type" "mutable struct")
+ (parse-struct-def s #t word))
+ ((immutable)
+ ;;(syntax-deprecation s "immutable" "struct")
+ (parse-struct-def s #f word))
((bitstype)
- (list 'bitstype (with-space-sensitive (parse-cond s))
- (parse-subtype-spec s)))
+ (let* ((nb (with-space-sensitive (parse-cond s)))
+ (spec (parse-subtype-spec s)))
+ (syntax-deprecation s (string "bitstype " (deparse nb) " " (deparse spec))
+ (string "primitive type " (deparse spec) " " (deparse nb) " end"))
+ (list 'bitstype nb spec)))
((typealias)
(let ((lhs (with-space-sensitive (parse-call s))))
- (list 'typealias lhs (parse-where s))))
+ (list 'typealias lhs (parse-where s))))
+
((try)
(let ((try-block (if (memq (require-token s) '(catch finally))
'(block)
diff --git a/src/runtime_intrinsics.c b/src/runtime_intrinsics.c
index f05da229718d2..c868319167044 100644
--- a/src/runtime_intrinsics.c
+++ b/src/runtime_intrinsics.c
@@ -19,9 +19,9 @@ JL_DLLEXPORT jl_value_t *jl_bitcast(jl_value_t *ty, jl_value_t *v)
{
JL_TYPECHK(bitcast, datatype, ty);
if (!jl_is_leaf_type(ty) || !jl_is_bitstype(ty))
- jl_error("bitcast: target type not a leaf bitstype");
+ jl_error("bitcast: target type not a leaf primitive type");
if (!jl_is_bitstype(jl_typeof(v)))
- jl_error("bitcast: value not a bitstype");
+ jl_error("bitcast: value not a primitive type");
if (jl_datatype_size(jl_typeof(v)) != jl_datatype_size(ty))
jl_error("bitcast: argument size does not match size of target type");
if (ty == jl_typeof(v))
@@ -322,9 +322,9 @@ jl_value_t *jl_iintrinsic_1(jl_value_t *ty, jl_value_t *a, const char *name,
jl_value_t *(*lambda1)(jl_value_t*, void*, unsigned, unsigned, const void*), const void *list)
{
if (!jl_is_bitstype(jl_typeof(a)))
- jl_errorf("%s: value is not a bitstype", name);
+ jl_errorf("%s: value is not a primitive type", name);
if (!jl_is_bitstype(ty))
- jl_errorf("%s: type is not a bitstype", name);
+ jl_errorf("%s: type is not a primitive type", name);
void *pa = jl_data_ptr(a);
unsigned isize = jl_datatype_size(jl_typeof(a));
unsigned isize2 = next_power_of_two(isize);
@@ -391,9 +391,9 @@ static inline jl_value_t *jl_intrinsic_cvt(jl_value_t *ty, jl_value_t *a, const
jl_ptls_t ptls = jl_get_ptls_states();
jl_value_t *aty = jl_typeof(a);
if (!jl_is_bitstype(aty))
- jl_errorf("%s: value is not a bitstype", name);
+ jl_errorf("%s: value is not a primitive type", name);
if (!jl_is_bitstype(ty))
- jl_errorf("%s: type is not a bitstype", name);
+ jl_errorf("%s: type is not a primitive type", name);
void *pa = jl_data_ptr(a);
unsigned isize = jl_datatype_size(aty);
unsigned osize = jl_datatype_size(ty);
@@ -430,9 +430,9 @@ static inline jl_value_t *jl_fintrinsic_1(jl_value_t *ty, jl_value_t *a, const c
{
jl_ptls_t ptls = jl_get_ptls_states();
if (!jl_is_bitstype(jl_typeof(a)))
- jl_errorf("%s: value is not a bitstype", name);
+ jl_errorf("%s: value is not a primitive type", name);
if (!jl_is_bitstype(ty))
- jl_errorf("%s: type is not a bitstype", name);
+ jl_errorf("%s: type is not a primitive type", name);
unsigned sz2 = jl_datatype_size(ty);
jl_value_t *newv = jl_gc_alloc(ptls, sz2, ty);
void *pa = jl_data_ptr(a), *pr = jl_data_ptr(newv);
@@ -542,10 +542,10 @@ jl_value_t *jl_iintrinsic_2(jl_value_t *a, jl_value_t *b, const char *name,
if (!cvtb)
jl_errorf("%s: types of a and b must match", name);
if (!jl_is_bitstype(tyb))
- jl_errorf("%s: b is not a bitstypes", name);
+ jl_errorf("%s: b is not a primitive type", name);
}
if (!jl_is_bitstype(ty))
- jl_errorf("%s: a is not a bitstypes", name);
+ jl_errorf("%s: a is not a primitive type", name);
void *pa = jl_data_ptr(a), *pb = jl_data_ptr(b);
unsigned sz = jl_datatype_size(ty);
unsigned sz2 = next_power_of_two(sz);
@@ -628,7 +628,7 @@ JL_DLLEXPORT jl_value_t *jl_##name(jl_value_t *a, jl_value_t *b) \
if (jl_typeof(b) != ty) \
jl_error(#name ": types of a and b must match"); \
if (!jl_is_bitstype(ty)) \
- jl_error(#name ": values are not bitstypes"); \
+ jl_error(#name ": values are not primitive types"); \
int sz = jl_datatype_size(ty); \
jl_value_t *newv = jl_gc_alloc(ptls, sz, ty); \
void *pa = jl_data_ptr(a), *pb = jl_data_ptr(b), *pr = jl_data_ptr(newv); \
@@ -655,7 +655,7 @@ JL_DLLEXPORT jl_value_t *jl_##name(jl_value_t *a, jl_value_t *b) \
if (jl_typeof(b) != ty) \
jl_error(#name ": types of a and b must match"); \
if (!jl_is_bitstype(ty)) \
- jl_error(#name ": values are not bitstypes"); \
+ jl_error(#name ": values are not primitive types"); \
void *pa = jl_data_ptr(a), *pb = jl_data_ptr(b); \
int sz = jl_datatype_size(ty); \
int cmp; \
@@ -683,7 +683,7 @@ JL_DLLEXPORT jl_value_t *jl_##name(jl_value_t *a, jl_value_t *b, jl_value_t *c)
if (jl_typeof(b) != ty || jl_typeof(c) != ty) \
jl_error(#name ": types of a, b, and c must match"); \
if (!jl_is_bitstype(ty)) \
- jl_error(#name ": values are not bitstypes"); \
+ jl_error(#name ": values are not primitive types"); \
int sz = jl_datatype_size(ty); \
jl_value_t *newv = jl_gc_alloc(ptls, sz, ty); \
void *pa = jl_data_ptr(a), *pb = jl_data_ptr(b), *pc = jl_data_ptr(c), *pr = jl_data_ptr(newv); \
@@ -871,7 +871,7 @@ JL_DLLEXPORT jl_value_t *jl_check_top_bit(jl_value_t *a)
{
jl_value_t *ty = jl_typeof(a);
if (!jl_is_bitstype(ty))
- jl_error("check_top_bit: value is not a bitstype");
+ jl_error("check_top_bit: value is not a primitive type");
if (signbitbyte(jl_data_ptr(a), jl_datatype_size(ty)))
jl_throw(jl_inexact_exception);
return a;
@@ -930,9 +930,9 @@ JL_DLLEXPORT jl_value_t *jl_powi_llvm(jl_value_t *a, jl_value_t *b)
jl_ptls_t ptls = jl_get_ptls_states();
jl_value_t *ty = jl_typeof(a);
if (!jl_is_bitstype(ty))
- jl_error("powi_llvm: a is not a bitstype");
+ jl_error("powi_llvm: a is not a primitive type");
if (!jl_is_bitstype(jl_typeof(b)) || jl_datatype_size(jl_typeof(b)) != 4)
- jl_error("powi_llvm: b is not a 32-bit bitstype");
+ jl_error("powi_llvm: b is not a 32-bit primitive type");
int sz = jl_datatype_size(ty);
jl_value_t *newv = jl_gc_alloc(ptls, sz, ty);
void *pa = jl_data_ptr(a), *pr = jl_data_ptr(newv);
diff --git a/test/TestHelpers.jl b/test/TestHelpers.jl
index 56f6e59ac7041..4afc619c833b5 100644
--- a/test/TestHelpers.jl
+++ b/test/TestHelpers.jl
@@ -2,7 +2,7 @@
module TestHelpers
-type FakeTerminal <: Base.Terminals.UnixTerminal
+mutable struct FakeTerminal <: Base.Terminals.UnixTerminal
in_stream::Base.IO
out_stream::Base.IO
err_stream::Base.IO
@@ -54,7 +54,7 @@ using Base: Indices, LinearSlow, LinearFast, tail
export OffsetArray
-immutable OffsetArray{T,N,AA<:AbstractArray} <: AbstractArray{T,N}
+struct OffsetArray{T,N,AA<:AbstractArray} <: AbstractArray{T,N}
parent::AA
offsets::NTuple{N,Int}
end
diff --git a/test/abstractarray.jl b/test/abstractarray.jl
index a6a01611559ed..5bd1f95cef8bf 100644
--- a/test/abstractarray.jl
+++ b/test/abstractarray.jl
@@ -165,12 +165,12 @@ end
# token type on which to dispatch testing methods in order to avoid potential
# name conflicts elsewhere in the base test suite
-type TestAbstractArray end
+mutable struct TestAbstractArray end
## Tests for the abstract array interfaces with minimally defined array types
# A custom linear fast array type with 24 elements that doesn't rely upon Array storage
-type T24Linear{T,N,dims} <: AbstractArray{T,N}
+mutable struct T24Linear{T,N,dims} <: AbstractArray{T,N}
v1::T; v2::T; v3::T; v4::T; v5::T; v6::T; v7::T; v8::T
v9::T; v10::T; v11::T; v12::T; v13::T; v14::T; v15::T; v16::T
v17::T; v18::T; v19::T; v20::T; v21::T; v22::T; v23::T; v24::T
@@ -197,7 +197,7 @@ Base.getindex(A::T24Linear, i::Int) = getfield(A, i)
Base.setindex!{T}(A::T24Linear{T}, v, i::Int) = setfield!(A, i, convert(T, v))
# A custom linear slow sparse-like array that relies upon Dict for its storage
-immutable TSlow{T,N} <: AbstractArray{T,N}
+struct TSlow{T,N} <: AbstractArray{T,N}
data::Dict{NTuple{N,Int}, T}
dims::NTuple{N,Int}
end
@@ -433,7 +433,7 @@ function test_primitives{T}(::Type{T}, shape, ::Type{TestAbstractArray})
end
let
- type TestThrowNoGetindex{T} <: AbstractVector{T} end
+ mutable struct TestThrowNoGetindex{T} <: AbstractVector{T} end
Base.length(::TestThrowNoGetindex) = 2
Base.size(::TestThrowNoGetindex) = (2,)
@test_throws ErrorException isassigned(TestThrowNoGetindex{Float64}(), 1)
@@ -450,13 +450,13 @@ function test_in_bounds(::Type{TestAbstractArray})
@test checkbounds(Bool, A, len + 1) == false
end
-type UnimplementedFastArray{T, N} <: AbstractArray{T, N} end
+mutable struct UnimplementedFastArray{T, N} <: AbstractArray{T, N} end
Base.linearindexing(::UnimplementedFastArray) = Base.LinearFast()
-type UnimplementedSlowArray{T, N} <: AbstractArray{T, N} end
+mutable struct UnimplementedSlowArray{T, N} <: AbstractArray{T, N} end
Base.linearindexing(::UnimplementedSlowArray) = Base.LinearSlow()
-type UnimplementedArray{T, N} <: AbstractArray{T, N} end
+mutable struct UnimplementedArray{T, N} <: AbstractArray{T, N} end
function test_getindex_internals{T}(::Type{T}, shape, ::Type{TestAbstractArray})
N = prod(shape)
@@ -590,7 +590,7 @@ function test_ind2sub(::Type{TestAbstractArray})
end
# A custom linear slow array that insists upon Cartesian indexing
-type TSlowNIndexes{T,N} <: AbstractArray{T,N}
+mutable struct TSlowNIndexes{T,N} <: AbstractArray{T,N}
data::Array{T,N}
end
Base.linearindexing{A<:TSlowNIndexes}(::Type{A}) = Base.LinearSlow()
@@ -599,7 +599,7 @@ Base.getindex(A::TSlowNIndexes, index::Int...) = error("Must use $(ndims(A)) ind
Base.getindex{T}(A::TSlowNIndexes{T,2}, i::Int, j::Int) = A.data[i,j]
-type GenericIterator{N} end
+mutable struct GenericIterator{N} end
Base.start{N}(::GenericIterator{N}) = 1
Base.next{N}(::GenericIterator{N}, i) = (i, i + 1)
Base.done{N}(::GenericIterator{N}, i) = i > N ? true : false
diff --git a/test/ambiguous.jl b/test/ambiguous.jl
index 8470d9a4ad524..fa6cc8c54e355 100644
--- a/test/ambiguous.jl
+++ b/test/ambiguous.jl
@@ -178,7 +178,7 @@ end
# issue #17350
module Ambig6
-immutable ScaleMinMax{To,From} end
+struct ScaleMinMax{To,From} end
map1{To<:Union{Float32,Float64},From<:Real}(mapi::ScaleMinMax{To,From}, val::From) = 1
map1{To<:Union{Float32,Float64},From<:Real}(mapi::ScaleMinMax{To,From}, val::Union{Real,Complex}) = 2
end
@@ -186,14 +186,14 @@ end
@test isempty(detect_ambiguities(Ambig6))
module Ambig7
-immutable T end
+struct T end
(::T)(x::Int8, y) = 1
(::T)(x, y::Int8) = 2
end
@test length(detect_ambiguities(Ambig7)) == 1
module Ambig17648
-immutable MyArray{T,N} <: AbstractArray{T,N}
+struct MyArray{T,N} <: AbstractArray{T,N}
data::Array{T,N}
end
diff --git a/test/arrayops.jl b/test/arrayops.jl
index 2b5c6641fb1c9..9f245df944807 100644
--- a/test/arrayops.jl
+++ b/test/arrayops.jl
@@ -558,7 +558,7 @@ D = cat(3, B, B)
@test unique(D, 3) == cat(3, B)
# With hash collisions
-immutable HashCollision
+struct HashCollision
x::Float64
end
Base.hash(::HashCollision, h::UInt) = h
@@ -1602,7 +1602,7 @@ module RetTypeDecl
using Base.Test
import Base: +, *, broadcast, convert
- immutable MeterUnits{T,P} <: Number
+ struct MeterUnits{T,P} <: Number
val::T
end
MeterUnits{T}(val::T, pow::Int) = MeterUnits{T,pow}(val)
@@ -1644,7 +1644,7 @@ end
###
### LinearSlow workout
###
-immutable LinSlowMatrix{T} <: DenseArray{T,2}
+struct LinSlowMatrix{T} <: DenseArray{T,2}
data::Matrix{T}
end
@@ -1734,7 +1734,7 @@ x13250[UInt(1):UInt(2)] = 1.0
@test x13250[2] == 1.0
@test x13250[3] == 0.0
-immutable SquaresVector <: AbstractArray{Int, 1}
+struct SquaresVector <: AbstractArray{Int, 1}
count::Int
end
Base.size(S::SquaresVector) = (S.count,)
@@ -1800,7 +1800,7 @@ end
@inferred map(Int8, Int[0])
# make sure @inbounds isn't used too much
-type OOB_Functor{T}; a::T; end
+mutable struct OOB_Functor{T}; a::T; end
(f::OOB_Functor)(i::Int) = f.a[i]
let f = OOB_Functor([1,2])
@test_throws BoundsError map(f, [1,2,3,4,5])
@@ -1879,7 +1879,7 @@ module AutoRetType
using Base.Test
-immutable Foo end
+struct Foo end
for op in (:+, :*, :÷, :%, :<<, :>>, :-, :/, :\, ://, :^)
@eval import Base.$(op)
@eval $(op)(::Foo, ::Foo) = Foo()
@@ -2030,7 +2030,7 @@ end
end
# issue #11053
-type T11053
+mutable struct T11053
a::Float64
end
Base.:*(a::T11053, b::Real) = T11053(a.a*b)
diff --git a/test/broadcast.jl b/test/broadcast.jl
index c708e2ebec83d..324fa60d8666b 100644
--- a/test/broadcast.jl
+++ b/test/broadcast.jl
@@ -376,7 +376,7 @@ let s = "foo"
end
# Ensure that even strange constructors that break `T(x)::T` work with broadcast
-immutable StrangeType18623 end
+struct StrangeType18623 end
StrangeType18623(x) = x
StrangeType18623(x,y) = (x,y)
@test @inferred(broadcast(StrangeType18623, 1:3)) == [1,2,3]
@@ -415,7 +415,7 @@ end
@test let z = 1; A = broadcast!(x -> z += x, zeros(2), 1); A[1] != A[2]; end
# broadcasting for custom AbstractArray
-immutable Array19745{T,N} <: AbstractArray{T,N}
+struct Array19745{T,N} <: AbstractArray{T,N}
data::Array{T,N}
end
Base.getindex(A::Array19745, i::Integer...) = A.data[i...]
diff --git a/test/ccall.jl b/test/ccall.jl
index ab97417d4e99c..661d199e270bc 100644
--- a/test/ccall.jl
+++ b/test/ccall.jl
@@ -44,7 +44,7 @@ macro ccall_echo_objref(x, T, U)
gen_ccall_echo(x, :(Ptr{$T}), U, :unsafe_pointer_to_objref)
end
-type IntLike
+mutable struct IntLike
x::Int
end
@test @ccall_echo_load(132, Ptr{Int}, Ref{Int}) === 132
@@ -128,11 +128,11 @@ end
## Tests for various sized data types (ByVal)
-type Struct1
+mutable struct Struct1
x::Float32
y::Float64
end
-immutable Struct1I
+struct Struct1I
x::Float32
y::Float64
end
@@ -212,12 +212,12 @@ let a, b, x, y, z
@test z == a + 1*b
end
-type Struct4
+mutable struct Struct4
x::Int32
y::Int32
z::Int32
end
-immutable Struct4I
+struct Struct4I
x::Int32
y::Int32
z::Int32
@@ -240,13 +240,13 @@ end
test_struct4(Struct4)
test_struct4(Struct4I)
-type Struct5
+mutable struct Struct5
x::Int32
y::Int32
z::Int32
a::Int32
end
-immutable Struct5I
+struct Struct5I
x::Int32
y::Int32
z::Int32
@@ -271,12 +271,12 @@ end
test_struct5(Struct5)
test_struct5(Struct5I)
-type Struct6
+mutable struct Struct6
x::Int64
y::Int64
z::Int64
end
-immutable Struct6I
+struct Struct6I
x::Int64
y::Int64
z::Int64
@@ -299,11 +299,11 @@ end
test_struct6(Struct6)
test_struct6(Struct6I)
-type Struct7
+mutable struct Struct7
x::Int64
y::Cchar
end
-immutable Struct7I
+struct Struct7I
x::Int64
y::Cchar
end
@@ -324,11 +324,11 @@ end
test_struct7(Struct7)
test_struct7(Struct7I)
-type Struct8
+mutable struct Struct8
x::Int32
y::Cchar
end
-immutable Struct8I
+struct Struct8I
x::Int32
y::Cchar
end
@@ -349,11 +349,11 @@ end
test_struct8(Struct8)
test_struct8(Struct8I)
-type Struct9
+mutable struct Struct9
x::Int32
y::Int16
end
-immutable Struct9I
+struct Struct9I
x::Int32
y::Int16
end
@@ -374,13 +374,13 @@ end
test_struct9(Struct9)
test_struct9(Struct9I)
-type Struct10
+mutable struct Struct10
x::Cchar
y::Cchar
z::Cchar
a::Cchar
end
-immutable Struct10I
+struct Struct10I
x::Cchar
y::Cchar
z::Cchar
@@ -405,10 +405,10 @@ end
test_struct10(Struct10)
test_struct10(Struct10I)
-type Struct11
+mutable struct Struct11
x::Complex64
end
-immutable Struct11I
+struct Struct11I
x::Complex64
end
@@ -427,11 +427,11 @@ end
test_struct11(Struct11)
test_struct11(Struct11I)
-type Struct12
+mutable struct Struct12
x::Complex64
y::Complex64
end
-immutable Struct12I
+struct Struct12I
x::Complex64
y::Complex64
end
@@ -452,10 +452,10 @@ end
test_struct12(Struct12)
test_struct12(Struct12I)
-type Struct13
+mutable struct Struct13
x::Complex128
end
-immutable Struct13I
+struct Struct13I
x::Complex128
end
@@ -474,11 +474,11 @@ end
test_struct13(Struct13)
test_struct13(Struct13I)
-type Struct14
+mutable struct Struct14
x::Float32
y::Float32
end
-immutable Struct14I
+struct Struct14I
x::Float32
y::Float32
end
@@ -499,11 +499,11 @@ end
test_struct14(Struct14)
test_struct14(Struct14I)
-type Struct15
+mutable struct Struct15
x::Float64
y::Float64
end
-immutable Struct15I
+struct Struct15I
x::Float64
y::Float64
end
@@ -524,7 +524,7 @@ end
test_struct15(Struct15)
test_struct15(Struct15I)
-type Struct16
+mutable struct Struct16
x::Float32
y::Float32
z::Float32
@@ -532,7 +532,7 @@ type Struct16
b::Float64
c::Float64
end
-immutable Struct16I
+struct Struct16I
x::Float32
y::Float32
z::Float32
@@ -562,11 +562,11 @@ end
test_struct16(Struct16)
test_struct16(Struct16I)
-type Struct17
+mutable struct Struct17
a::Int8
b::Int16
end
-immutable Struct17I
+struct Struct17I
a::Int8
b::Int16
end
@@ -587,12 +587,12 @@ end
test_struct17(Struct17)
test_struct17(Struct17I)
-type Struct18
+mutable struct Struct18
a::Int8
b::Int8
c::Int8
end
-immutable Struct18I
+struct Struct18I
a::Int8
b::Int8
c::Int8
@@ -625,12 +625,12 @@ let a, b, x
@test a == Int128(0x7f00123456789abc)<<64 + typemax(UInt64)
end
-type Struct_Big
+mutable struct Struct_Big
x::Int
y::Int
z::Int8
end
-immutable Struct_BigI
+struct Struct_BigI
x::Int
y::Int
z::Int8
@@ -670,30 +670,30 @@ const Struct_huge1a = NTuple{8, Int64}
const Struct_huge1b = NTuple{9, Int64}
const Struct_huge2a = NTuple{8, Cdouble}
const Struct_huge2b = NTuple{9, Cdouble}
-type Struct_huge3a
+mutable struct Struct_huge3a
cf::NTuple{3, Complex{Cfloat}}
f7::Cfloat
f8::Cfloat
end
-type Struct_huge3b
+mutable struct Struct_huge3b
cf::NTuple{7, Complex{Cfloat}}
r8a::Cfloat
r8b::Cfloat
end
-type Struct_huge3c
+mutable struct Struct_huge3c
cf::NTuple{7, Complex{Cfloat}}
r8a::Cfloat
r8b::Cfloat
r9::Cfloat
end
-type Struct_huge4a
+mutable struct Struct_huge4a
r12::Complex{Cdouble}
r34::Complex{Cdouble}
r5::Complex{Cfloat}
r67::Complex{Cdouble}
r8::Cdouble
end
-type Struct_huge4b
+mutable struct Struct_huge4b
r12::Complex{Cdouble}
r34::Complex{Cdouble}
r5::Complex{Cfloat}
@@ -901,79 +901,79 @@ typealias V2xF64 VecReg{2,Float64}
typealias V2xI32 VecReg{2,Int32}
typealias V4xI32 VecReg{4,Int32}
-immutable Struct_AA64_1
+struct Struct_AA64_1
v1::Int32
v2::Int128
end
-immutable Struct_AA64_2
+struct Struct_AA64_2
v1::Float16
v2::Float64
end
# This is a homogenious short vector aggregate
-immutable Struct_AA64_3
+struct Struct_AA64_3
v1::VecReg{8,Int8}
v2::VecReg{2,Float32}
end
# This is NOT a homogenious short vector aggregate
-immutable Struct_AA64_4
+struct Struct_AA64_4
v2::VecReg{2,Float32}
v1::VecReg{8,Int16}
end
-type Struct_huge1_ppc64
+mutable struct Struct_huge1_ppc64
m::Int64
v::V4xF32
end
-type Struct_huge2_ppc64
+mutable struct Struct_huge2_ppc64
v1::V4xF32
v2::V2xI32
end
-type Struct_huge3_ppc64
+mutable struct Struct_huge3_ppc64
v1::V4xF32
f::NTuple{4,Float32}
end
-type Struct_huge4_ppc64
+mutable struct Struct_huge4_ppc64
v1::V2xF32
v2::V2xF64
end
-type Struct_huge5_ppc64
+mutable struct Struct_huge5_ppc64
v1::NTuple{9,V4xF32}
end
-type Struct_huge6_ppc64
+mutable struct Struct_huge6_ppc64
v1::NTuple{8,V4xF32}
v2::V4xF32
end
-type Struct_huge7_ppc64
+mutable struct Struct_huge7_ppc64
v1::VecReg{3,Int32}
v2::VecReg{3,Int32}
end
-type Struct_huge1_ppc64_hva
+mutable struct Struct_huge1_ppc64_hva
v1::NTuple{8,V4xF32}
end
-type Struct_huge2_ppc64_hva
+mutable struct Struct_huge2_ppc64_hva
v1::NTuple{2,NTuple{2,V4xF32}}
end
-type Struct_huge3_ppc64_hva
+mutable struct Struct_huge3_ppc64_hva
vf1::V4xF32
vf2::Tuple{NTuple{2,V4xF32}}
end
-type Struct_huge4_ppc64_hva
+mutable struct Struct_huge4_ppc64_hva
v1::V4xI32
v2::V4xF32
end
-type Struct_huge5_ppc64_hva
+mutable struct Struct_huge5_ppc64_hva
v1::V4xI32
v2::V2xF64
end
@@ -1156,7 +1156,7 @@ for i in 1:3
ccall((:test_echo_p, libccalltest), Ptr{Void}, (Any,), f17413())
end
-immutable SpillPint
+struct SpillPint
a::Ptr{Cint}
b::Ptr{Cint}
end
diff --git a/test/compile.jl b/test/compile.jl
index 718c24f6f7a24..91b0f1e4192f8 100644
--- a/test/compile.jl
+++ b/test/compile.jl
@@ -47,7 +47,7 @@ try
end
# test for creation of some reasonably complicated type
- immutable MyType{T} end
+ struct MyType{T} end
const t17809s = Any[
Tuple{
Type{Ptr{MyType{i}}},
@@ -67,20 +67,20 @@ try
const nothingkw = Core.kwfunc(Base.nothing)
# issue 16908 (some complicated types and external method definitions)
- abstract CategoricalPool{T, R <: Integer, V}
- abstract CategoricalValue{T, R <: Integer}
- immutable NominalPool{T, R <: Integer, V} <: CategoricalPool{T, R, V}
+ abstract type CategoricalPool{T, R <: Integer, V} end
+ abstract type CategoricalValue{T, R <: Integer} end
+ struct NominalPool{T, R <: Integer, V} <: CategoricalPool{T, R, V}
index::Vector{T}
invindex::Dict{T, R}
order::Vector{R}
ordered::Vector{T}
valindex::Vector{V}
end
- immutable NominalValue{T, R <: Integer} <: CategoricalValue{T, R}
+ struct NominalValue{T, R <: Integer} <: CategoricalValue{T, R}
level::R
pool::NominalPool{T, R, NominalValue{T, R}}
end
- immutable OrdinalValue{T, R <: Integer} <: CategoricalValue{T, R}
+ struct OrdinalValue{T, R <: Integer} <: CategoricalValue{T, R}
level::R
pool::NominalPool{T, R, NominalValue{T, R}}
end
@@ -92,10 +92,10 @@ try
# more tests for method signature involving a complicated type
# issue 18343
- immutable Pool18343{R, V}
+ struct Pool18343{R, V}
valindex::Vector{V}
end
- immutable Value18343{T, R}
+ struct Value18343{T, R}
pool::Pool18343{R, Value18343{T, R}}
end
Base.convert{S}(::Type{Nullable{S}}, ::Value18343{Nullable}) = 2
diff --git a/test/copy.jl b/test/copy.jl
index fd4cf26b98a0c..015e3b3e507bf 100644
--- a/test/copy.jl
+++ b/test/copy.jl
@@ -110,11 +110,11 @@ let x = BigFloat[1:1000;], y, z, v
end
# issue #19921
-type Foo19921
+mutable struct Foo19921
a::String
end
-type Bar19921
+mutable struct Bar19921
foo::Foo19921
fooDict::Dict{Foo19921, Int64}
end
diff --git a/test/core.jl b/test/core.jl
index f5499e64f4d1b..43579839dbefd 100644
--- a/test/core.jl
+++ b/test/core.jl
@@ -130,9 +130,9 @@ Type{Integer} # cache this
@test Base.typeseq(typejoin(Union{Int,AbstractString},Int8), Any)
# typejoin associativity
-abstract Foo____{K}
-type Wow____{K,V} <: Foo____{K} end
-type Bar____{K,V} <: Foo____{K} end
+abstract type Foo____{K} end
+mutable struct Wow____{K,V} <: Foo____{K} end
+mutable struct Bar____{K,V} <: Foo____{K} end
let
a = Wow____{Int64, Int64}
b = Wow____{Int64, Float64}
@@ -161,8 +161,8 @@ nttest1{n}(x::NTuple{n,Int}) = n
# type declarations
-abstract Sup_{A,B}
-abstract Qux_{T} <: Sup_{Qux_{Int},T}
+abstract type Sup_{A,B} end
+abstract type Qux_{T} <: Sup_{Qux_{Int},T} end
@test Qux_{Int}.super <: Sup_
@test ===(Qux_{Int}, Qux_{Int}.super.parameters[1])
@@ -175,43 +175,43 @@ abstract Qux_{T} <: Sup_{Qux_{Int},T}
@test ===(Qux_{Int}, Qux_.body.super.parameters[1].super.parameters[1])
@test ===(Int, Qux_.body.super.parameters[1].super.parameters[2])
-type Foo_{T} x::Foo_{Int} end
+mutable struct Foo_{T} x::Foo_{Int} end
@test ===(Foo_.body.types[1], Foo_{Int})
@test ===(Foo_.body.types[1].types[1], Foo_{Int})
-type Circ_{T} x::Circ_{T} end
+mutable struct Circ_{T} x::Circ_{T} end
@test ===(Circ_{Int}, Circ_{Int}.types[1])
-abstract Sup2a_
-abstract Sup2b_{A <: Sup2a_, B} <: Sup2a_
-@test_throws ErrorException @eval abstract Qux2_{T} <: Sup2b_{Qux2_{Int}, T} # wrapped in eval to avoid #16793
+abstract type Sup2a_ end
+abstract type Sup2b_{A <: Sup2a_, B} <: Sup2a_ end
+@test_throws ErrorException @eval abstract type Qux2_{T} <: Sup2b_{Qux2_{Int}, T} end # wrapped in eval to avoid #16793
# issue #3890
-type A3890{T1}
+mutable struct A3890{T1}
x::Matrix{Complex{T1}}
end
@test A3890{Float64}.types[1] === Array{Complex{Float64},2}
# make sure the field type Matrix{Complex{T1}} isn't cached
-type B3890{T2}
+mutable struct B3890{T2}
x::Matrix{Complex{T2}}
end
@test B3890{Float64}.types[1] === Array{Complex{Float64},2}
# issue #786
-type Node{T}
+mutable struct Node{T}
v::Vector{Node}
end
@test ===(Node{Int}.types[1].parameters[1], Node)
-type Node2{T}
+mutable struct Node2{T}
v::Vector{Node2{T}}
end
@test ===(Node2{Int}.types[1].parameters[1], Node2{Int})
-type FooFoo{A,B} y::FooFoo{A} end
+mutable struct FooFoo{A,B} y::FooFoo{A} end
@test FooFoo{Int} <: FooFoo{Int,AbstractString}.types[1]
@@ -469,7 +469,7 @@ end
@test [-1 ~1] == [(-1) (~1)]
# undefinedness
-type UndefField
+mutable struct UndefField
field
UndefField() = new()
end
@@ -497,7 +497,7 @@ let
end
# isassigned, issue #11167
-type Type11167{T,N} end
+mutable struct Type11167{T,N} end
Type11167{Int,2}
let tname = Type11167.body.body.name
@test !isassigned(tname.cache, 0)
@@ -549,7 +549,7 @@ let
@test isa(mytype(some_data),Vector{Tuple{String, DataType}})
end
-type MyArray{N} <: AbstractArray{Int, N}
+mutable struct MyArray{N} <: AbstractArray{Int, N}
end
let
local x
@@ -568,7 +568,7 @@ let
@test ===(g(a), a)
end
-type _AA{T}; a::T; end
+mutable struct _AA{T}; a::T; end
typealias _AoA{T} _AA{_AA{T}}
let
local g, a
@@ -827,7 +827,7 @@ let
end
# issue #1153
-type SI{m, s, kg}
+mutable struct SI{m, s, kg}
value::AbstractFloat
end
@@ -897,7 +897,7 @@ let
@test_throws InexactError unsafe_wrap(Array, pointer(a), -3)
end
-immutable FooBar2515
+struct FooBar2515
foo::Int
bar::Int
end
@@ -935,7 +935,7 @@ let
end
# issue #1442
-type S1442{T}
+mutable struct S1442{T}
end
let
@@ -948,9 +948,9 @@ let
end
# issue #1727
-abstract Component
+abstract type Component end
-type Transform <: Component
+mutable struct Transform <: Component
x
y
z
@@ -958,7 +958,7 @@ type Transform <: Component
Transform() = new(0, 0, 0)
end
-type Body <: Component
+mutable struct Body <: Component
vel
curr_force
@@ -1035,7 +1035,7 @@ let
end
# issue #2365
-type B2365{T}
+mutable struct B2365{T}
v::Union{T, Void}
end
@test B2365{Int}(nothing).v === nothing
@@ -1051,18 +1051,18 @@ let
end
# issue #2509
-immutable Foo2509; foo::Int; end
+struct Foo2509; foo::Int; end
@test Foo2509(1) != Foo2509(2)
@test Foo2509(42) == Foo2509(42)
# issue #2517
-immutable Foo2517; end
+struct Foo2517; end
@test repr(Foo2517()) == "$(curmod_prefix)Foo2517()"
@test repr(Array{Foo2517}(1)) == "$(curmod_prefix)Foo2517[$(curmod_prefix)Foo2517()]"
@test Foo2517() === Foo2517()
# issue #1474
-type X1474{a,b} end
+mutable struct X1474{a,b} end
let
local Y
Y{A,B}(::Type{X1474{A,B}}) = 1
@@ -1074,7 +1074,7 @@ let
end
# issue #2562
-type Node2562{T}
+mutable struct Node2562{T}
value::T
Node2562{T}(value::T) where T = new(value)
end
@@ -1084,7 +1084,7 @@ makenode2562(value) = Node2562(value)
@test isa(makenode2562(0), Node2562)
# issue #2619
-type I2619{T}
+mutable struct I2619{T}
v::T
I2619{T}(v) where T = new(convert(T,v))
end
@@ -1103,15 +1103,15 @@ i2619()
# issue #2919
typealias Foo2919 Int
-type Baz2919; Foo2919::Foo2919; end
+mutable struct Baz2919; Foo2919::Foo2919; end
@test Baz2919(3).Foo2919 === 3
# issue #2982
module M2982
-abstract U
+abstract type U end
macro bad(Y)
quote
- type $(esc(Y)) <: U
+ mutable struct $(esc(Y)) <: U
end
end
end
@@ -1169,7 +1169,7 @@ end
@test isa(f3821(), Array)
# issue #4075
-immutable Foo4075
+struct Foo4075
x::Int64
y::Float64
end
@@ -1202,7 +1202,7 @@ end
# TODO!!
# issue #4115
-#type Foo4115
+#mutable struct Foo4115
#end
#typealias Foo4115s NTuple{3,Union{Foo4115,Type{Foo4115}}}
#baz4115(x::Foo4115s) = x
@@ -1210,18 +1210,18 @@ end
# (Foo4115,Foo4115,Foo4115()))) == (Foo4115,Foo4115,Foo4115())
# issue #4129
-type Foo4129; end
+mutable struct Foo4129; end
-abstract Bar4129
+abstract type Bar4129 end
-type Bar41291 <: Bar4129
+mutable struct Bar41291 <: Bar4129
f::Foo4129
end
-type Bar41292 <: Bar4129
+mutable struct Bar41292 <: Bar4129
f::Foo4129
end
-type Baz4129
+mutable struct Baz4129
b::Bar4129
end
@@ -1233,15 +1233,15 @@ foo4129(a::Baz4129,args...) = foo4129(a,a.b,args...)
@test isa(foo4129(Baz4129(Bar41291(Foo4129())),1,2), Tuple{Baz4129,Bar4129,Foo4129,Int,Int})
# issue #4141
-type Vertex4141{N,T}; end
-type Face4141{V}; end
-type Hull4141{F<:Face4141}; end
+mutable struct Vertex4141{N,T}; end
+mutable struct Face4141{V}; end
+mutable struct Hull4141{F<:Face4141}; end
g4141(N,T) = Hull4141{Face4141{Vertex4141{N,T}}}()
@test isa(g4141(4,Int), Hull4141{Face4141{Vertex4141{4,Int}}})
# issue #4154
-type MyType4154{T}
+mutable struct MyType4154{T}
a1::T
a2
end
@@ -1254,11 +1254,11 @@ g4154() = typeof(foo4154(rand(2,2,2,2,2,2,2,2,2)))
@test g4154() === MyType4154{Array{Float64,9}}
# issue #4208
-type a4208
+mutable struct a4208
a4208
end
@test isa(a4208(5),a4208)
-type b4208
+mutable struct b4208
b4208() = (local b4208=1;new())
end
@test isa(b4208(),b4208)
@@ -1270,7 +1270,7 @@ convert_default_should_fail_here() = similar([1],typeof(zero(typeof(rand(2,2))))
# issue #4343
@test_throws ErrorException Array{Float64}{Int, 2}
-type Foo4376{T}
+mutable struct Foo4376{T}
x
Foo4376{T}(x::T) where T = new(x)
Foo4376{T}(a::Foo4376{Int}) where T = new(a.x)
@@ -1278,14 +1278,14 @@ end
@test isa(Foo4376{Float32}(Foo4376{Int}(2)), Foo4376{Float32})
-type _0_test_ctor_syntax_
+mutable struct _0_test_ctor_syntax_
_0_test_ctor_syntax_{T<:AbstractString}(files::Vector{T},step) = 0
end
# issue #4413
-type A4413 end
-type B4413 end
-type C4413 end
+mutable struct A4413 end
+mutable struct B4413 end
+mutable struct C4413 end
f4413(::Union{A4413, B4413, C4413}) = "ABC"
f4413(::Union{A4413, B4413}) = "AB"
g4413(::Union{A4413, C4413}) = "AC"
@@ -1351,7 +1351,7 @@ end
# issue #4681
# ccall should error if convert() returns something of the wrong type
-type Z4681
+mutable struct Z4681
x::Ptr{Void}
Z4681() = new(C_NULL)
end
@@ -1376,7 +1376,7 @@ end
@test b4688(1) == "an Int"
# issue #4731
-type SIQ{A,B} <: Number
+mutable struct SIQ{A,B} <: Number
x::A
end
import Base: promote_rule
@@ -1408,7 +1408,7 @@ end # module
@test (Lib4771.@make_closure)(0) == 1
# issue #4805
-abstract IT4805{N, T}
+abstract type IT4805{N, T} end
let
test0{T <: Int64}(::Type{IT4805{1, T}}, x) = x
@@ -1446,7 +1446,7 @@ f5150(T) = Array{Rational{T}}(1)
# issue #5165
-bitstype 64 T5165{S}
+primitive type T5165{S} 64 end
make_t(x::Int64) = Core.Intrinsics.bitcast(T5165{Void}, x)
xs5165 = T5165[make_t(Int64(1))]
b5165 = IOBuffer()
@@ -1456,7 +1456,7 @@ end
# support tuples as type parameters
-type TupleParam{P}
+mutable struct TupleParam{P}
x::Bool
end
@@ -1515,7 +1515,7 @@ end
@test isequal(tighttypes!(Any[Any[1.0,2.0],]), [1,2])
# issue #5142
-bitstype 64 Int5142
+primitive type Int5142 64 end
function h5142(a::Bool)
x=a ? (Int64(0),reinterpret(Int5142,Int64(0))) : (Int64(1),reinterpret(Int5142,Int64(1)))
x[2]::Int5142
@@ -1534,7 +1534,7 @@ try
f5142()
end
-bitstype 8 Int5142b
+primitive type Int5142b 8 end
function h5142b(a::Int)
x=((Int8(1),Int8(2)),(reinterpret(Int5142b,Int8(3)),reinterpret(Int5142b,Int8(4))))
x[a]::Tuple{Int8,Int8}
@@ -1553,7 +1553,7 @@ end
@test real(test_bits_tuples()) == 10
# issue #5374
-type FileObj5374
+mutable struct FileObj5374
io::IO
end
function read_file5374(fileobj)
@@ -1587,7 +1587,7 @@ f5584()
# issue #5884
-type Polygon5884{T<:Real}
+mutable struct Polygon5884{T<:Real}
points::Vector{Complex{T}}
end
@@ -1651,7 +1651,7 @@ test5536(a::Union{Real, AbstractArray}) = "Non-splatting"
# issue #6142
import Base: +
-type A6142 <: AbstractMatrix{Float64}; end
+mutable struct A6142 <: AbstractMatrix{Float64}; end
+{TJ}(x::A6142, y::UniformScaling{TJ}) = "UniformScaling method called"
+(x::A6142, y::AbstractArray) = "AbstractArray method called"
@test A6142() + I == "UniformScaling method called"
@@ -1675,11 +1675,11 @@ end
@test g6292() == 2
# issue #6404
-type type_2{T <: Integer, N} <: Number
+mutable struct type_2{T <: Integer, N} <: Number
x::T
type_2{T,N}(n::T) where {T<:Integer,N} = new(n)
end
-type type_1{T <: Number} <: Number
+mutable struct type_1{T <: Number} <: Number
x::Vector{T}
type_1{T}(x::Vector{T}) where T<:Number = new(x)
end
@@ -1753,12 +1753,12 @@ let
end
# issue #6387
-bitstype 64 Date6387{C}
+primitive type Date6387{C} 64 end
-type DateRange6387{C} <: Range{Date6387{C}}
+mutable struct DateRange6387{C} <: Range{Date6387{C}}
end
-type ObjMember
+mutable struct ObjMember
member::DateRange6387
end
@@ -1823,8 +1823,8 @@ let x = zeros(2)
end
# issue #6980
-abstract A6980
-type B6980 <: A6980 end
+abstract type A6980 end
+mutable struct B6980 <: A6980 end
f6980(::Union{Int, Float64}, ::A6980) = false
f6980(::Union{Int, Float64}, ::B6980) = true
@test f6980(1, B6980())
@@ -1881,7 +1881,7 @@ const (¬) = !
@test ¬false
# issue #7652
-type A7652
+mutable struct A7652
a :: Int
end
a7652 = A7652(0)
@@ -1918,7 +1918,7 @@ end
# issue #7582
aₜ = "a variable using Unicode 6"
-immutable My8156{A, B}
+struct My8156{A, B}
a::A
b::B
end
@@ -1929,7 +1929,7 @@ let m = My8156(nothing, 1)
end
# issue #8184
-immutable Foo8184
+struct Foo8184
x::Void
y::Void
z::Float64
@@ -1956,7 +1956,7 @@ let x = 10
@test x((3,)...) == 19
@test issue2403func(x) == 31
end
-type Issue2403
+mutable struct Issue2403
x
end
(i::Issue2403)(y) = i.x + 2y
@@ -2134,7 +2134,7 @@ g9535() = (f9535(),f9535())
@test g9535() == (3,4)
# weak references
-type Obj; x; end
+mutable struct Obj; x; end
@testset "weak references" begin
@noinline function mk_wr(r, wr)
x = Obj(1)
@@ -2169,7 +2169,7 @@ end
#issue #9835
module M9835
using Base.Test
- type A end; type B end
+ mutable struct A end; mutable struct B end
f() = (isa(A(), A) ? A : B)()
@test isa(f(), A)
end
@@ -2202,10 +2202,10 @@ y8d003 = 777
@test eval(:(string(:(f($($(x8d003...))))))) == "f(777)"
# issue #9378
-abstract Foo9378{T,S}
-immutable B9378{T} end
+abstract type Foo9378{T,S} end
+struct B9378{T} end
typealias FooB9378{T} Foo9378{T,B9378}
-immutable CFoo9378 <: FooB9378{Float64} end
+struct CFoo9378 <: FooB9378{Float64} end
@test isa(CFoo9378(),FooB9378)
# issue #10281
@@ -2223,7 +2223,7 @@ file = open(fname, "w")
redirect_stdout(file)
versioninfo()
try
- type Foo{T}
+ mutable struct Foo{T}
val::Bar{T}
end
end
@@ -2236,7 +2236,7 @@ end
# issue #10373
f10373(x) = x
g10373(x) = x
-type newtype10373
+mutable struct newtype10373
end
let f
for f in (f10373,g10373)
@@ -2257,7 +2257,7 @@ f7221(::AbstractVecOrMat) = 3
@test f7221(trues(1)) == 2
# issue #10570
-immutable Array_512_Uint8
+struct Array_512_Uint8
d1::UInt8
d2::UInt8
d3::UInt8
@@ -2824,7 +2824,7 @@ function func8283 end
@test_throws MethodError func8283()
# issue #11243
-type Type11243{A, B}
+mutable struct Type11243{A, B}
x::A
y::B
end
@@ -2852,7 +2852,7 @@ end
@test isa(f11295(:a,:b), Expr)
# issue #11675
-immutable T11675{T}
+struct T11675{T}
x::T
T11675{T}() where T = new()
end
@@ -2879,8 +2879,8 @@ f11715(x) = (x === Tuple{Any})
# part of #11597
# make sure invalid, partly-constructed types don't end up in the cache
-abstract C11597{T<:Union{Void, Int}}
-type D11597{T} <: C11597{T} d::T end
+abstract type C11597{T<:Union{Void, Int}} end
+mutable struct D11597{T} <: C11597{T} d::T end
@test_throws TypeError D11597(1.0)
@test_throws TypeError repr(D11597(1.0))
@@ -2914,12 +2914,12 @@ let a = (1:1000...),
end
# issue 11858
-type Foo11858
+mutable struct Foo11858
x::Float64
Foo11858(x::Float64) = new(x)
end
-type Bar11858
+mutable struct Bar11858
x::Float64
Bar11858(x::Float64) = new(x)
end
@@ -2948,7 +2948,7 @@ end
@test !isnull(foo11904(Nullable(1)))
# issue 11874
-immutable Foo11874
+struct Foo11874
x::Int
end
@@ -2989,7 +2989,7 @@ end
@test_throws ErrorException NTuple{-1, Int}
@test_throws TypeError Union{Int, 1}
-type FooNTuple{N}
+mutable struct FooNTuple{N}
z::Tuple{Integer, Vararg{Int, N}}
end
@test_throws ErrorException FooNTuple{-1}
@@ -2997,7 +2997,7 @@ end
@test_throws TypeError FooNTuple{0x01}
@test fieldtype(FooNTuple{0}, 1) == Tuple{Integer}
-type FooTupleT{T}
+mutable struct FooTupleT{T}
z::Tuple{Int, T, Int}
end
@test_throws TypeError FooTupleT{Vararg{Int, 2}}
@@ -3011,13 +3011,13 @@ const DATE12003 = DateTime(1917,1,1)
failure12003(dt=DATE12003) = Dates.year(dt)
@test isa(failure12003(), Integer)
-# issue #12023 Test error checking in bitstype
-@test_throws ErrorException (@eval bitstype 0 SPJa12023)
-@test_throws ErrorException (@eval bitstype 4294967312 SPJb12023)
-@test_throws ErrorException (@eval bitstype -4294967280 SPJc12023)
+# issue #12023 Test error checking in primitive type
+@test_throws ErrorException (@eval primitive type 0 SPJa12023 end)
+@test_throws ErrorException (@eval primitive type 4294967312 SPJb12023 end)
+@test_throws ErrorException (@eval primitive type -4294967280 SPJc12023 end)
# issue #12089
-type A12089{K, N}
+mutable struct A12089{K, N}
sz::NTuple{N, Int}
A12089{K,N}(sz::NTuple{N, Int}) where {K,N} = new(sz)
end
@@ -3037,7 +3037,7 @@ g12063() = f12063(0, 0, 0, 0, 0, 0, 0.0, spzeros(0,0), Int[])
@test g12063() == 1
# issue #11587
-type Sampler11587{N}
+mutable struct Sampler11587{N}
clampedpos::Array{Int,2}
buf::Array{Float64,N}
end
@@ -3048,34 +3048,34 @@ end
@test isa(Sampler11587(), Sampler11587{2})
# issue #8010 - error when convert returns wrong type during new()
-immutable Vec8010{T}
+struct Vec8010{T}
x::T
y::T
end
Vec8010(a::AbstractVector) = Vec8010(ntuple(x->a[x],2)...)
Base.convert{T}(::Type{Vec8010{T}},x::AbstractVector) = Vec8010(x)
Base.convert(::Type{Void},x::AbstractVector) = Vec8010(x)
-immutable MyType8010
+struct MyType8010
m::Vec8010{Float32}
end
-immutable MyType8010_ghost
+struct MyType8010_ghost
m::Void
end
@test_throws TypeError MyType8010([3.0;4.0])
@test_throws TypeError MyType8010_ghost([3.0;4.0])
# don't allow redefining types if ninitialized changes
-immutable NInitializedTestType
+struct NInitializedTestType
a
end
-@test_throws ErrorException @eval immutable NInitializedTestType
+@test_throws ErrorException @eval struct NInitializedTestType
a
NInitializedTestType() = new()
end
# issue #12394
-type Empty12394 end
+mutable struct Empty12394 end
let x = Array{Empty12394}(1), y = [Empty12394()]
@test_throws UndefRefError x==y
@test_throws UndefRefError y==x
@@ -3094,11 +3094,11 @@ test_eq_array_int() = ===(const_array_int1, const_array_int2)
@test test_eq_array_int()
# object_id of haspadding field
-immutable HasPadding
+struct HasPadding
x::Bool
y::Int
end
-immutable HasHasPadding
+struct HasHasPadding
x::HasPadding
end
hashaspadding = HasHasPadding(HasPadding(true,1))
@@ -3163,7 +3163,7 @@ for j = 1:1
end
# PR 11888
-immutable A11888{T}
+struct A11888{T}
a::NTuple{16,T}
end
@@ -3172,8 +3172,8 @@ typealias B11888{T} A11888{A11888{A11888{T}}}
@test sizeof(B11888{B11888{Int64}}) == (1 << 24) * 8
# issue #13175
-immutable EmptyImmutable13175 end
-immutable EmptyIIOtherField13175
+struct EmptyImmutable13175 end
+struct EmptyIIOtherField13175
x::EmptyImmutable13175
y::Float64
end
@@ -3185,7 +3185,7 @@ gg13183{X}(x::X...) = 1==0 ? gg13183(x, x) : 0
@test gg13183(5) == 0
# issue 8932 (llvm return type legalizer error)
-immutable Vec3_8932
+struct Vec3_8932
x::Float32
y::Float32
z::Float32
@@ -3216,12 +3216,12 @@ end
@test f13432b(false) == false
#13433, read!(::IO, a::Vector{UInt8}) should return a
-type IO13433 <: IO end
+mutable struct IO13433 <: IO end
Base.read(::IO13433, ::Type{UInt8}) = 0x01
@test read!(IO13433(), Array{UInt8}(4)) == [0x01, 0x01, 0x01, 0x01]
# issue #13647, comparing boxed isbits immutables
-immutable X13647
+struct X13647
a::Int
b::Bool
end
@@ -3248,8 +3248,8 @@ end
# issue #11327 and #13547
@test_throws MethodError convert(Type{Int}, Float32)
@test_throws MethodError Array{Type{Int64}}([Float32])
-abstract A11327
-abstract B11327 <: A11327
+abstract type A11327 end
+abstract type B11327 <: A11327 end
f11327{T}(::Type{T},x::T) = x
@test_throws MethodError f11327(Type{A11327},B11327)
@@ -3356,7 +3356,7 @@ end
@test __f_isa_arg_1() == 1
# issue #14477
-immutable Z14477
+struct Z14477
fld::Z14477
Z14477() = new(new())
end
@@ -3410,7 +3410,7 @@ end
@test isa(object_id(Tuple.name.cache), Integer)
# issue #14691
-type T14691; a::UInt; end
+mutable struct T14691; a::UInt; end
@test (T14691(0).a = 0) === 0
# issue #14245
@@ -3452,7 +3452,7 @@ f10985(::Any...) = 1
@test f10985(1, 2, 3) == 1
# a tricky case for closure conversion
-type _CaptureInCtor
+mutable struct _CaptureInCtor
yy
function _CaptureInCtor(list_file::AbstractString="")
y = 0
@@ -3476,14 +3476,14 @@ let
end
# issue #14825
-abstract abstest_14825
+abstract type abstest_14825 end
-type t1_14825{A <: abstest_14825, B}
+mutable struct t1_14825{A <: abstest_14825, B}
x::A
y::B
end
-type t2_14825{C, B} <: abstest_14825
+mutable struct t2_14825{C, B} <: abstest_14825
x::C
y::t1_14825{t2_14825{C, B}, B}
end
@@ -3943,7 +3943,7 @@ end
end
# issue #8712
-type Issue8712; end
+mutable struct Issue8712; end
@test isa(invoke(Issue8712, Tuple{}), Issue8712)
# issue #16089
@@ -4124,8 +4124,8 @@ undefined_x16090 = (Int,)
@test_throws TypeError f16090()
# issue #12238
-type A12238{T} end
-type B12238{T,S}
+mutable struct A12238{T} end
+mutable struct B12238{T,S}
a::A12238{B12238{Int,S}}
end
@test B12238.body.body.types[1] === A12238{B12238{Int}.body}
@@ -4163,11 +4163,11 @@ end
@test @inferred(f16431(1)) == 4
# issue #14878
-type A14878
+mutable struct A14878
ext
end
A14878() = A14878(Dict())
-type B14878
+mutable struct B14878
end
B14878(ng) = B14878()
function trigger14878()
@@ -4206,7 +4206,7 @@ end
@test where1090([4]) === 6
@test_throws MethodError where1090(String[])
-type A1090 end
+mutable struct A1090 end
Base.convert(::Type{Int}, ::A1090) = "hey"
f1090()::Int = A1090()
@test_throws TypeError f1090()
@@ -4224,13 +4224,13 @@ end
@test f16783()() == 1
# issue #16767
-type A16767{T}
+mutable struct A16767{T}
a::Base.RefValue{T}
end
-type B16767{T}
+mutable struct B16767{T}
b::A16767{B16767{T}}
end
-type C16767{T}
+mutable struct C16767{T}
b::A16767{C16767{:a}}
end
@test B16767.body.types[1].types[1].parameters[1].types[1] === A16767{B16767.body}
@@ -4249,11 +4249,11 @@ end
# issue #16793
try
- abstract T16793
+ abstract type T16793 end
catch
end
@test isa(T16793, Type)
-@test isa(abstract T16793_2, Void)
+@test isa(abstract type T16793_2 end, Void)
# issue #17147
f17147(::Tuple) = 1
@@ -4343,7 +4343,7 @@ ptr18236 = cfunction(identity, VecElement{Float64}, Tuple{VecElement{Float64}})
(VecElement{Float64},), $v18236)
@test f18236(ptr18236) === v18236
@test !contains(sprint(code_llvm, f18236, Tuple{Ptr{Void}}), "double undef")
-# VecElement of struct type, not necessarily useful but does have special
+# VecElement of struct, not necessarily useful but does have special
# ABI so should be handled correctly
# This struct should be small enough to be passed by value in C ABI
# in order to trigger the problematic code path.
@@ -4612,7 +4612,7 @@ f19599{T}(x::((S)->Vector{S})(T)...) = 1
# avoiding StackOverflowErrors (issues #12007, #10326, #15736)
module SOE
-type Sgnd <: Signed
+mutable struct Sgnd <: Signed
v::Int
end
using Base.Test
@@ -4620,7 +4620,7 @@ using Base.Test
io = IOBuffer()
@test_throws ErrorException show(io, Sgnd(1)) #12007
-immutable MyTime <: Dates.TimeType
+struct MyTime <: Dates.TimeType
value::Int
end
@test_throws ErrorException isless(MyTime(1), now())
diff --git a/test/dict.jl b/test/dict.jl
index 3fbb3dd73bc3d..916c764366e40 100644
--- a/test/dict.jl
+++ b/test/dict.jl
@@ -168,7 +168,7 @@ let
end
# issue #1438
-type I1438T
+mutable struct I1438T
id
end
import Base.hash
@@ -308,7 +308,7 @@ let d = Dict((1=>2) => (3=>45), (3=>10) => (10=>11))
end
# issue #9463
-type Alpha end
+mutable struct Alpha end
Base.show(io::IO, ::Alpha) = print(io,"α")
let sbuff = IOBuffer(),
io = Base.IOContext(sbuff, limit=true, displaysize=(10, 20))
@@ -359,7 +359,7 @@ let d = Dict()
end
# issue #10647
-type T10647{T}; x::T; end
+mutable struct T10647{T}; x::T; end
let a = ObjectIdDict()
a[1] = a
a[a] = 2
@@ -514,7 +514,7 @@ let d = Dict(zip(1:1000,1:1000)), f = (k,v) -> iseven(k)
end
# issue #15077
-immutable MyString <: AbstractString
+struct MyString <: AbstractString
str::String
end
import Base.==
@@ -565,7 +565,7 @@ let badKeys = [
end
end
-immutable MyInt <: Integer
+struct MyInt <: Integer
val::UInt
end
@@ -651,7 +651,7 @@ end
@test hash(a) != hash(b)
end
-type Foo_15776
+mutable struct Foo_15776
x::Vector{Pair{Tuple{Function, Vararg{Int}}, Int}}
end
@testset "issue #15776, convert for pair" begin
@@ -667,7 +667,7 @@ end
@test_throws UndefVarError Dict(x => y for x in 1:10)
end
-type Error19179 <: Exception
+mutable struct Error19179 <: Exception
end
@testset "issue #19179 throwing error in dict constructor" begin
diff --git a/test/docs.jl b/test/docs.jl
index ae0d7ffdbdc42..631835ea0689f 100644
--- a/test/docs.jl
+++ b/test/docs.jl
@@ -26,7 +26,7 @@ end
docstring_startswith(d1::DocStr, d2) = docstring_startswith(parsedoc(d1), d2)
@doc "Doc abstract type" ->
-abstract C74685{T,N} <: AbstractArray{T,N}
+abstract type C74685{T,N} <: AbstractArray{T,N} end
@test stringmime("text/plain", Docs.doc(C74685))=="Doc abstract type\n"
macro macro_doctest() end
@@ -73,16 +73,16 @@ end
function g end
"AT"
-abstract AT
+abstract type AT end
"BT"
-bitstype 8 BT
+primitive type BT 8 end
"BT2"
-bitstype 8 BT2 <: Integer
+primitive type BT2 <: Integer 8 end
"T"
-type T <: AT
+mutable struct T <: AT
"T.x"
x
"T.y"
@@ -90,7 +90,7 @@ type T <: AT
end
"IT"
-immutable IT
+struct IT
"IT.x"
x :: Int
"IT.y"
@@ -132,7 +132,7 @@ t(::Int, ::Any)
t{S <: Integer}(::S)
"FieldDocs"
-type FieldDocs
+mutable struct FieldDocs
"one"
one
doc"two"
@@ -152,7 +152,7 @@ import .Inner.@m
"Inner.@m"
:@m
-type Foo
+mutable struct Foo
x
end
@@ -316,10 +316,10 @@ macro m() end
const C = 1
"A"
-abstract A
+abstract type A end
"T"
-type T
+mutable struct T
"x"
x
"y"
@@ -415,7 +415,7 @@ end
module DocVars
-immutable __FIELDS__ end
+struct __FIELDS__ end
function Docs.formatdoc(buffer, docstr, ::Type{__FIELDS__})
fields = get(docstr.data, :fields, Dict())
@@ -432,7 +432,7 @@ end
$__FIELDS__
"""
-type T
+mutable struct T
"x"
x
"y"
@@ -445,7 +445,7 @@ end
$__FIELDS__
"""
-type S
+mutable struct S
x
y
z
@@ -506,7 +506,7 @@ end
module I15424
-immutable LazyHelp
+struct LazyHelp
text
end
@@ -594,7 +594,7 @@ end
module I12515
-immutable EmptyType{T} end
+struct EmptyType{T} end
"A new method"
Base.collect{T}(::Type{EmptyType{T}}) = "borked"
@@ -696,12 +696,12 @@ end
module Undocumented
-abstract A
-abstract B <: A
+abstract type A end
+abstract type B <: A end
-type C <: A end
+mutable struct C <: A end
-immutable D <: B
+struct D <: B
one
two::String
three::Float64
@@ -727,7 +727,7 @@ No documentation found.
**Summary:**
```
-abstract $(curmod_prefix)Undocumented.A <: Any
+abstract type $(curmod_prefix)Undocumented.A <: Any
```
**Subtypes:**
@@ -743,7 +743,7 @@ No documentation found.
**Summary:**
```
-abstract $(curmod_prefix)Undocumented.B <: $(curmod_prefix)Undocumented.A
+abstract type $(curmod_prefix)Undocumented.B <: $(curmod_prefix)Undocumented.A
```
**Subtypes:**
@@ -758,7 +758,7 @@ No documentation found.
**Summary:**
```
-type $(curmod_prefix)Undocumented.C <: $(curmod_prefix)Undocumented.A
+mutable struct $(curmod_prefix)Undocumented.C <: $(curmod_prefix)Undocumented.A
```
""")
@test docstrings_equal(@doc(Undocumented.C), doc"$doc_str")
@@ -768,7 +768,7 @@ No documentation found.
**Summary:**
```
-immutable $(curmod_prefix)Undocumented.D <: $(curmod_prefix)Undocumented.B
+struct $(curmod_prefix)Undocumented.D <: $(curmod_prefix)Undocumented.B
```
**Fields:**
@@ -935,7 +935,7 @@ end
# Dynamic docstrings
-type DynamicDocType
+mutable struct DynamicDocType
x
end
@@ -958,4 +958,4 @@ dynamic_test.x = "test 2"
@test HTML("docstring") == HTML("docstring")
@test Text("docstring1") ≠ Text("docstring2")
@test hash(Text("docstring1")) ≠ hash(Text("docstring2"))
-@test hash(Text("docstring")) ≠ hash(HTML("docstring"))
\ No newline at end of file
+@test hash(Text("docstring")) ≠ hash(HTML("docstring"))
diff --git a/test/inference.jl b/test/inference.jl
index e3e57b8f06648..10095be45fb5d 100644
--- a/test/inference.jl
+++ b/test/inference.jl
@@ -23,7 +23,7 @@ end
# issue #1628
-type I1628{X}
+mutable struct I1628{X}
x::X
end
let
@@ -65,16 +65,16 @@ end
# issue #5906
-abstract Outer5906{T}
+abstract type Outer5906{T} end
-immutable Inner5906{T}
+struct Inner5906{T}
a:: T
end
-immutable Empty5906{T} <: Outer5906{T}
+struct Empty5906{T} <: Outer5906{T}
end
-immutable Hanoi5906{T} <: Outer5906{T}
+struct Hanoi5906{T} <: Outer5906{T}
a::T
succ :: Outer5906{Inner5906{T}}
Hanoi5906{T}(a) where T = new(a, Empty5906{Inner5906{T}}())
@@ -91,13 +91,13 @@ end
# issue on the flight from DFW
# (type inference deducing Type{:x} rather than Symbol)
-type FooBarDFW{s}; end
+mutable struct FooBarDFW{s}; end
fooDFW(p::Type{FooBarDFW}) = string(p.parameters[1])
fooDFW(p) = string(p.parameters[1])
@test fooDFW(FooBarDFW{:x}) == "x" # not ":x"
# Type inference for tuple parameters
-immutable fooTuple{s}; end
+struct fooTuple{s}; end
barTuple1() = fooTuple{(:y,)}()
barTuple2() = fooTuple{tuple(:y)}()
@@ -124,8 +124,8 @@ Base.return_types(getindex, (Vector{nothing},))
# issue #12636
module MyColors
-abstract Paint{T}
-immutable RGB{T<:AbstractFloat} <: Paint{T}
+abstract type Paint{T} end
+struct RGB{T<:AbstractFloat} <: Paint{T}
r::T
g::T
b::T
@@ -148,13 +148,13 @@ f12826{I<:Integer}(v::Vector{I}) = v[1]
# non-terminating inference, issue #14009
# non-terminating codegen, issue #16201
-type A14009{T}; end
+mutable struct A14009{T}; end
A14009{T}(a::T) = A14009{T}()
f14009(a) = rand(Bool) ? f14009(A14009(a)) : a
code_typed(f14009, (Int,))
code_llvm(DevNull, f14009, (Int,))
-type B14009{T}; end
+mutable struct B14009{T}; end
g14009(a) = g14009(B14009{a})
code_typed(g14009, (Type{Int},))
code_llvm(DevNull, f14009, (Int,))
@@ -199,7 +199,7 @@ end
# pr #15259
-immutable A15259
+struct A15259
x
y
end
@@ -217,7 +217,7 @@ end
# issue #7810
-type Foo7810{T<:AbstractVector}
+mutable struct Foo7810{T<:AbstractVector}
v::T
end
bar7810() = [Foo7810([(a,b) for a in 1:2]) for b in 3:4]
@@ -310,11 +310,11 @@ let f(x) = (x===nothing) ? 1 : 1.0
end
# issue #16530
-type Foo16530a{dim}
+mutable struct Foo16530a{dim}
c::Vector{NTuple{dim, Float64}}
d::Vector
end
-type Foo16530b{dim}
+mutable struct Foo16530b{dim}
c::Vector{NTuple{dim, Float64}}
end
f16530a() = fieldtype(Foo16530a, :c)
@@ -348,7 +348,7 @@ let T1 = Tuple{Int, Float64},
end
# issue #18015
-type Triple18015
+mutable struct Triple18015
a::Int
b::Int
c::Int
@@ -371,7 +371,7 @@ g18222(x) = f18222(x)
# issue #18399
# TODO: this test is rather brittle
-type TSlow18399{T}
+mutable struct TSlow18399{T}
x::T
end
function hvcat18399(as)
@@ -485,14 +485,14 @@ end
@test Type{Tuple{Vararg{Int}}} <: Base.return_types(maybe_vararg_tuple_2, ())[1]
# inference of `fieldtype`
-type UndefField__
+mutable struct UndefField__
x::Union{}
end
f_infer_undef_field() = fieldtype(UndefField__, :x)
@test Base.return_types(f_infer_undef_field, ()) == Any[Type{Union{}}]
@test f_infer_undef_field() === Union{}
-type HasAbstractlyTypedField
+mutable struct HasAbstractlyTypedField
x::Union{Int,String}
end
f_infer_abstract_fieldtype() = fieldtype(HasAbstractlyTypedField, :x)
@@ -528,8 +528,8 @@ test_fast_le(a, b) = @fastmath a <= b
@inferred test_fast_lt(1.0, 1.0)
@inferred test_fast_le(1.0, 1.0)
-abstract AbstractMyType18457{T,F,G}
-immutable MyType18457{T,F,G}<:AbstractMyType18457{T,F,G} end
+abstract type AbstractMyType18457{T,F,G} end
+struct MyType18457{T,F,G}<:AbstractMyType18457{T,F,G} end
tpara18457{I}(::Type{AbstractMyType18457{I}}) = I
tpara18457{A<:AbstractMyType18457}(::Type{A}) = tpara18457(supertype(A))
@test tpara18457(MyType18457{true}) === true
@@ -579,7 +579,7 @@ f_inferred_union_int(::Any) = "broken"
@test @inferred(f_inferred_union()) in (1, 2, 3)
# issue #11015
-type AT11015
+mutable struct AT11015
f::Union{Bool,Function}
end
@@ -601,7 +601,7 @@ let pub = Base.parameter_upper_bound, x = fComplicatedUnionAll(Real)
end
# issue #20267
-type T20267{T}
+mutable struct T20267{T}
inds::Vector{T}
end
# infinite type growth via lower bounds (formed by intersection)
diff --git a/test/int.jl b/test/int.jl
index 1ae1922694cbc..00708302a21a1 100644
--- a/test/int.jl
+++ b/test/int.jl
@@ -86,7 +86,7 @@ end
@test round(UInt8, 123) == 123
@test mod(123, UInt8) == 0x7b
-bitstype 8 MyBitsType <: Integer
+primitive type MyBitsType <: Integer 8 end
@test_throws MethodError ~reinterpret(MyBitsType, 0x7b)
UItypes = Base.BitUnsigned_types
diff --git a/test/intrinsics.jl b/test/intrinsics.jl
index dedc4662e1b1c..03f306c1ba684 100644
--- a/test/intrinsics.jl
+++ b/test/intrinsics.jl
@@ -16,7 +16,7 @@ let f = Any[Core.Intrinsics.add_int, Core.Intrinsics.sub_int]
end
# issue #4581
-bitstype 64 Date4581{T}
+primitive type Date4581{T} 64 end
let
x = Core.Intrinsics.bitcast(Date4581{Int}, Int64(1234))
xs = Date4581[x]
@@ -34,8 +34,8 @@ let d = Core.Intrinsics.bitcast(Date4581{Int}, Int64(1))
@test isa(f6591(d), Date4581)
end
-# test functionality of non-power-of-2 bitstype constants
-bitstype 24 Int24
+# test functionality of non-power-of-2 primitive type constants
+primitive type Int24 24 end
Int24(x::Int) = Core.Intrinsics.trunc_int(Int24, x)
Int(x::Int24) = Core.Intrinsics.zext_int(Int, x)
let x, y, f
diff --git a/test/keywordargs.jl b/test/keywordargs.jl
index efe02e48f5faa..e724448d88374 100644
--- a/test/keywordargs.jl
+++ b/test/keywordargs.jl
@@ -172,7 +172,7 @@ end
@test (@TEST4538_3) == 3
# issue #4801
-type T4801{X}
+mutable struct T4801{X}
T4801{X}(;k=0) where X = new()
end
@test isa(T4801{Any}(k=0), T4801{Any})
diff --git a/test/linalg/arnoldi.jl b/test/linalg/arnoldi.jl
index 494e9d73e9007..0b66a85c713e9 100644
--- a/test/linalg/arnoldi.jl
+++ b/test/linalg/arnoldi.jl
@@ -105,7 +105,7 @@ end
# Example from Quantum Information Theory
import Base: size, issymmetric, ishermitian
-type CPM{T<:Base.LinAlg.BlasFloat}<:AbstractMatrix{T} # completely positive map
+mutable struct CPM{T<:Base.LinAlg.BlasFloat}<:AbstractMatrix{T} # completely positive map
kraus::Array{T,3} # kraus operator representation
end
size(Phi::CPM)=(size(Phi.kraus,1)^2,size(Phi.kraus,3)^2)
diff --git a/test/linalg/generic.jl b/test/linalg/generic.jl
index bc1f165284bf8..d6441fd442e88 100644
--- a/test/linalg/generic.jl
+++ b/test/linalg/generic.jl
@@ -5,7 +5,7 @@ using Base.Test
# A custom Quaternion type with minimal defined interface and methods.
# Used to test scale and scale! methods to show non-commutativity.
-immutable Quaternion{T<:Real} <: Number
+struct Quaternion{T<:Real} <: Number
s::T
v1::T
v2::T
diff --git a/test/linalg/matmul.jl b/test/linalg/matmul.jl
index 44421f3190e92..7ee9e13b85eeb 100644
--- a/test/linalg/matmul.jl
+++ b/test/linalg/matmul.jl
@@ -71,7 +71,7 @@ end
# Generic AbstractArrays
module MyArray15367
using Base.Test
- immutable MyArray{T,N} <: AbstractArray{T,N}
+ struct MyArray{T,N} <: AbstractArray{T,N}
data::Array{T,N}
end
@@ -321,7 +321,7 @@ let
end
# Number types that lack conversion to the destination type (#14293)
-immutable RootInt
+struct RootInt
i::Int
end
import Base: *, transpose
@@ -398,14 +398,14 @@ end
module TestPR18218
using Base.Test
import Base.*, Base.+, Base.zero
- immutable TypeA
+ struct TypeA
x::Int
end
Base.convert(::Type{TypeA}, x::Int) = TypeA(x)
- immutable TypeB
+ struct TypeB
x::Int
end
- immutable TypeC
+ struct TypeC
x::Int
end
Base.convert(::Type{TypeC}, x::Int) = TypeC(x)
diff --git a/test/loading.jl b/test/loading.jl
index 748b5f28df5a6..4fbb04d083bd6 100644
--- a/test/loading.jl
+++ b/test/loading.jl
@@ -50,7 +50,7 @@ push!(LOAD_PATH, dir)
LOAD_PATH[end] = GenericString(LOAD_PATH[end])
@test Base.find_in_path("test_sourcepath") == joinpath(dir, "test_sourcepath.jl")
-immutable CustomLoader
+struct CustomLoader
path::String
end
push!(LOAD_PATH, CustomLoader("abc"))
diff --git a/test/markdown.jl b/test/markdown.jl
index ad0ee9dcca35f..24298f1447020 100644
--- a/test/markdown.jl
+++ b/test/markdown.jl
@@ -407,7 +407,7 @@ for (input, output) in (
end
# Interpolation / Custom types
-type Reference
+mutable struct Reference
ref
end
diff --git a/test/misc.jl b/test/misc.jl
index 2c4e09598b0dd..5a99ac9691930 100644
--- a/test/misc.jl
+++ b/test/misc.jl
@@ -226,10 +226,10 @@ end
# test methodswith
# `methodswith` relies on exported symbols
export func4union, Base
-immutable NoMethodHasThisType end
+struct NoMethodHasThisType end
@test isempty(methodswith(NoMethodHasThisType))
@test !isempty(methodswith(Int))
-immutable Type4Union end
+struct Type4Union end
func4union(::Union{Type4Union,Int}) = ()
@test !isempty(methodswith(Type4Union))
@@ -599,10 +599,10 @@ let
end
end
-abstract DA_19281{T, N} <: AbstractArray{T, N}
+abstract type DA_19281{T, N} <: AbstractArray{T, N} end
Base.convert{S,T,N}(::Type{Array{S, N}}, ::DA_19281{T, N}) = error()
x_19281 = [(), (1,)]
-type Foo_19281
+mutable struct Foo_19281
f::Vector{Tuple}
Foo_19281() = new(x_19281)
end
@@ -620,7 +620,7 @@ let
@test isassigned(x_defined)
end
-type Demo_20254
+mutable struct Demo_20254
arr::Array{String}
end
diff --git a/test/netload/memtest.jl b/test/netload/memtest.jl
index fda4b973e2f39..b69b35dec658f 100644
--- a/test/netload/memtest.jl
+++ b/test/netload/memtest.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-immutable RUsage
+struct RUsage
ru_utime_sec::Clong # user CPU time used
ru_utime_usec::Clong # user CPU time used
ru_stime_sec::Clong # system CPU time used
diff --git a/test/nullable.jl b/test/nullable.jl
index cf103f2e203e6..6cf58550c2ff3 100644
--- a/test/nullable.jl
+++ b/test/nullable.jl
@@ -67,7 +67,7 @@ for T in types
end
-# immutable NullException <: Exception
+# struct NullException <: Exception
@test isa(NullException(), NullException)
@test_throws NullException throw(NullException())
@@ -283,7 +283,7 @@ for T in types
@test hash(x3) != hash(x4)
end
-type TestNType{T}
+mutable struct TestNType{T}
v::Nullable{T}
end
diff --git a/test/offsetarray.jl b/test/offsetarray.jl
index 45240f75d1cdb..3b35ca9880a76 100644
--- a/test/offsetarray.jl
+++ b/test/offsetarray.jl
@@ -406,7 +406,7 @@ end # let
# (#18107)
module SimilarUR
using Base.Test
- immutable MyURange <: AbstractUnitRange{Int}
+ struct MyURange <: AbstractUnitRange{Int}
start::Int
stop::Int
end
diff --git a/test/operators.jl b/test/operators.jl
index 5953e1143183a..a95e2a24dc3da 100644
--- a/test/operators.jl
+++ b/test/operators.jl
@@ -73,7 +73,7 @@ let xs = [[i:i+4;] for i in 1:10]
end
# issue #19714
-immutable T19714 <: Integer end
+struct T19714 <: Integer end
Base.float(::T19714) = 19714.0
Base.:/(::T19714, ::T19714) = T19714()
Base.convert(::Type{T19714}, ::Int) = T19714()
diff --git a/test/parallel_exec.jl b/test/parallel_exec.jl
index 9468fec5b9972..4d6b030ccd05a 100644
--- a/test/parallel_exec.jl
+++ b/test/parallel_exec.jl
@@ -463,7 +463,7 @@ map!(x->1, d, d)
@test 3.0 == remotecall_fetch(D->D[1], id_other, Base.shmem_fill(3.0, 1; pids=[id_me, id_other]))
# Shared arrays of singleton immutables
-@everywhere immutable ShmemFoo end
+@everywhere struct ShmemFoo end
for T in [Void, ShmemFoo]
s = @inferred(SharedArray{T}(10))
@test T() === remotecall_fetch(x->x[3], workers()[1], s)
@@ -1075,7 +1075,7 @@ end
@test remotecall_fetch(x->(y->2y)(x)+1, workers()[1], 3) == 7
# issue #16091
-type T16091 end
+mutable struct T16091 end
wid = workers()[1]
@test try
remotecall_fetch(()->T16091, wid)
@@ -1294,7 +1294,7 @@ end
@everywhere begin
global testsercnt_d = Dict()
- type TestSerCnt
+ mutable struct TestSerCnt
v
end
import Base.hash, Base.==
@@ -1466,7 +1466,7 @@ test_clear(syms, workers())
# Test partial recovery from a deserialization error in CapturedException
try
expr = quote
- type DontExistOn1
+ mutable struct DontExistOn1
x
end
throw(BoundsError(DontExistOn1(1), 1))
diff --git a/test/parse.jl b/test/parse.jl
index 93227a3c27354..7e9c847a23b9d 100644
--- a/test/parse.jl
+++ b/test/parse.jl
@@ -646,12 +646,12 @@ end
for (str, tag) in Dict("" => :none, "\"" => :string, "#=" => :comment, "'" => :char,
"`" => :cmd, "begin;" => :block, "quote;" => :block,
"let;" => :block, "for i=1;" => :block, "function f();" => :block,
- "f() do x;" => :block, "module X;" => :block, "type X;" => :block,
- "immutable X;" => :block, "(" => :other, "[" => :other,
+ "f() do x;" => :block, "module X;" => :block, "mutable struct X;" => :block,
+ "struct X;" => :block, "(" => :other, "[" => :other,
"begin" => :other, "quote" => :other,
"let" => :other, "for" => :other, "function" => :other,
- "f() do" => :other, "module" => :other, "type" => :other,
- "immutable" => :other)
+ "f() do" => :other, "module" => :other, "mutable struct" => :other,
+ "struct" => :other)
@test Base.incomplete_tag(parse(str, raise=false)) == tag
end
@@ -851,7 +851,7 @@ end
# issue 18756
module Mod18756
-type Type
+mutable struct Type
end
end
@test method_exists(Mod18756.Type, ())
diff --git a/test/perf/array/indexing.jl b/test/perf/array/indexing.jl
index 7f6a559f3a33b..0f6af0e181919 100644
--- a/test/perf/array/indexing.jl
+++ b/test/perf/array/indexing.jl
@@ -104,12 +104,12 @@ function sumvector(A, n)
s
end
-abstract MyArray{T,N} <: AbstractArray{T,N}
+abstract type MyArray{T,N} <: AbstractArray{T,N} end
-immutable ArrayLS{T,N} <: MyArray{T,N} # LinearSlow
+struct ArrayLS{T,N} <: MyArray{T,N} # LinearSlow
data::Array{T,N}
end
-immutable ArrayLSLS{T,N} <: MyArray{T,N} # LinearSlow with LinearSlow similar
+struct ArrayLSLS{T,N} <: MyArray{T,N} # LinearSlow with LinearSlow similar
data::Array{T,N}
end
Base.similar{T}(A::ArrayLSLS, ::Type{T}, dims::Tuple{Vararg{Int}}) = ArrayLSLS(similar(A.data, T, dims))
@@ -117,16 +117,16 @@ Base.similar{T}(A::ArrayLSLS, ::Type{T}, dims::Tuple{Vararg{Int}}) = ArrayLSLS(s
@inline Base.unsafe_setindex!(A::ArrayLSLS, v, I::Int...) = Base.unsafe_setindex!(A.data, v, I...)
Base.first(A::ArrayLSLS) = first(A.data)
-immutable ArrayLF{T,N} <: MyArray{T,N} # LinearFast
+struct ArrayLF{T,N} <: MyArray{T,N} # LinearFast
data::Array{T,N}
end
-immutable ArrayStrides{T,N} <: MyArray{T,N}
+struct ArrayStrides{T,N} <: MyArray{T,N}
data::Array{T,N}
strides::NTuple{N,Int}
end
ArrayStrides(A::Array) = ArrayStrides(A, strides(A))
-immutable ArrayStrides1{T} <: MyArray{T,2}
+struct ArrayStrides1{T} <: MyArray{T,2}
data::Matrix{T}
stride1::Int
end
diff --git a/test/perf/kernel/actor_centrality.jl b/test/perf/kernel/actor_centrality.jl
index 4bc1f453742ab..ae792ed804064 100644
--- a/test/perf/kernel/actor_centrality.jl
+++ b/test/perf/kernel/actor_centrality.jl
@@ -1,6 +1,6 @@
# This file is a part of Julia. License is MIT: http://julialang.org/license
-type Node
+mutable struct Node
name::String
n::Set{Node}
diff --git a/test/perf/kernel/go_benchmark.jl b/test/perf/kernel/go_benchmark.jl
index 2f31b52a7bf0b..8b821bb356d0a 100644
--- a/test/perf/kernel/go_benchmark.jl
+++ b/test/perf/kernel/go_benchmark.jl
@@ -20,7 +20,7 @@ const WHITE_TERRITORY = 3
const BLACK_TERRITORY = 4
const UNKNOWN = 5
-type XorRand
+mutable struct XorRand
state::UInt32
end
@@ -42,7 +42,7 @@ const deltai = (-1, 1, 0, 0)
const deltaj = (0, 0, -1, 1)
neighbor(i::Int, j::Int, k::Int) = (i + deltai[k], j + deltaj[k])
-type Board
+mutable struct Board
size::Int
komi::Float64
diff --git a/test/perf/kernel/perf.jl b/test/perf/kernel/perf.jl
index 1b6b30a888f5c..620a508365a7d 100644
--- a/test/perf/kernel/perf.jl
+++ b/test/perf/kernel/perf.jl
@@ -2,12 +2,12 @@
include("../perfutil.jl")
-abstract List{T}
+abstract type List{T} end
-type Nil{T} <: List{T}
+mutable struct Nil{T} <: List{T}
end
-type Cons{T} <: List{T}
+mutable struct Cons{T} <: List{T}
head::T
tail::List{T}
end
diff --git a/test/perf/kernel/raytracer.jl b/test/perf/kernel/raytracer.jl
index e1ac918e9fb39..5601143bf7a22 100644
--- a/test/perf/kernel/raytracer.jl
+++ b/test/perf/kernel/raytracer.jl
@@ -11,7 +11,7 @@
const delta = sqrt(eps(Float64))
-immutable Vec
+struct Vec
x::Float64
y::Float64
z::Float64
@@ -25,19 +25,19 @@ import Base: +, -, *
dot(a::Vec, b::Vec) = (a.x*b.x + a.y*b.y + a.z*b.z)
unitize(a::Vec) = (1. / sqrt(dot(a, a)) * a)
-type Ray
+mutable struct Ray
orig::Vec
dir::Vec
end
-type Hit
+mutable struct Hit
lambda::Float64
normal::Vec
end
-abstract Scene
+abstract type Scene end
-immutable Sphere <: Scene
+struct Sphere <: Scene
center::Vec
radius::Float64
end
@@ -67,7 +67,7 @@ function intersect(s::Sphere, i::Hit, ray::Ray)
end
end
-immutable Group <: Scene
+struct Group <: Scene
bound::Sphere
objs::Array{Scene}
end
diff --git a/test/perf/shootout/binary_trees.jl b/test/perf/shootout/binary_trees.jl
index 5df7479867af2..9200748615648 100644
--- a/test/perf/shootout/binary_trees.jl
+++ b/test/perf/shootout/binary_trees.jl
@@ -8,12 +8,12 @@
# Ported from an OCaml version
#
-abstract BTree
+abstract type BTree end
-type Empty <: BTree
+mutable struct Empty <: BTree
end
-type Node <: BTree
+mutable struct Node <: BTree
info
left::BTree
right::BTree
diff --git a/test/perf/shootout/k_nucleotide.jl b/test/perf/shootout/k_nucleotide.jl
index d1353371ddcb3..b28555b1e1c20 100644
--- a/test/perf/shootout/k_nucleotide.jl
+++ b/test/perf/shootout/k_nucleotide.jl
@@ -26,7 +26,7 @@ function count_one(data::AbstractString, s::AbstractString)
count(data, length(s))[s]
end
-type KNuc
+mutable struct KNuc
name::AbstractString
count::Int
end
diff --git a/test/perf/shootout/nbody.jl b/test/perf/shootout/nbody.jl
index 1fc3b0ce7d44b..156d666daf4be 100644
--- a/test/perf/shootout/nbody.jl
+++ b/test/perf/shootout/nbody.jl
@@ -15,7 +15,7 @@ const solar_mass = 4 * pi * pi
const days_per_year = 365.24
# A heavenly body in the system
-type Body
+mutable struct Body
x::Float64
y::Float64
z::Float64
diff --git a/test/perf/shootout/nbody_vec.jl b/test/perf/shootout/nbody_vec.jl
index e2f506a3c492b..7f1fda5f0646e 100644
--- a/test/perf/shootout/nbody_vec.jl
+++ b/test/perf/shootout/nbody_vec.jl
@@ -15,7 +15,7 @@ const solar_mass = 4 * pi * pi
const days_per_year = 365.24
# A heavenly body in the system
-type Body
+mutable struct Body
pos::Array{Float64, 1}
v::Array{Float64, 1}
mass::Float64
diff --git a/test/reduce.jl b/test/reduce.jl
index f0a699b5b5931..87bd3361cfe2a 100644
--- a/test/reduce.jl
+++ b/test/reduce.jl
@@ -246,7 +246,7 @@ end
# any and all with functors
-immutable SomeFunctor end
+struct SomeFunctor end
(::SomeFunctor)(x) = true
@test any(SomeFunctor(), 1:10)
diff --git a/test/reflection.jl b/test/reflection.jl
index 6797de0fe8136..1e83ad4b09097 100644
--- a/test/reflection.jl
+++ b/test/reflection.jl
@@ -71,10 +71,10 @@ tag = Base.have_color ? Base.error_color() : "UNION"
@test warntype_hastag(pos_unstable, Tuple{Float64}, tag)
@test !warntype_hastag(pos_stable, Tuple{Float64}, tag)
-type Stable{T,N}
+mutable struct Stable{T,N}
A::Array{T,N}
end
-type Unstable{T}
+mutable struct Unstable{T}
A::Array{T}
end
Base.getindex(A::Stable, i) = A.A[i]
@@ -177,7 +177,7 @@ d7648 = 9
const f7648 = 10
foo7648(x) = x
function foo7648_nomethods end
-type Foo7648 end
+mutable struct Foo7648 end
module TestModSub9475
using Base.Test
@@ -284,7 +284,7 @@ foo13825{T, N}(::Array{T,N}, ::Array, ::Vector) = nothing
@test startswith(string(first(methods(foo13825))),
"foo13825(::Array{T,N}, ::Array, ::Array{T,1} where T)")
-type TLayout
+mutable struct TLayout
x::Int8
y::Int16
z::Int32
@@ -575,7 +575,7 @@ let a = @code_typed 1 + 1
@test length(b) == 0
end
-type A18434
+mutable struct A18434
end
(::Type{A18434})(x; y=1) = 1
@@ -617,7 +617,7 @@ end
@test isempty(subtypes(Float64))
# New reflection methods in 0.6
-immutable ReflectionExample{T<:AbstractFloat, N}
+struct ReflectionExample{T<:AbstractFloat, N}
x::Tuple{T, N}
end
@@ -640,8 +640,8 @@ let
end
# Issue #20086
-abstract A20086{T,N}
-immutable B20086{T,N} <: A20086{T,N} end
+abstract type A20086{T,N} end
+struct B20086{T,N} <: A20086{T,N} end
@test subtypes(A20086) == [B20086]
@test subtypes(A20086{Int}) == [B20086{Int}]
@test subtypes(A20086{T,3} where T) == [B20086{T,3} where T]
diff --git a/test/repl.jl b/test/repl.jl
index 9858f989ffe14..ec112b5526c55 100644
--- a/test/repl.jl
+++ b/test/repl.jl
@@ -435,7 +435,7 @@ begin
# Test removal of prefix in multiple statement paste
sendrepl2("""\e[200~
- julia> type T17599; a::Int; end
+ julia> mutable struct T17599; a::Int; end
julia> function foo(julia)
julia> 3
@@ -545,7 +545,7 @@ end
end # let exename
# issue #19864:
-type Error19864 <: Exception; end
+mutable struct Error19864 <: Exception; end
function test19864()
@eval current_module() Base.showerror(io::IO, e::Error19864) = print(io, "correct19864")
buf = IOBuffer()
diff --git a/test/replcompletions.jl b/test/replcompletions.jl
index d91450d18703a..1fdebef6872f5 100644
--- a/test/replcompletions.jl
+++ b/test/replcompletions.jl
@@ -4,10 +4,10 @@ using Base.REPLCompletions
ex = quote
module CompletionFoo
- type Test_y
+ mutable struct Test_y
yy
end
- type Test_x
+ mutable struct Test_x
xx :: Test_y
end
type_test = Test_x(Test_y(1))
@@ -22,7 +22,7 @@ ex = quote
end
# Support non-Dict Associatives, #19441
- type CustomDict{K, V} <: Associative{K, V}
+ mutable struct CustomDict{K, V} <: Associative{K, V}
mydict::Dict{K, V}
end
diff --git a/test/replutil.jl b/test/replutil.jl
index 0e688f83e119c..aa113c5258a24 100644
--- a/test/replutil.jl
+++ b/test/replutil.jl
@@ -86,7 +86,7 @@ Base.show_method_candidates(buf, MethodError(method_c5,(Int32,)))
test_have_color(buf, "\e[0m\nClosest candidates are:\n method_c5(\e[1m\e[31m::Type{Float64}\e[0m)$cfile$c5line\e[0m",
"\nClosest candidates are:\n method_c5(!Matched::Type{Float64})$cfile$c5line")
-type Test_type end
+mutable struct Test_type end
test_type = Test_type()
for f in [getindex, setindex!]
Base.show_method_candidates(buf, MethodError(f,(test_type, 1,1)))
@@ -94,7 +94,7 @@ for f in [getindex, setindex!]
end
PR16155line = @__LINE__ + 2
-type PR16155
+mutable struct PR16155
a::Int64
b
end
@@ -215,9 +215,9 @@ macro except_stackframe(expr, err_type)
end
# Pull Request 11007
-abstract InvokeType11007
-abstract MethodType11007 <: InvokeType11007
-type InstanceType11007 <: MethodType11007
+abstract type InvokeType11007 end
+abstract type MethodType11007 <: InvokeType11007 end
+mutable struct InstanceType11007 <: MethodType11007
end
let
f11007(::MethodType11007) = nothing
@@ -252,13 +252,13 @@ let
@test contains(err_str, "column vector")
end
-abstract T11007
+abstract type T11007 end
let
err_str = @except_str T11007() MethodError
@test contains(err_str, "no method matching $(curmod_prefix)T11007()")
end
-immutable TypeWithIntParam{T <: Integer} end
+struct TypeWithIntParam{T <: Integer} end
let undefvar
err_str = @except_strbt sqrt(-1) DomainError
@test contains(err_str, "Try sqrt(complex(x)).")
@@ -319,9 +319,9 @@ let
end
# Issue #14884
-bitstype 8 EightBitType
-bitstype 8 EightBitTypeT{T}
-immutable FunctionLike <: Function; end
+primitive type EightBitType 8 end
+primitive type EightBitTypeT{T} 8 end
+struct FunctionLike <: Function; end
let err_str,
i = reinterpret(EightBitType, 0x54),
j = reinterpret(EightBitTypeT{Int32}, 0x54)
diff --git a/test/serialize.jl b/test/serialize.jl
index fb335a8a213a4..76c19a7402d65 100644
--- a/test/serialize.jl
+++ b/test/serialize.jl
@@ -129,7 +129,7 @@ end
create_serialization_stream() do s # user-defined type
usertype = "SerializeSomeType"
- eval(parse("abstract $(usertype)"))
+ eval(parse("abstract type $(usertype) end"))
utype = eval(parse("$(usertype)"))
serialize(s, utype)
seek(s, 0)
@@ -138,7 +138,7 @@ end
create_serialization_stream() do s # user-defined type
usertype = "SerializeSomeType1"
- eval(parse("type $(usertype); end"))
+ eval(parse("mutable struct $(usertype); end"))
utype = eval(parse("$(usertype)"))
serialize(s, utype)
seek(s, 0)
@@ -147,43 +147,43 @@ end
create_serialization_stream() do s # user-defined type
usertype = "SerializeSomeType2"
- eval(parse("abstract $(usertype){T}"))
+ eval(parse("abstract type $(usertype){T} end"))
utype = eval(parse("$(usertype)"))
serialize(s, utype)
seek(s, 0)
@test deserialize(s) == utype
end
-create_serialization_stream() do s # immutable type with 1 field
+create_serialization_stream() do s # immutable struct with 1 field
usertype = "SerializeSomeType3"
- eval(parse("immutable $(usertype){T}; a::T; end"))
+ eval(parse("struct $(usertype){T}; a::T; end"))
utype = eval(parse("$(usertype)"))
serialize(s, utype)
seek(s, 0)
@test deserialize(s) == utype
end
-create_serialization_stream() do s # immutable type with 2 field
+create_serialization_stream() do s # immutable struct with 2 field
usertype = "SerializeSomeType4"
- eval(parse("immutable $(usertype){T}; a::T; b::T; end"))
+ eval(parse("struct $(usertype){T}; a::T; b::T; end"))
utval = eval(parse("$(usertype)(1,2)"))
serialize(s, utval)
seek(s, 0)
@test deserialize(s) === utval
end
-create_serialization_stream() do s # immutable type with 3 field
+create_serialization_stream() do s # immutable struct with 3 field
usertype = "SerializeSomeType5"
- eval(parse("immutable $(usertype){T}; a::T; b::T; c::T; end"))
+ eval(parse("struct $(usertype){T}; a::T; b::T; c::T; end"))
utval = eval(parse("$(usertype)(1,2,3)"))
serialize(s, utval)
seek(s, 0)
@test deserialize(s) === utval
end
-create_serialization_stream() do s # immutable type with 4 field
+create_serialization_stream() do s # immutable struct with 4 field
usertype = "SerializeSomeType6"
- eval(parse("immutable $(usertype){T}; a::T; b::T; c::T; d::T; end"))
+ eval(parse("struct $(usertype){T}; a::T; b::T; c::T; d::T; end"))
utval = eval(parse("$(usertype)(1,2,3,4)"))
serialize(s, utval)
seek(s, 0)
@@ -204,7 +204,7 @@ create_serialization_stream() do s
end
# Array
-type TA1
+mutable struct TA1
v::UInt8
end
create_serialization_stream() do s # small 1d array
@@ -248,7 +248,7 @@ end
# Objects that have a SubArray as a type in a type-parameter list
module ArrayWrappers
-immutable ArrayWrapper{T,N,A<:AbstractArray} <: AbstractArray{T,N}
+struct ArrayWrapper{T,N,A<:AbstractArray} <: AbstractArray{T,N}
data::A
end
ArrayWrapper{T,N}(data::AbstractArray{T,N}) = ArrayWrapper{T,N,typeof(data)}(data)
@@ -317,7 +317,7 @@ create_serialization_stream() do s # user-defined type array
@test r.exception === nothing
end
-immutable MyErrorTypeTest <: Exception end
+struct MyErrorTypeTest <: Exception end
create_serialization_stream() do s # user-defined type array
t = Task(()->throw(MyErrorTypeTest()))
@test_throws MyErrorTypeTest wait(schedule(t))
@@ -328,7 +328,7 @@ create_serialization_stream() do s # user-defined type array
@test isa(t.exception, MyErrorTypeTest)
end
-# corner case: undefined inside immutable type
+# corner case: undefined inside immutable struct
create_serialization_stream() do s
serialize(s, Nullable{Any}())
seekstart(s)
@@ -402,7 +402,7 @@ str = String(take!(io))
end # module Test13452
# issue #15163
-type B15163{T}
+mutable struct B15163{T}
x::Array{T}
end
let b = IOBuffer()
diff --git a/test/show.jl b/test/show.jl
index bbf65fc40f476..b697acf0d8f54 100644
--- a/test/show.jl
+++ b/test/show.jl
@@ -11,13 +11,13 @@ replstr(x) = sprint((io,x) -> show(IOContext(io, limit=true), MIME("text/plain")
@test replstr(Array{Any}(2,2,2)) == "2×2×2 Array{Any,3}:\n[:, :, 1] =\n #undef #undef\n #undef #undef\n\n[:, :, 2] =\n #undef #undef\n #undef #undef"
@test replstr([1f10]) == "1-element Array{Float32,1}:\n 1.0f10"
-immutable T5589
+struct T5589
names::Vector{String}
end
@test replstr(T5589(Array{String,1}(100))) == "$(curmod_prefix)T5589(String[#undef, #undef, #undef, #undef, #undef, #undef, #undef, #undef, #undef, #undef … #undef, #undef, #undef, #undef, #undef, #undef, #undef, #undef, #undef, #undef])"
-@test replstr(parse("type X end")) == ":(type X # none, line 1:\n end)"
-@test replstr(parse("immutable X end")) == ":(immutable X # none, line 1:\n end)"
+@test replstr(parse("mutable struct X end")) == ":(mutable struct X # none, line 1:\n end)"
+@test replstr(parse("struct X end")) == ":(struct X # none, line 1:\n end)"
s = "ccall(:f, Int, (Ptr{Void},), &x)"
@test replstr(parse(s)) == ":($s)"
@@ -94,7 +94,7 @@ end
@test_repr "(a == b == c) != (c == d < e)"
# control structures (shamelessly stolen from base/bitarray.jl)
-@test_repr """type BitArray{N} <: AbstractArray{Bool, N}
+@test_repr """mutable struct BitArray{N} <: AbstractArray{Bool, N}
chunks::Vector{UInt64}
len::Int
dims::NTuple{N,Int}
@@ -232,7 +232,7 @@ for s in ("(1::Int64 == 1::Int64)::Bool", "(1:2:3) + 4", "x = 1:2:3")
end
# parametric type instantiation printing
-immutable TParametricPrint{a}; end
+struct TParametricPrint{a}; end
@test sprint(show, :(TParametricPrint{false}())) == ":(TParametricPrint{false}())"
# issue #9797
@@ -285,10 +285,10 @@ end
@test_repr "(1 => 2) => 3"
# pr 12008
-@test_repr "bitstype A B"
-@test_repr "bitstype 100 B"
-@test repr(:(bitstype A B)) == ":(bitstype A B)"
-@test repr(:(bitstype 100 B)) == ":(bitstype 100 B)"
+@test_repr "primitive type A B end"
+@test_repr "primitive type B 100 end"
+@test repr(:(primitive type A B end)) == ":(primitive type A B end)"
+@test repr(:(primitive type B 100 end)) == ":(primitive type B 100 end)"
# `where` syntax
@test_repr "A where T<:B"
@@ -367,7 +367,7 @@ let filename = tempname()
end
# issue #12960
-type T12960 end
+mutable struct T12960 end
let
A = speye(3)
B = similar(A, T12960)
diff --git a/test/sorting.jl b/test/sorting.jl
index 539dc669ad745..635eea81d127a 100644
--- a/test/sorting.jl
+++ b/test/sorting.jl
@@ -95,7 +95,7 @@ end
@test searchsortedlast(500:1.0:600, 1.0e20) == 101
# exercise the codepath in searchsorted* methods for ranges that check for zero step range
-immutable ConstantRange{T} <: Range{T}
+struct ConstantRange{T} <: Range{T}
val::T
len::Int
end
@@ -337,7 +337,7 @@ end
@test sortperm([-1.0, 1.0, 1.0], rev=true) == [2, 3, 1]
# issue #8825 - stability of min/max
-type Twain
+mutable struct Twain
a :: Int
b :: Int
end
diff --git a/test/strings/basic.jl b/test/strings/basic.jl
index e5d264c66b971..7ecb5bebbf13e 100644
--- a/test/strings/basic.jl
+++ b/test/strings/basic.jl
@@ -158,7 +158,7 @@ end
@test lcfirst("*")=="*"
# test AbstractString functions at beginning of string.jl
-immutable tstStringType <: AbstractString
+struct tstStringType <: AbstractString
data::Array{UInt8,1}
end
tstr = tstStringType("12")
@@ -444,7 +444,7 @@ end
# Test cmp with AbstractStrings that don't index the same as UTF-8, which would include
# (LegacyString.)UTF16String and (LegacyString.)UTF32String, among others.
-type CharStr <: AbstractString
+mutable struct CharStr <: AbstractString
chars::Vector{Char}
CharStr(x) = new(collect(x))
end
diff --git a/test/strings/io.jl b/test/strings/io.jl
index da07b114a98ab..dedb7463d48b0 100644
--- a/test/strings/io.jl
+++ b/test/strings/io.jl
@@ -144,7 +144,7 @@ end
@test join(["apples", "bananas", "pineapples"], ", ", " and ") == "apples, bananas and pineapples"
# issue #9178 `join` calls `done()` twice on the iterables
-type i9178
+mutable struct i9178
nnext::Int64
ndone::Int64
end
diff --git a/test/subarray.jl b/test/subarray.jl
index cb10e3f1c4be4..0ff38ff999298 100644
--- a/test/subarray.jl
+++ b/test/subarray.jl
@@ -547,7 +547,7 @@ end
# issue #18034
# ensure that it is possible to create an isbits, LinearFast view of an immutable Array
let
- immutable ImmutableTestArray{T, N} <: Base.DenseArray{T, N}
+ struct ImmutableTestArray{T, N} <: Base.DenseArray{T, N}
end
Base.size(::Union{ImmutableTestArray, Type{ImmutableTestArray}}) = (0, 0)
Base.linearindexing(::Union{ImmutableTestArray, Type{ImmutableTestArray}}) = Base.LinearFast()
diff --git a/test/subtype.jl b/test/subtype.jl
index d8c6e6e53df4c..01698e27af9d6 100644
--- a/test/subtype.jl
+++ b/test/subtype.jl
@@ -599,17 +599,17 @@ macro testintersect(a, b, result)
end)
end
-abstract IT4805_2{N, T}
-abstract AbstractThing{T,N}
-type ConcreteThing{T<:AbstractFloat,N} <: AbstractThing{T,N}
+abstract type IT4805_2{N, T} end
+abstract type AbstractThing{T,N} end
+mutable struct ConcreteThing{T<:AbstractFloat,N} <: AbstractThing{T,N}
end
-type A11136 end
-type B11136 end
-abstract Foo11367
+mutable struct A11136 end
+mutable struct B11136 end
+abstract type Foo11367 end
-abstract AbstractTriangular{T,S<:AbstractMatrix} <: AbstractMatrix{T}
-immutable UpperTriangular{T,S<:AbstractMatrix} <: AbstractTriangular{T,S} end
-immutable UnitUpperTriangular{T,S<:AbstractMatrix} <: AbstractTriangular{T,S} end
+abstract type AbstractTriangular{T,S<:AbstractMatrix} <: AbstractMatrix{T} end
+struct UpperTriangular{T,S<:AbstractMatrix} <: AbstractTriangular{T,S} end
+struct UnitUpperTriangular{T,S<:AbstractMatrix} <: AbstractTriangular{T,S} end
function test_intersection()
@testintersect(Vector{Float64}, Vector{Union{Float64,Float32}}, Bottom)
@@ -865,8 +865,8 @@ test_intersection_properties()
@test NTuple{170,Matrix{Int}} <: (Tuple{Vararg{Union{Array{T,1},Array{T,2},Array{T,3}}}} where T)
# Issue #12580
-abstract AbstractMyType12580{T}
-immutable MyType12580{T}<:AbstractMyType12580{T} end
+abstract type AbstractMyType12580{T} end
+struct MyType12580{T}<:AbstractMyType12580{T} end
tpara{A<:AbstractMyType12580}(::Type{A}) = tpara(supertype(A))
tpara{I}(::Type{AbstractMyType12580{I}}) = I
@test tpara(MyType12580{true})
@@ -886,7 +886,7 @@ f12721{T<:Type{Int}}(::T) = true
@test_throws MethodError f12721(Float64)
# implicit "covariant" type parameters:
-type TwoParams{S,T}; x::S; y::T; end
+mutable struct TwoParams{S,T}; x::S; y::T; end
@test TwoParams{<:Real,<:Number} == (TwoParams{S,T} where S<:Real where T<:Number) ==
(TwoParams{S,<:Number} where S<:Real) == (TwoParams{<:Real,T} where T<:Number)
@test TwoParams(3,0im) isa TwoParams{<:Real,<:Number}
diff --git a/test/test.jl b/test/test.jl
index b7fefdb894444..cdd45a37ff980 100644
--- a/test/test.jl
+++ b/test/test.jl
@@ -47,7 +47,7 @@ a[1,1,1,1,1] = 10
"Thrown: ErrorException")
# Test printing of Fail results
-type NoThrowTestSet <: Base.Test.AbstractTestSet
+mutable struct NoThrowTestSet <: Base.Test.AbstractTestSet
results::Vector
NoThrowTestSet(desc) = new([])
end
@@ -265,7 +265,7 @@ redirect_stderr(OLD_STDERR)
import Base.Test: record, finish
using Base.Test: get_testset_depth, get_testset
using Base.Test: AbstractTestSet, Result, Pass, Fail, Error
-immutable CustomTestSet <: Base.Test.AbstractTestSet
+struct CustomTestSet <: Base.Test.AbstractTestSet
description::AbstractString
foo::Int
results::Vector
@@ -374,7 +374,7 @@ end
# Test that @inferred works with A[i] expressions
@test @inferred((1:3)[2]) == 2
-immutable SillyArray <: AbstractArray{Float64,1} end
+struct SillyArray <: AbstractArray{Float64,1} end
Base.getindex(a::SillyArray, i) = rand() > 0.5 ? 0 : false
test_result = @test_throws ErrorException @inferred(SillyArray()[2])
@test contains(test_result.value.msg, "Bool")
diff --git a/test/threads.jl b/test/threads.jl
index 5a673c9353544..d0626fdbc3d79 100644
--- a/test/threads.jl
+++ b/test/threads.jl
@@ -176,7 +176,7 @@ end
@test_throws TypeError Atomic{Complex128}
# Test atomic memory ordering with load/store
-type CommBuf
+mutable struct CommBuf
var1::Atomic{Int}
var2::Atomic{Int}
correct_write::Bool
@@ -221,7 +221,7 @@ test_atomic()
# Test ordering with fences using Peterson's algorithm
# Example adapted from
-type Peterson
+mutable struct Peterson
# State for Peterson's algorithm
flag::Vector{Atomic{Int}}
turn::Atomic{Int}
diff --git a/test/topology.jl b/test/topology.jl
index 156813105709f..52cdad0ffc8c1 100644
--- a/test/topology.jl
+++ b/test/topology.jl
@@ -32,7 +32,7 @@ end
remove_workers_and_test()
# connect even pids to other even pids, odd to odd.
-type TopoTestManager <: ClusterManager
+mutable struct TopoTestManager <: ClusterManager
np::Integer
end
diff --git a/test/tuple.jl b/test/tuple.jl
index acf40f4306fd5..9f2496d364007 100644
--- a/test/tuple.jl
+++ b/test/tuple.jl
@@ -179,7 +179,7 @@ end
@test_throws BoundsError ()[[false]]
@test_throws BoundsError ()[[true]]
-immutable BitPerm_19352
+struct BitPerm_19352
p::NTuple{8,UInt8}
function BitPerm(p::NTuple{8,UInt8})
sort(collect(p)) != collect(0:7) && error("$p is not a permutation of 0:7")
@@ -195,11 +195,11 @@ end
# issue #15703
let
- immutable A_15703{N}
+ struct A_15703{N}
keys::NTuple{N, Int}
end
- immutable B_15703
+ struct B_15703
x::A_15703
end
diff --git a/test/vecelement.jl b/test/vecelement.jl
index 17fc162855e94..31de4cb0586e9 100644
--- a/test/vecelement.jl
+++ b/test/vecelement.jl
@@ -24,7 +24,7 @@ for i=1:20
end
# Another crash report for #15244 motivated this test.
-immutable Bunch{N,T}
+struct Bunch{N,T}
elts::NTuple{N,Base.VecElement{T}}
end
@@ -38,7 +38,7 @@ b = Bunch((VecElement(1.0), VecElement(2.0)))
@test rewrap(b)===VecElement(1.0)
-immutable Herd{N,T}
+struct Herd{N,T}
elts::NTuple{N,Base.VecElement{T}}
Herd{N,T}(elts::NTuple{N,T}) where {N,T} = new(ntuple(i->Base.VecElement{T}(elts[i]), N))
end
@@ -53,7 +53,7 @@ check(Herd{1,Int}((1,)))
check(Herd{2,Int}((4,5)))
check(Herd{4,Int}((16,17,18,19)))
-immutable Gr{N, T}
+struct Gr{N, T}
u::T
v::Bunch{N,T}
w::T
diff --git a/test/workspace.jl b/test/workspace.jl
index 3fc35bfab69f0..01d5fb843e241 100644
--- a/test/workspace.jl
+++ b/test/workspace.jl
@@ -18,9 +18,9 @@ run(`$exename --startup-file=no -e $script`)
# issue #17764
script2 = """
-type Foo end
+mutable struct Foo end
workspace()
-type Foo end
+mutable struct Foo end
@assert Tuple{Type{LastMain.Foo}} !== Tuple{Type{Main.Foo}}
"""
run(`$exename --startup-file=no -e $script2`)
diff --git a/test/worlds.jl b/test/worlds.jl
index d9f54d662ed8b..28a89b2e5c9dc 100644
--- a/test/worlds.jl
+++ b/test/worlds.jl
@@ -54,7 +54,7 @@ begin
end
# test constructor narrowing
-type A265{T}
+mutable struct A265{T}
field1::T
end
A265_() = A265(1)
@@ -63,7 +63,7 @@ A265(fld::Int) = A265(Float64(fld))
@test (A265_()::A265{Float64}).field1 === 1.0e0
# test constructor widening
-type B265{T}
+mutable struct B265{T}
field1::T
# dummy arg is present to prevent (::Type{T}){T}(arg) from matching the test calls
B265{T}(field1::Any, dummy::Void) where T = new(field1) # prevent generation of outer ctor