Fix unnecessary recompilation when dbg_callback is modified at runtime
Fix parser crash on missing parentheses on expression following operator not in
Support fetching abstract code for modules compiled with Elixir v1.14 and earlier
Module
528 changes across 89 versions
Changes by version
Fix unnecessary recompilation when dbg_callback is modified at runtime
Fix parser crash on missing parentheses on expression following operator not in
Support fetching abstract code for modules compiled with Elixir v1.14 and earlier
Support /E modifier for regular expressions in config files
Measure and optimize writing of .beam files in the compiler
Optimize rare scenarios where type checking took too long
Ensure we warn on deprecated ~~~ unary operator
Optimize how types are computed for pretty printing
Optimize how differences are computed in the type system
Raise when U+2028 and U+2029 characters are present in comments and strings to avoid line spoofing attacks
Include the line for the previous clause in errors/warnings related to conflicts between defaults on function definitions
Support min/2 and max/2 as guards
Properly increment metadata newline when ? is followed by a literal newline character
not_a_map.key now raises BadMapError for consistency with other map operations
The struct update syntax, such as %URI{uri | path: "/foo/bar"}, now requires the given variable (or expression) to explicitly pattern match on the struct before it can be updated. This is because, thanks to the type system, pattern matching on structs can find more errors, more reliably, and we want to promote its usage. Once pattern matching is added, you may optionally convert the struct update syntax into the map update syntax %{uri | path: "/foo/bar"} with no less of typing guarantees
Emit trace events for @on_definition callbacks
Emit trace events for @on_load callbacks
Emit trace events for super calls
Emit trace events for imported function calls
Optimize map unions to avoid building long lists
Do not crash when type checking nested bitstrings in patterns
Do not crash when non-binary bitstring is given as struct default value
Recompile regexes when escaped from module attributes for Erlang/OTP 28 compatibility
Preserve backwards compatibility in elixir_erl
Allow <<_::3*8>> in typespecs
Do not emit type violation warnings when comparing or matching against literals
Do not validate clauses of private overridable functions
Do not crash when typing violation is detected on dynamic dispatch
Properly annotate the source for warnings emitted by the compiler with the @file annotation
Properly annotate the source for warnings emitted by the type system with the @file annotation
Remove :no_parens metadata when using capture with arity on all cases
Ensure diagnostic traces are kept backwards compatible
Update source code parsing to match UTS #55 latest recommendations. In particular, mixed script is allowed in identifiers as long as they are separate by underscores (_), such as http_сервер. Previously allowed highly restrictive identifiers, which mixed Latin and other scripts, such as the japanese word for t-shirt, Tシャツ, now require the underscore as well
Warn on bidirectional confusability in identifiers
Verify the type of the binary generators
Track the type of tuples in patterns and inside elem/2
Perform validation of root AST nodes in unquote and unquote_splicing to catch bugs earlier
Add source, behaviour, and record information to Docs chunk metadata
Support deterministic builds in tandem with Erlang by setting ERL_COMPILER_OPTIONS=deterministic. Keep in mind deterministic builds strip source and other compile time information, which may be relevant for programs
Allow aliases and imports to be enabled conditionally in module body
Validate AST on unquote and unquote_splicing to provide better error reports instead of failing too late inside the compiler
Avoid crashes when emitting diagnostics on code using \t for indentation
Deprecate unless in favor of if. Use mix format --migrate to automate the migration
Do not attempt to group module warnings when they have a large context
Fix bug when using pinned variables inside with's else patterns
Fix Dialyzer error when with else clause is calling a no_return function
Add Kernel.get_in/1 with safe nil-handling for access and structs
Add Kernel.is_non_struct_map/1 guard
Add Kernel.to_timeout/1
Emit warnings for undefined functions from modules defined within the same context as the caller code
Support integers in uppercase sigils
Resolve inconsistencies of how .. and ... are handled at the AST level
Fix parsing precedence of ambiguous operators followed by containers
Do not expand code in quote bind_quoted: ... twice
Respect :line property when :file is given as option to quote
Do not crash on Macro.escape/2 when passing a quote triplet without valid meta
Avoid double tracing events when capturing a function
Fix a bug where captured arguments would conflict when a capture included a macro that also used captures
Single-quote charlists are deprecated, use ~c instead
Deprecate escaping closing delimiter in uppercase sigils
Only infer size in pinned variable in binary strings when needed
Auto infer size of matched variable in bitstrings
Preserve column information when translating typespecs
Suggest module names based on suffix and casing errors when the module does not exist in UndefinedFunctionError
Do not expand aliases recursively (the alias stored in Macro.Env is already expanded)
Ensure dbg module is a compile-time dependency
Warn when a private function or macro uses unquote/1 and the function/macro itself is unused
Re-enabled compiler optimizations for top level functions in scripts (disabled in v1.14.0 but shouldn't impact most programs)
Do not define an alias for nested modules starting with Elixir. in their definition
~R/.../ is deprecated in favor of ~r/.../. This is because ~R/.../ still allowed escape codes, which did not fit the definition of uppercase sigils
Trace functions before they are inlined
Ensure stacktrace is included when necessary when rescuing multiple exceptions in the same branch
Fix index in error message for unused optional arguments
Improve better stacktraces when executing unnested Elixir code in a file
Break down case and cond inside dbg/2
Add t:nonempty_binary/0 and t:nonempty_bitstring/0
Treat @behaviours as runtime dependencies
Do not add runtime dependencies for alias references in patterns and guards
Warn for nested calls without parens inside keywords
Support for multi-letter uppercase sigils
Introduce mechanism to collect several errors in a module. Previously, as soon as there was a compilation error, compilation would fail. Now the compiler became a bit smarter and will report multiple errors whenever possible as multiple error: ... messages, similar to warning: ...
Raise instead of warning on undefined variables. Previously, an undefined variable would attempt to invoke a function of the same name, which led to confusing error messages, especially to newcomers. To enable the previous behaviour, invoke Code.compiler_options(on_undefined_variable: :warn) at the top of your mix.exs
Expand macros on the left side of -> in try/rescue
Raise on misplaced ... inside typespecs
Do not import behaviour_info and module_info functions from Erlang modules
Raise when macros are given to dialyzer
Require pin variable when accessing variable inside binary size in match
Deprecate ... as a valid function call identifier
Fix debug_info/4 when returning core_v1
Store complete path on quote keep: true to avoid invalid stacktraces
Fix column count when tokenizing escaped interpolations
Speed up loading of runtime modules in the parallel compiler
Fix invalid variable scoping in defguard expansion
Do not warn on captured underscored vars from defmodule
Do not crash for missing line info on type warnings
Generate unique variables for macro expansion of defguard
Perform partial expansion of literals in module attributes
Do not add compile-time dependencies for literals as defaults in Application.compile_env/3 inside module attributes
Fix misleading warning when :uniq is given in for comprehensions and the result is unused
Improve error message for when there is a conflicting struct and ignoring module conflict
Do not delete @enforce_keys attribute after defstruct declaration
Do not crash the checker on modules with missing :debug_info chunk
Add new dbg/0-2 macro
Allow any guard expression as the size of a bitstring in a pattern match
Allow composite types with pins as the map key in a pattern match
Print escaped version of control chars when they show up as unexpected tokens
Warn on confusable non-ASCII identifiers
Add .. as a nullary operator that returns 0..-1//1
Implement Unicode Technical Standard #39 recommendations. In particular, we warn for confusable scripts and restrict identifiers to single-scripts or highly restrictive mixed-scripts
Automatically perform NFC conversion of identifiers
Add binary_slice/2 and binary_slice/3
Lazily expand module attributes to avoid compile-time deps
Automatically cascade generated: true annotations on macro expansion
Do not allow restricted characters in identifiers according to UTS39
Define __exception__ field as true when expanding exceptions in typespecs
Warn if any of True, False, and Nil aliases are used
Warn on underived @derive attributes
Remove compile-time dependency from defimpl :for
Track all arities on imported functions
Fix equality in guards for dynamic ranges without steps
Deprecate the operator <|> to avoid ambiguity with upcoming extended numerical operators
Tweak type unification to fix infinite loop with recursive vars
Add compile-time dependencies on require
Make sure signatures stored in the Documentation chunk does not contain newlines
Fix infinite loop when compiling guards with recursive map access
Fix a crash when a for-comprehension with :uniq was used inside another comprehension with :uniq
Ensure env.context_modules is properly set inside optimized defmodule
Support the :sigils option in import Mod, only: :sigils and allow the sigil modifiers to be also digits
Make get_in consistently abort when nil values are found
Improve compilation times by reducing the amount of copies of the AST across compiler processes
Raise if trying to define a module with a slash in its name
Warn when ?\ is used and there is no need for a escape character
Track structs in typespecs as export deps instead of compile-time deps
Add power operator (**/2)
Reject bidirectional formatting characters in strings and comments
Support escaping of terminators in uppercase sigils heredocs for consistency
Raise if __CALLER__ or __ENV__ or __STACKTRACE__ are used in match
Improve error message on invalid argument for byte_size from binary concat
Raise when aliasing non-Elixir modules without :as
Allow unquote_splicing inside %{...} without parens
Ensure that waiting on a struct expansion inside a typespec is correctly tracked as waiting time in the compiler
Correctly parse the atom . as a keyword list key
Do not leak variables from the first generator in with and for special forms
Fix column number on strings with NFD characters
Fix a bug where a combination of dynamic line in quote with unquote of remote calls would emit invalid AST metadata
Do not crash when handling ambiguity errors
Ensure deprecated macros emit warnings
Add first..last//step as support for stepped ranges
Also warn for literal structs on min/2 and max/2
Add Kernel.tap/2 and Kernel.then/2
Do not add runtime dependencies to remotes in typespecs
When there is an unused variable warning and there is a variable with the same name previously defined, suggest the user may have wanted to use the pin operator
Improve error messages on invalid character right after a number
Show removal and deprecated tips from Erlang/OTP
Allow heredoc inside a heredoc interpolation
Preserve CRLF on heredocs
Public functions without documentation now appear as an empty map on Code.fetch_docs/1, unless they start with underscore, where they remain as :none. This aligns Elixir's implementation with EEP48
Do not crash when complex literals (binaries and maps) are used in guards
Properly parse keywords (such as end) followed by the :: operator
Do not ignore unimplemented signatures from generated functions
Improve error message when an expression follows a keyword list without brackets
Using first..last to match on ranges is soft-deprecated and will warn on future Elixir versions. Use first..last//step instead
Using first..last to create decreasing ranges is soft-deprecated and will warn on future versions. Use first..last//-1 instead
The binary operator ^^^ is deprecated. If you are using Bitwise.^^^/2, use Bitwise.bxor/2 instead
Deprecate @foo() in favor of @foo
Update formatting when printing warnings and errors from Erlang/OTP 24+
Support float-16 on bitstrings
Emit undefined function warnings from with
Do not fail type checking when literals are used in guards
Raise meaningful error if :erlang.is_record is used in guards
Prune tracers when fetching __ENV__ inside functions
Do not crash when :reduce is set to nil in comprehensions
Fix a scenario where undefined function warnings were not being emitted
Add is_struct/2 guard
Add is_exception/1 and is_exception/2 guards
Support map.field syntax in guards
Add +++ and --- with right associativity to the list of custom operators
Warn if a variable that looks like a compiler variable (such as __MODULE__) is unused
Validate values given to :line in quote to avoid emitting invalid ASTs
Report the correct line number when raising inside a macro
Fix an issue where elixirc would not accept paths with backslash (\) separators on Windows
Properly parse &//2 (i.e. the capture of the division operator)
Raise CompileError when trying to define reserved types
Improve compiler error message when using | in a def signature
Improve error message when trying to use invalid list operators in guards
Fix a bug where custom types were printed as built-in types
Don't add compile-time dependency on defdelegate
Add line numbers to warnings on deprecated imports
Report the correct line number when raising inside a macro
Ensure with clauses properly unpack "implicit guards" (such as matching on the struct name)
Do not warn if commas are used by themselves in ~w/~W sigils
Do not validate the :line option in quote (the validation has been moved to v1.11 to give users more time to update their code)
Add Kernel.is_struct/1 and Kernel.is_map_key/2
Warn when function head comes immediately after the implementation instead of before the implementation
Warn if duplicate key is found in struct declaration
Print all undefined functions as warnings and then raise. This allows users to see all undefined calls at once, when it would otherwise require them to compile the code multiple times
Raise error on functions/guards without implementation
Ensure compilation works for a variable named super
Ensure capture operator of a local function expands correctly inside a macro
Add ~U sigil for UTC date times
Optimize &super/arity and &super(&1)
Optimize generated code for with with a catch-all clause
Validate __struct__ key in map returned by __struct__/0,1
Improve error message when string interpolation is used in a guard
Properly merge and handle docs for callbacks with multiple clauses
Guarantee reproducible builds on modules with dozens of specs
Resolve __MODULE__ accordingly in nested defmodule to avoid double nesting
Type variables starting with an underscore (_foo) should not raise compile error
Keep order of elements when macro in/2 is expanded with a literal list on the right-hand side
Print proper location on undefined function error from dynamically generated functions
Do not propagate counters to variables in quote inside another quote
Warn on ambiguous use of :: and | in typespecs
Add :delegate_to @doc metadata tag when using defdelegate
Improve compile-time building of ranges via the .. operator
Compile charlist interpolation more efficiently
Add floor/1 and ceil/1 guards
Remove Guard test tuple_size(...) can never succeed Dialyzer warning on try
Expand operands in size*unit bitstring modifier instead of expecting size and unit to be literal integers
Do not deadlock on circular struct dependencies in typespecs
Raise proper error message when passing flags to the Erlang compiler that Elixir cannot handle
Do not leak variables in cond clauses with a single matching at compile-time clause
Using @since will now emit a unused attribute warning. Use @doc since: "1.7.2" instead
Passing a non-empty list as :into in for comprehensions was inconsistent with maps and is deprecated in favor of Kernel.++/2 or Keyword.merge/2
Expand left..right at compile time in more cases, which leads to improved performance under different scenarios, especially on x in left..right expressions
Ensure @spec, @callback, @type and friends can be read accordingly
Do not emit warnings for repeated docs over different clauses due to false positives
Support adding arbitrary documentation metadata by passing a keyword list to @doc, @moduledoc and @typedoc
Introduce __STACKTRACE__ to retrieve the current stacktrace inside catch/rescue (this will be a requirement for Erlang/OTP 21+)
Raise on unsafe variables in order to allow us to better track unused variables (also known as imperative assignment / variable leakage)
Warn when using length to check if a list is not empty on guards
Add hints on mismatched do/end and others pairs
Warn when comparing structs using the >, <, >= and <= operators
Warn on unsupported nested comparisons such as x < y < z
Warn if redefining documentation across clauses of the same definition
Warn on unnecessary quotes around atoms, keywords and calls
Raise on unsafe variables as some of the code emitted with unsafe variables would not correctly propagate variables or would disable tail call optimization semantics
Do not crash on dynamic sizes in binary generators with collectable into in comprehensions
Do not crash on literals with non-unary size in binary generators with collectable into in comprehensions
not left in right is ambiguous and is deprecated in favor of left not in right
Warn on confusing operator sequences, such as 1+++1 meaning 1 ++ +1 or ........ meaning ... .. ...
Support specsdiff flag on __info__ spec clauses
Do not exclude hygienic vars in defguard
Properly support into: binary in Erlang/OTP 20.3
Ensure arguments given to a guard defined with defguard are evaluated in the correct order
Raise better error messages on invalid map syntax
Prefix variables with V when emitting Erlang code. This improves the integration with tools such as Erlang code formatters and the GUI debugger
Warn on the use of length(x) == 0 in guards
Warn if catch comes before rescue in try
Warn if heredoc is outdented compared to its closing quotes
Add defguard/1 and defguardp/1 to make it easier to build guard-safe macros
Solve a precedence issue between & and |, such as [&Foo.bar/1 | &Baz.bat/2]
Do not load dynamic Elixir modules as :in_memory as this value is not officially supported by the code server. Instead, use an empty list, which is the same value used by Erlang.
Validate variable struct name is atom when used in pattern matching
No longer generate documentation for defdelegate functions automatically to avoid overriding previously specified @doc
Specifying map types with variable keys without defining the type as required/optional is deprecated
Warn duplicate definitions in macros
Remove dialyzer warnings from else in with clauses
Do not warning on upcoming @deprecated and @since attributes for v1.6
Optimize function definition with multiple clauses by not traversing the internal clauses table
Warn if unary operators are followed by new lines
Improve error message for oversized atoms
Ensure @impl attribute also propagates to clauses from default arguments
Emit proper error for unknown vars inside binary pattern in match
Do not use references on function/macro definitions - this provides large improvements in compilation times in some rare corner cases
Ensure dialyzer does not emit warnings in some uses of with
Fix dialyzer warnings when defmacrop is used in modules
Ensure Elixir modules can be dialyzed without starting the Elixir application
Do not serialize references in quoted expressions
Make sure structs expansion use the latest definition available when struct modules are recompiled
Add left not in right to check that the left side is not in the enumerable on the right
Use the new debug_info chunk in OTP 20. This provides a mechanism for tools to retrieve the Elixir AST from beam files
defoverridable/1 accepts a module name as argument and marks all callbacks as overridable
Allow non-quoted Unicode atoms and variables according to Unicode Annex #31 (see Unicode Syntax document)
Warn when a :__struct__ key is used when building/updating structs
Cache the AST on definitions. This speeds up the compilation time from 10% to 15% measured across different projects
Improve compiler error message on invalid patterns and guards
Support guards on anonymous functions of zero arity
Fix compilation of maps used as maps keys inside matches
Ensure do clause in with is tail call optimizable
not left in right is soft-deprecated in favor of left not in right
Using () to mean nil is deprecated
:as_char_lists value in Inspect.Opts.t/0 type, in favor of :as_charlists
:char_lists key in Inspect.Opts.t/0 type, in favor of :charlists
Improve compilation time for modules with many clauses
Fix code generation when non-binary bitstrings are in AST
Ensure redefined functions point to the proper source
Remove warning when making private functions overridable
Recognize merge conflict markers in source and provide a readable error message
Warn on unused module attributes
Improve compiler message on unexpected end of line
Raise BadBooleanError when a non-boolean is given on the left-hand side of and/or
Don't crash in macro_exported?/3 when dealing with Erlang modules
Ensure locals calls are rewritten when calling a local function or macro from inside a module
Annotate the context for variables as zero-arity funs in quotes
Deprecate support for making private functions overridable. Overridable functions must always be public as they must be contracts
Warn if variable is used as a function call
Ensure the compiler does not generate unecessary variable bindings inside case statements. This improves the code emitted and make sure "unused variable warnings" are not mistakenly silenced
Move raise checks to runtime to avoid crashing cover on Erlang 19.1
Support guards in else clauses in with
Do not attempt to load modules that have not been required when invoking regular functions, otherwise this invalidates the @compile {:autoload, false} directive.
Ensure structs can be expanded in dynamic module names
Ensure aliases warnings are not accidentally discarded when the same module is imported
Support generated: true in quote
Support Kernel.pop_in/1 and Kernel.pop_in/2 for yanking a value from a nested data structure
Allow variable struct names when matching, for example, %module{key: "value"} = struct
Allow guards on the left side of <- in for and with special forms
Support else chunks in with
Track {module, function, arity} imports and warn on unused ones when such are specified in :only
Add keyword/0 and keyword/1 built-in types to typespecs
Add sigils for date (~D[2015-04-17]), time (~T[08:00:00]) and naive date times ~N[2015-04-17 08:00:00]
Support @enforce_keys on defstruct/1 to guarantee some keys are explicitly given when building structs
Do not choke on capture operator with argument above &191
Raise if defstruct is called multiple times
Ensure Module.create/3 respects var/alias hygiene
Support non-literal ranges on the right side of in/2
to_char_list functions have been soft-deprecated in favor of to_charlist. This aligns with the naming conventions in both Erlang and Elixir
\x{H*} in strings/sigils/charlists is deprecated
Add deprecation for defdelegate list arguments and :append_first option. The previously undocumented and deprecated support for matching has been removed
Warn if a variable is assigned inside case/if/etc and used outside the block
Support Erlang 19
Supported generated: true in the quote special form
Support @compile {:autoload, false} to disable automatic loading after compilation
Support multiple aliases in alias, import, require and use. For example, alias MyApp.{Foo, Bar, Baz}
Add struct!/2. Similar to struct/2 but raises on invalid keys
Warn if @doc/@typedoc/@moduledoc attributes are redefined
Warn if non-variables are used in defdelegate/2 (as they have no effect)
Mark quoted expressions as generated, avoiding false positives on dialyzer
Allow variables as map keys on creation %{key => value} and on matches %{^key => value}
Allow the pin operator ^ in fn clauses and on the left side of <- in for comprehensions
Introduce with as a special form that allows matching on right side parameters
Warn when right hand side of -> does not provide any expression
Warn if the Elixir was compiled with a different endianness than the one currently available at runtime
Warn if a variable is used after being defined exclusively in a nested context
Warn if piping into an expression without parentheses
Raise when conflicting :only and :except are given to import
Change __ENV__.file if @file is set for the given function
Make Kernel.ParallelRequire aware of :warning_as_errors
Improve error message for invalid do/do:
No longer include :crypto and :syntax_tools as dependencies. The former is only needed if you have encrypted debug info (therefore you can add :crypto as a dependency manually) and the latter is no longer used
Raise when var.Alias syntax is used and it does not expand to an atom at compile time (previously it emitted warnings)
Improve generation of argument names for function signatures
::/2 is now a special form
Warn when a variable with underscore is used
Allow underscores in binary, octal and hex literals
Warn when module attributes, variables, strings and numbers are used in code but the expression has no effect
Support \uXXXX and \u{X*} in strings and char lists to map to Unicode codepoints
Do not expand in/2 argument in module body
Throw syntax error for undefind atom/alias syntax :foo.Bar
Improve error message when we can't compile because the target directory is not writeable
Allow capture of non-symbolic operators like &and/2, ¬/1 and others
Raise if heredoc terminal is accidentally found in the middle of a line without escaping
Don't warn on missing imports if nothing was imported
Raise if arity bigger than 255 is given to capture operator
\x inside strings and charlists is deprecated in favor of \uXXXX and \u{X*}. The values emitted by \x are unfortunately wrong (they should be bytes but currently it emits codepoints). \u is meant to correctly map to codepoints and \x will be fixed in the future to map to bytes
?\xHEX is deprecated in favor of 0xHEX. There is no situation where the former should be used in favor of the latter and the latter is always cleaner
Giving as: true | false to alias/2 and require/2 have been deprecated (it was undocumented behaviour)
Fix a bug where =~/2 returned false when matching on an empty string. The current behaviour was changed to match the behaviour of String.contains?/2
Do not define an ets table with the same name as the module as it clashes with user code
Fail compiling try expressions if they lack one of catch/after/rescue/else clauses
Improve error messages when parsing fails on aliases
Improve warnings coming from compile-time evaluation of arguments
Print warnings when used ? with characters with escape codes
Modules compiled by Elixir now report the correct beam location when :code.which/1 is invoked. If the bytecode is only available in memory, :code.which/1 returns :in_memory
Do not expand args for unknown functions/macros
Ensure defstruct, @attr inside and friends raise a nice error messages when values cannot be properly escaped
Do not raise conflicts on imports used from inside quotes
Correctly parse unary/binary operators regardless of number of spaces
Ensure private functions are not exported
Leading 0 for octals is deprecated in favor of 0o
0X for hexadecimals is deprecated in favor of 0x
0B for binaries is deprecated in favor of 0b
binding/1 and binding/2 expecting a list were removed
Print a warning if a dangling @doc clause is found
|>, <<<, >>> and ^^^ made left associative in operator table
<, >, <=, >= given higher precedence than comparison operators (==, !=, etc) in the operator table
Run command line and escripts in a process that does not trap exits
Fix a bug where Mix paths had higher priority than CLI ones, causing protocol consolidations to not be properly loaded
Fix wording on error messages when a check/guard always passes or always fails
Fix a bug where an unused function warning was printed even when the function was used via defoverridable
Improve typespecs so they don't generate supertype dialyzer warnings
Using a list for bitstring modifiers is deprecated (as in <<x :: [little, utf16]>>), please use - as the separator instead (as in <<x :: little-utf16>>)
defstruct no longer automatically defines a type
exit(integer) is no longer supported from scripts to configure the exit signal. Use exit({:shutdown, integer}) instead
Default argument values have to be defined in a function head if the function has multiple clauses
Ensure compatibility with Erlang 17.1
Support @external_resource attribute to external dependencies to a module
Ensure derived protocols are defined with a file
Change precedence of & to not special case /
Ensure we can only use variables and \\ as arguments of bodyless clause
Kernel.xor/2 is deprecated
size/1 is deprecated in favor of byte_size/1 and tuple_size/1 (this change was soft deprecated two releases ago)
Sigils no longer balance start and end tokens, e.g. the sigil ~s(f(o)o) is no longer valid as it finishes in the first closing )
Variables set in cond clause heads are no longer available outside of that particular cond clause (this is the behaviour also found in case, receive and friends)
Disambiguate (w)erl to (w)erl.exe
Remove get_in/1
Store documentation in the abstract code to avoid loading them when the module is loaded
Add get_in/2, put_in/3, update_in/3 and get_and_update_in/3 to handle nested data structure operations
Add get_in/1, put_in/2, update_in/2 and get_and_update_in/2 to handle nested data structure operations via paths
Ensure Mix _build structure works on Windows when copying projects
Ensure 1.0E10 (with uppercase E) is also valid syntax
size/1 is deprecated, please use byte_size/1 or tuple_size/1 instead
Application.Behaviour, GenEvent.Behaviour, GenServer.Behaviour and Supervisor.Behaviour are deprecated in favor of Application, GenEvent, GenServer and Supervisor
defexception/3 is deprecated in favor of defexception/1
raise/3 is deprecated in favor of reraise/2
set_elem/3 is deprecated in favor of put_elem/3
Passing an atom var!/1 is deprecated, variables can be built dynamically with Macro.var/2
Retrieving docs as module.__info__(:docs) is no longer supported, please use Code.get_docs/2 instead
Code.compiler_options/1 no longer accepts custom options, only the ones specified by Elixir (use mix config instead)
GenEvent, GenServer, Supervisor, Agent and Task modules added
Make deprecations compiler warnings to avoid the same deprecation being printed multiple times
Rename ELIXIR_ERL_OPTS to ELIXIR_ERL_OPTIONS for consistency with ERL_COMPILER_OPTIONS
Application.Behaviour, GenEvent.Behaviour, GenServer.Behaviour and Supervisor.Behaviour are deprecated in favor of Application, GenEvent, GenServer and Supervisor
defexception/3 is deprecated in favor of defexception/1
raise/3 is deprecated in favor of reraise/2
set_elem/3 is deprecated in favor of put_elem/3
atom_to_binary/1 and atom_to_list/1 are deprecated in favor of Atom.to_string/1 and Atom.to_char_list/1
bitstring_to_list/1 and list_to_bitstring/1 are deprecated in favor of the :erlang ones
binary_to_atom/1, binary_to_existing_atom/1, binary_to_float/1, binary_to_integer/1 and binary_to_integer/2 are deprecated in favor of conversion functions in String
float_to_binary/* and float_to_list/* are deprecated in favor of Float.to_string/* and Float.to_char_list/*
integer_to_binary/* and integer_to_list/* are deprecated in favor of Integer.to_string/* and Integer.to_char_list/*
iodata_to_binary/1 and iodata_length/1 are deprecated IO.iodata_to_binary/1 and IO.iodata_length/1
list_to_atom/1, list_to_existing_atom/1, list_to_float/1, list_to_integer/1, list_to_integer/2 and list_to_tuple/1 are deprecated in favor of conversion functions in List
tuple_to_list/1 is deprecated in favor of Tuple.to_list/1
is_exception/1, is_record/1 and is_record/2 are deprecated in favor of Exception.exception?1, Record.record?/1 and Record.record?/2
defrecord/3 is deprecated in favor of structs
:hygiene in quote is deprecated
Ensure modules defined on root respect defined aliases
Do not wrap single lists in :__block__
Ensure emitted beam code works nicely with dialyzer
Do not allow a module named Elixir to be defined
Create remote funs even if mod is a variable in capture &mod.fun/arity
Improve compiler message when duplicated modules are detected
is_exception/1, is_record/1 and is_record/2 are deprecated in favor of Exception.exception?1, Record.record?/1 and Record.record?/2
lc and bc comprehensions are deprecated in favor of for
File.Stat, HashDict, HashSet, Inspect.Opts, Macro.Env, Range, Regex and Version.Requirement have been converted to structs. This means is_record/2 checks will no longer work, instead, you can pattern match on them using %Range{} and similar
Fix a bug where comprehensions arguments were not properly take into account in the variable scope
iolist_size and iolist_to_binary are deprecated in favor of iodata_size and iodata_to_binary (this is a soft deprecation, no warnings will be emitted)
Support ERL_PATH in bin/elixir
Support interpolation in keyword syntax
Ensure the same pid is not queued twice in the parallel compiler
lc and bc comprehensions are deprecated in favor of for (this is a soft deprecation, no warning will be emitted)
Ensure try does not generate an after clause. Generating an after clause forbade clauses in the else part from being tail recursive. This should improve performance and memory consumption of Stream functions
% for sigils is deprecated in favor of ~
is_range/1 and is_regex/1 are deprecated in favor of Range.range?/1 and Regex.regex?/1
// for default arguments is deprecated in favor of \\
Using % for sigils is deprecated in favor of ~. This is a soft deprecation, no warnings will be emitted for it in this release
Using ^ inside function clause heads is deprecated, please use a guard instead
Warnings now are explicitly tagged with "warning:" in messages
Explicit functions inlined by the compiler, including operators. This means that Kernel.+/2 will now expand to :erlang.+/2 and so on
Ensure undefined @attributes shows proper stacktrace in warnings
Guarantee nullary funs/macros are allowed in guards
binary_to_term/1, binary_to_term/2, term_to_binary/1 and term_to_binary/2 are deprecated in favor of their counterparts in the :erlang module
// for default arguments is deprecated in favor of \\. This is a soft deprecation, no warnings will be emitted for it in this release
Deprecated @behavior in favor of @behaviour
Remove ** from the list of allowed operators
Limit sigils delimiters to one of the following: <>, {}, [], (), ||, //, " and '
Improve stacktraces to be relative to the compilation path and include the related application
Ensure bitstring modifier arguments are expanded
Ensure compiler does not block on missing modules
Ensure <>/2 works only with binaries
Fix usage of string literals inside <<>> when utf8/utf16/utf32 is used as specifier
Deprecate continuable heredocs. In previous versions, Elixir would continue parsing on the same line the heredoc started, this behavior has been deprecated
is_alive/0 is deprecated in favor of Node.alive?
Kernel.inspect/2 with Inspect.Opts[] is deprecated in favor of Inspect.Algebra.to_doc/2
Kernel.inspect/2 with :raw option is deprecated, use :records option instead
Deprecate <-/2 in favor of send/2
Do not leak clause heads. Previously, a variable defined in a case/receive head clauses would leak to the outer scope. This behaviour is deprecated and will be removed in the next release.
Deprecate __FILE__ in favor of __DIR__ or __ENV__.file
Change how -> is represented in AST. Now each clause is represented by its own AST node which makes composition easier. See commit 51aef55 for more information.
Add List.delete_at/2 and List.updated_at/3
Add Enum.reverse/2
Implement defmodule/2, @/1, def/2 and friends in Elixir itself. case/2, try/2 and receive/1 have been made special forms. var!/1, var!/2 and alias!/1 have also been implemented in Elixir and demoted from special forms
quote location: :keep now only affects definitions in order to keep the proper trace in definition exceptions
Set compilation status per ParallelCompiler and not globally
Improve stacktraces on command line interfaces
Sigils can now handle balanced tokens as in %s(f(o)o)
Emit warnings when an alias is not used
Guarantee aliases hygiene is respected when the current module name is not known upfront
Kernel.access/2 no longer flattens lists
pid_to_list/1, list_to_pid/1, binary_to_atom/2, binary_to_existing_atom/2 and atom_to_binary/2 are deprecated in favor of their counterparts in the :erlang module
insert_elem/3 and delete_elem/2 are deprecated in favor of Tuple.insert_at/3 and Tuple.delete_at/2
Use of in inside matches (as in x in [1,2,3] -> x) is deprecated in favor of the guard syntax (x when x in [1,2,3])
Kernel.access/2 now expects the second argument to be a compile time list
fn -> end quoted expression is no longer wrapped in a do keyword
Quoted variables from the same module must be explicitly shared. Previously, if a function returned quote do: a = 1, another function from the same module could access it as quote do: a. This has been fixed and the variables must be explicitly shared with var!(a, __MODULE__)
Allow documentation for types with @typedoc
Fix handling of multiple heredocs on the same line
Provide better error messages for match, guard and quoting errors
Make Kernel.raise/2 a macro to avoid messing up stacktraces
Ensure &() works on quoted blocks with only one expression
The previous partial application syntax (without the & operator) has now been deprecated
Include file and line on error report for overriding an existing function/macro
Convert external functions into quoted expressions. This allows record fields to contain functions as long as they point to an &Mod.fun/arity
Allow foo? and bar! as valid variable names
Limit inspect results to 50 items by default to avoid printing too much data
Return a readable error on oversized atoms
Allow functions ending with ? or ! to be captured
Fix default shutdown of child supervisors to :infinity
Fix regression when calling a function/macro ending with bang, followed by do/end blocks
list_to_binary/1, binary_to_list/1 and binary_to_list/3 are deprecated in favor of String.from_char_list!/1 and String.to_char_list!/1 for characters and :binary.list_to_bin/1, :binary.bin_to_list/1 and :binary.bin_to_list/3 for bytes
to_binary/1 is deprecated in favor of to_string/1
Deprecate def/4 and friends in favor of def/2 with unquote and friends
Deprecate %b and %B in favor of %s and %S
Binary.Chars was renamed to String.Chars
The previous ambiguous import syntax import :functions, Foo was removed in favor of import Foo, only: :functions
Add the capture operator &
Add support for GenFSM.Behaviour
Functions now points to the module and function they were defined when inspected
A documentation attached to a function that is never defined now prints warnings
Improve error messages when the use of an operator has no effect
Fix a bug where warnings were not being generated when imported macros conflicted with local functions or macros
Document that on_definition can only be a function as it is evaluated inside the function context
Ensure %w sigils with no interpolation are fully expanded at compile time
function(Mod.fun/arity) and function(fun/arity) are deprecated in favor of &Mod.fun/arity and &fun/arity
function/3 is deprecated in favor of Module.function/3
Kernel.ParallelCompiler now receives a set of callbacks instead of a single one
Add pretty printing support for inspect
Add document algebra library used as the foundation for pretty printing
Add defrecordp/3 that enables specifying the first element of the tuple
Add the Set API and a hash based implementation via HashSet
Add Stream as composable, lazy-enumerables
match?/2 does not leak variables to outer scope
Keep head|tail format when splicing at the tail
Ensure variables defined in the module body are not passed to callbacks
Deprecate recently added quote binding: ... in favor of the clearer quote bind_quoted: ...
Deprecate Kernel.float/1 in favor of a explicit conversion
The Binary.Inspect protocol has been renamed to Inspect
Tighten up the grammar rules regarding parentheses omission, previously the examples below would compile but now they raise an error message: