Age | Commit message (Collapse) | Author |
|
|
|
|
|
Background
-----------
In record fields with a type declaration but without an initializer, the
Erlang parser inserted automatically the singleton type 'undefined' to
the list of declared types, if that value was not present there.
I.e. the record declaration:
-record(rec, {f1 :: float(),
f2 = 42 :: integer(),
f3 :: some_mod:some_typ()}).
was translated by the parser to:
-record(rec, {f1 :: float() | 'undefined',
f2 = 42 :: integer(),
f3 :: some_mod:some_typ() | 'undefined'}).
The rationale for this was that creation of a "dummy" #rec{} record
should not result in a warning from dialyzer that e.g. the implicit
initialization of the #rec.f1 field violates its type declaration.
Problems
---------
This seemingly innocent action has some unforeseen consequences.
For starters, there is no way for programmers to declare that e.g. only
floats make sense for the f1 field of #rec{} records when there is no
`obvious' default initializer for this field. (This also affects tools
like PropEr that use these declarations produced by the Erlang parser to
generate random instances of records for testing purposes.)
It also means that dialyzer does not warn if e.g. an is_atom/1 test or
something more exotic like an atom_to_list/1 call is performed on the
value of the f1 field.
Similarly, there is no way to extend dialyzer to warn if it finds record
constructions where f1 is not initialized to some float.
Last but not least, it is semantically problematic when the type of the
field is an opaque type: creating a union of an opaque and a structured
type is very problematic for analysis because it fundamentally breaks
the opacity of the term at that point.
Change
-------
To solve these problems the parser will not automatically insert the
'undefined' value anymore; instead the user has the option to choose the
places where this value makes sense (for the field) and where it does
not and insert the | 'undefined' there manually.
Consequences of this change
----------------------------
This change means that dialyzer will issue a warning for all places
where records with uninitialized fields are created and those fields have
a declared type that is incompatible with 'undefined' (e.g. float()).
This warning can be suppressed easily by adding | 'undefined' to the
type of this field. This also adds documentation that the user really
intends to create records where this field is uninitialized.
|
|
* maint:
stdlib: Fix leaking files after error_logger:logfile(close)
|
|
Introduced when changing state from tuple to record.
|
|
The recently added module erl_anno can no longer handle
negative line numbers.
|
|
|
|
* bjorn/cuddle-with-tests: (23 commits)
rand_SUITE: Speed up basic_stats/1
base64_SUITE: Speed up roundtrip/1
lists_SUITE: Test lists:concat/2
lists_SUITE: Test lists:split/2
lists_SUITE: Add a test case for lists:prefix/2
lists_SUITE: Add hof/1 to test all high-order functions
lists_SUITE: Add test for lists:takewhile/1
lists_SUITE: Run test cases in each group in parallel
lists_SUITE: Test lists:keyreplace/4
lists_SUITE: Extend flatten/1 test to also test flatlength/1
lists_SUITE: Correct test of lists:flatten/2
id_transform_SUITE: Modernize test suite
io_proto_SUITE: Speed up determination of default shell
io_proto_SUITE: Refactor up rtnode() and friends
gen_event_SUITE: Remove unnecessary sleep calls
proc_lib: Improve coverage for crash/1
proc_lib_SUITE: Eliminate compiler warnings
io_SUITE: Add coverage/1 to completely cover io_lib_pretty
io_SUITE: Extend coverage of code for testing printable chars
io_SUITE: Speed up test for bad +pc option
...
|
|
Refactor basic_stats/1 into three separate test cases that can be
run in parallel.
|
|
Refactor roundtrip/1 into 4 test cases that can be run in parallel.
Assuming that there are 4 cores available, the group of 4 test
cases will run at roughly one fourth of the time for the original
test case.
|
|
|
|
|
|
|
|
|
|
|
|
On my computer, this will shave off more than one second of the
runnning time and about 4 seconds when cover is being run.
|
|
|
|
|
|
The test that was supposed to call lists:flatten/2 called
lists:flatten/1!
|
|
Remove handling of Clearcase; remove ?line macros.
|
|
Use getline_pred action that fails fast if the shell is not
the oldshell, to avoid having to wait for the timeout.
|
|
Introduce a new {getline_pred, Fun, Msg} action that is useful
in itself, but can also be used to share more code for
{getline, Match} and {getline_re, Match}.
Also get rid of the ?line macros in rtnode() so that we can
somewhat reduce the ridculous indentation level.
|
|
The calls to test_server:sleep/1 are unnecessary as the swapping
of handlers happens in a single process. Even though the
{swap_info,...} message is sent asynchronously, the
gen_event:which_handlers/1 call will not have a chance to
execute until the handlers have been swapped.
|
|
First refactor the entire test case using helper functions
to facilitate further maintenance. Then test that proc_lib
can handle that the process dictionary has been erased
(that will cover more code in proc_lib).
We can also shave off 2 seconds of the execution time by
testing the 'shutdown' exit reasons at beginning of the
test case instead of doing it at the end.
|
|
Use error/1 instead of forcing a badmatch.
|
|
|
|
|
|
Move the test for a bad +pc option to its own test case for
cleanliness. Use the os:cmd/1 function to avoid the annyoying
30 seconds time-out in test_server:start_node/3.
|
|
|
|
* maint:
stdlib: Fix bug with unicode detection in re
|
|
* howleysv/stdlib/compiled-unicode/OTP-12977:
stdlib: Fix bug with unicode detection in re
|
|
|
|
Fix bug with unrecognised 'unicode' option in re:split/2,3 &
re:replace/3,4 when using pre-compiled regex.
|
|
* maint:
dialyzer: Add a testcase
Add documentation
Introduce sasl_report_SUITE
Teach sasl_report to limit crash reports
proc_lib: Add format/3
Teach error_logger_tty_h to truncate big messages
error_logger_tty_h: Refactor and modernize code
Teach error_logger_file_h to truncate big messages
error_logger_file_h: Refactor and modernize code
Remove unused code in error logger handlers
Add error_logger_h_SUITE
sasl_SUITE: Add a rudimentary test of the utc_log configuration
sasl_SUITE: Correct the log_file/1 test case
proc_lib_SUITE: Remove added report handlers
zip_SUITE: Don't trust priv_dir to be empty
|
|
We'll need a way to limit the size of the crash report produced
by proc_lib:format(). Add format/3, where the third argument is
a depth argument.
|
|
Add the possibility to truncate big messages to avoid running out
of memory.
|
|
Add the possibility to truncate big messages to avoid running out
of memory.
|
|
|
|
Report handlers are not automatically removed. That means
that the report handler will remain installed until the entire
running of the stdlib test suite finishes. That could potentially
cause problems.
|
|
The unzip_to_binary/1 and zip_to_binary/1 test cases need the
test_server's priv_dir to be empty. On Windows, file system
pecularities can prevent us from emptying priv_dir.
Since the point of this test case is not to test file operations
on Windows, simplify things by working in a newly created sub
directory of priv_dir.
|
|
* maint:
stdlib: fix a qlc bug introduced in 18.0
|
|
As pointed out by roowe, qlc does not handle errors in early compiler
(scanner, parser) well in OTP 18.0.
|
|
The OSE port is no longer supported and this commit removed it
and any changes related to it. The things that were general
improvements have been left in the code.
|
|
|
|
|
|
* nybek/fix_supervisor_get_childspec:
Fix supervisor:get_childspec/2 for simple_one_for_one
OTP-12841
|
|
* sverk/ets-file2tab-preserve-opts/OTP-12814:
stdlib: Make ets:file2tab preserve read/write_concurrency
stdlib: Fix ets_SUITE:tabfile_ext4
|
|
|
|
Add new functions erl_parse:type_inop_prec() and
erl_parse:type_preop_prec().
Get rid of paren_type used for parentheses in types.
|
|
* rickard/timer-improvement/OTP-12650:
Callback timer
Disable accessor timer option
Aux work flag descriptions
Fix test cases
|