Commit Graph

66521 Commits

Author SHA1 Message Date
bors
2b82b7e50a Auto merge of #43554 - eddyb:apfloat, r=nikomatsakis
APFloat: Rewrite It In Rust and use it for deterministic floating-point CTFE.

As part of the CTFE initiative, we're forced to find a solution for floating-point operations.
By design, IEEE-754 does not explicitly define everything in a deterministic manner, and there is some variability between platforms, at the very least (e.g. NaN payloads).

If types are to evaluate constant expressions involving type (or in the future, const) generics, that evaluation needs to be *fully deterministic*, even across `rustc` host platforms.
That is, if `[T; T::X]` was used in a cross-compiled library, and the evaluation of `T::X` executed a floating-point operation, that operation has to be reproducible on *any other host*, only knowing `T` and the definition of the `X` associated const (as either AST or HIR).

Failure to uphold those rules allows an associated type (e.g. `<Foo as Iterator>::Item`) to be seen as two (or more) different types, depending on the current host, and such type safety violations typically allow writing of a `transmute` in safe code, given enough generics.

The options considered by @rust-lang/compiler were:
1. Ban floating-point operations in generic const-evaluation contexts
2. Emulate floating-point operations in an uniformly deterministic fashion

The former option may seem appealing at first, but floating-point operations *are allowed today*, so they can't be banned wholesale, a distinction has to be made between the code that already works, and future generic contexts. *Moreover*, every computation that succeeded *has to be cached*, otherwise the generic case can be reproduced without any generics. IMO there are too many ways it can go wrong, and a single violation can be enough for an unsoundness hole.
Not to mention we may end up really wanting floating-point operations *anyway*, in CTFE.

I went with the latter option, and seeing how LLVM *already* has a library for this exact purpose (as it needs to perform optimizations independently of host floating-point capabilities), i.e. `APFloat`, that was what I ended up basing this PR on.
But having been burned by the low reusability of bindings that link to LLVM, and because I would *rather* the floating-point operations to be wrong than not deterministic or not memory-safe (`APFloat` does far more pointer juggling than I'm comfortable with), I decided to RIIR.

This way, we have a guarantee of *no* `unsafe` code, a bit more control over the where native floating-point might accidentally be involved, and non-LLVM backends can share it.
I've also ported all the testcases over, *before* any functionality, to catch any mistakes.

Currently the PR replaces all CTFE operations to go through `apfloat::ieee::{Single,Double}`, keeping only the bits of the `f32` / `f64` memory representation in between operations.
Converting from a string also double-checks that `core::num` and `apfloat` agree on the interpretation of a floating-point number literal, in case either of them has any bugs left around.

r? @nikomatsakis
f? @nagisa @est31

<hr/>

Huge thanks to @edef1c for first demoing usable `APFloat` bindings and to @chandlerc for fielding my questions on IRC about `APFloat` peculiarities (also upstreaming some bugfixes).
2017-08-05 13:12:56 +00:00
Corey Farwell
6722185abd Indicate how to turn byte slices back into a string slice. 2017-08-05 08:27:25 -04:00
Corey Farwell
de4f1a170f Update str::split_at_mut example to demonstrate mutability. 2017-08-05 08:27:24 -04:00
bjorn3
068710f28a Make some comments doc comments in librustc/middle/cstore.rs 2017-08-05 10:42:53 +02:00
bors
5c7add7551 Auto merge of #43640 - oli-obk:patch-5, r=nikomatsakis
Uplift some comments to Doc comments
2017-08-05 07:31:00 +00:00
bors
e8909d257b Auto merge of #43642 - mmatyas:unskip_aarch64_tests, r=sanxiyn
Unskip some tests on AArch64

I've been running the test suite remotely on an Acer Chromebook R13 and natively on an ARM Juno developer board, both AArch64 devices. Most of the tests that are skipped on AArch64 are due to testing stdcall/fastcall/x86-specific code or the debugger, but I've found a few tests that could be enabled there.

These have been skipped previously due to failing on the `aarch64-linux-android` and `mac-android` buildbots, more than 2 years ago (#23471, #23695). It seems we don't test those platforms any more, but as they do work on AArch64 Linux, I'd like to propose re-enabling them. All of them pass on my devices.
2017-08-05 05:08:12 +00:00
Florian Zeitz
11d6312abd codegen tests: Check type of len argument to llvm.memset.* based on the exact intrinsic used 2017-08-05 04:15:51 +02:00
bors
49ded7ece3 Auto merge of #43639 - TobiasSchaffner:master, r=alexcrichton
Add L4Re Support in librustc_back

Add experimental support for x86_64-unknown-l4re-uclibc target, which covers the L4 Runtime Environment.

This pull request contains the changes that have to be made to librustc_back. It follows the changes humenda made in pull request https://github.com/rust-lang/libc/pull/591 to libc.

Next steps will be the modifications to the needed libraries. (libstd,  liballoc_system, libpanic_abort, libunwind)

Thanks to humenda for reviewing.
2017-08-05 01:58:24 +00:00
Ralf Jung
94f7511ac2 test MIR validation statements in closures 2017-08-04 17:00:21 -07:00
bors
9b6c2382a7 Auto merge of #43615 - dhduvall:lto-unaligned-read, r=nagisa
Fix some unaligned reads on SPARC in LTO

This fixes #43593 by eliminating some undefined behavior.
2017-08-04 22:35:22 +00:00
bors
d692a91fa6 Auto merge of #43590 - michaelwoerister:no-reopening-1, r=nikomatsakis
incr.comp.: Assert that no DepNode is re-opened (see issue #42298).

This PR removes the last occurrence of DepNode re-opening and adds an assertion that prevents our doing so in the future too. The DepGraph should no be guaranteed to be cycle free.

r? @nikomatsakis

EDIT: Closes https://github.com/rust-lang/rust/issues/42298
2017-08-04 20:06:09 +00:00
bors
ff1135b224 Auto merge of #43577 - cuviper:link-llvm-dylib, r=sanxiyn
Link LLVM tools dynamically

Set `LLVM_LINK_LLVM_DYLIB=ON` -- "If enabled, tools will be linked with
the libLLVM shared library."  Rust doesn't ship any of the LLVM tools,
and only needs a few at all for some test cases, so statically linking
the tools is just a waste of space.  I've also had memory issues on
slower machines with LLVM debuginfo enabled, when several tools start
linking in parallel consuming several GBs each.

With the default configuration, `build/x86_64-unknown-linux-gnu/llvm`
was 1.5GB before, now down to 731MB.  The difference is more drastic
with `--enable-llvm-release-debuginfo`, from 28GB to "only" 13GB.

This does not change the linking behavior of `rustc_llvm`.
2017-08-04 17:36:10 +00:00
Natalie Boehm
b298a58c78 Update String Deref to explain why using &String does not always work 2017-08-04 12:25:05 -04:00
bors
dae8864dbe Auto merge of #43600 - scalexm:issue-35976, r=nikomatsakis
Add a more precise error message for issue #35976

When trying to perform static dispatch on something which derefs to a trait object, and the target trait is not in scope, we had confusing error messages if the target method had a `Self: Sized` bound. We add a more precise error message in this case: "consider using trait ...".

Fixes #35976.

r? @nikomatsakis
2017-08-04 15:03:00 +00:00
Paul Faria
0d29cd4c80 Keep map hidden and instead move it out after visitor is finished 2017-08-04 09:06:55 -04:00
Aaron Power
09c1b74861 Update RELEASES.md 2017-08-04 13:40:05 +01:00
Aaron Power
1618664a73 Update RELEASES.md 2017-08-04 13:35:30 +01:00
Corey Farwell
ea6a657175 Indicate why str::{get,get_mut} examples return None. 2017-08-04 08:21:28 -04:00
Mátyás Mustoha
28c423d692 Unskip some tests on AArch64 2017-08-04 13:45:08 +02:00
Ruud van Asseldonk
608863d817 Only allow long relative urls after a link label
Yellow is indeed a nice color for a bikeshed.
2017-08-04 13:24:00 +02:00
Oliver Schneider
a508a2e56b Uplift some comments to Doc comments 2017-08-04 12:33:48 +02:00
bors
f2a5af7a4c Auto merge of #43442 - zackmdavis:note_available_field_names_if_levenshtein_fails, r=nikomatsakis
field does not exist error: note fields if Levenshtein suggestion fails

When trying to access or initialize a nonexistent field, if we can't infer what
field was meant (by virtue of the purported field in the source being a small
Levenshtein distance away from an actual field, suggestive of a typo), issue a
note listing all the available fields. To reduce terminal clutter, we don't
issue the note when we have a `find_best_match_for_name` Levenshtein
suggestion: the suggestion is probably right.

The third argument of the call to `find_best_match_for_name` is changed to
`None`, accepting the default maximum Levenshtein distance of one-third of the
identifier supplied for correction. The previous value of `Some(name.len())`
was overzealous, inappropriately very Levenshtein-distant suggestions when the
attempted field access could not plausibly be a mere typo. For example, if a
struct has fields `mule` and `phone`, but I type `.donkey`, I'd rather the
error have a note listing that the available fields are, in fact, `mule` and
`phone` (which is the behavior induced by this patch) rather than the error
asking "did you mean `phone`?" (which is the behavior on master). The "only
find fits with at least one matching letter" comment was accurate when it was
first introduced in 09d992471 (January 2015), but is a vicious lie in its
present context before a call to `find_best_match_for_name` and must be
destroyed (replacing every letter is within a Levenshtein distance of name.len()).

The present author claims that this suffices to resolve #42599.
2017-08-04 10:13:55 +00:00
scalexm
e7e620d0cc Rename ConfirmResult fields 2017-08-04 12:04:34 +02:00
arshiamufti
0f924b86c4 add test 2017-08-04 00:53:09 -07:00
bors
c523b3f954 Auto merge of #43403 - RalfJung:mir-validate, r=nikomatsakis
Add MIR Validate statement

This adds statements to MIR that express when types are to be validated (following [Types as Contracts](https://internals.rust-lang.org/t/types-as-contracts/5562)). Obviously nothing is stabilized, and in fact a `-Z` flag has to be passed for behavior to even change at all.

This is meant to make experimentation with Types as Contracts in miri possible. The design is definitely not final.

Cc @nikomatsakis @aturon
2017-08-04 07:48:07 +00:00
Josh Stone
6c46f4f11c Use LLVM_LINK_LLVM_DYLIB only on linux-gnu and apple-darwin 2017-08-04 00:13:11 -07:00
Tobias Schaffner
c151220a84 Add L4Re Support in librustc_back
Add support for x86_64-unknown-l4re-uclibc target, which covers
the L4 Runtime Environment.
2017-08-04 08:59:01 +02:00
bors
5431f423aa Auto merge of #43634 - dhduvall:solaris-test-fixes, r=sanxiyn
Fix a number of failing tests on Solaris and SPARC
2017-08-04 05:30:12 +00:00
bors
eae446c4dc Auto merge of #43459 - ids1024:asrawfd, r=alexcrichton
Implement AsRawFd for Stdin, Stdout, and Stderr

https://github.com/rust-lang/rfcs/issues/2074
2017-08-04 02:15:04 +00:00
Florian Zeitz
67044501bc trans: Reuse immediate value in call to call_memset() 2017-08-04 02:27:30 +02:00
Luca Barbato
844e9adf25 Add support for Vector Subtract Carryout on PowerPC 2017-08-04 00:19:58 +00:00
Danek Duvall
9144755a91 Recognize SPARC in more tests where architecture matters. 2017-08-03 17:19:19 -07:00
Danek Duvall
497c5a34da Solaris linker options need to be accounted for in one test.
This is a follow-up to f189d7a693 and 9d11b089ad.  While `-z ignore`
is what needs to be passed to the Solaris linker, because gcc is used as
the default linker, both that form and `-Wl,-z -Wl,ignore` (including
extra double quotes) need to be taken into account, which explains the
more complex regular expression.
2017-08-03 17:18:19 -07:00
Luca Barbato
b07a059643 Add support for Vector Subtract Saturated on PowerPC 2017-08-04 00:16:22 +00:00
Ian Douglas Scott
64e426e8e9
Fix AsRawHandle 2017-08-03 15:54:53 -07:00
Josh Stone
ced1fda565 Exclude Windows from LLVM_LINK_LLVM_DYLIB 2017-08-03 15:42:05 -07:00
Danek Duvall
45b90ef52e Some tests use res_init() and need -lresolv on Solaris
This is a follow-up to ea23e50f, which fixed it for the build.
2017-08-03 15:38:34 -07:00
Danek Duvall
9427bb36f6 Fix a dangling symlink bug in remove_dir_all() on Solaris
This fixes a handful of long-failing tests.
2017-08-03 14:55:01 -07:00
Guillaume Gomez
66317a39a6 Update highlight colors 2017-08-03 22:55:17 +02:00
Ian Douglas Scott
eac01f123d
Implement AsRawHandle for Std* on Windows 2017-08-03 12:57:53 -07:00
bors
1d2a6df384 Auto merge of #43619 - frewsxcv:frewsxcv-thread, r=QuietMisdreavus
Thread docs fix and improvements.

None
2017-08-03 19:40:27 +00:00
Ruud van Asseldonk
5b30cc178a Detect relative urls in tidy check 2017-08-03 21:13:27 +02:00
bors
c701ba6efb Auto merge of #43618 - SimonSapin:nomiconup, r=steveklabnik
Update nomicon

(This should have been in https://github.com/rust-lang/rust/pull/42959.)
2017-08-03 16:54:22 +00:00
bors
8cb4b2c589 Auto merge of #43609 - dsprenkels:issue-40510, r=Mark-Simulacrum
Add regression test for #40510

This pull request adds a test case for issue #40510.

Fixes #40510.
2017-08-03 14:21:37 +00:00
Aaron Power
c88ec60e5f Update RELEASES.md 2017-08-03 15:16:49 +01:00
Aaron Power
6200aeff61 fixed some formatting 2017-08-03 15:07:41 +01:00
Aaron Power
553ac5279e Updated release notes for 1.20 2017-08-03 15:04:05 +01:00
Michael Woerister
b34c5a23ab incr.comp.: Make ConstEval dep-node anonymous. 2017-08-03 14:45:01 +02:00
scalexm
2e8e75f50f Tweak error message 2017-08-03 14:40:40 +02:00
scalexm
da12c4f8e5 Handle ambiguous cases 2017-08-03 14:40:40 +02:00