about summary refs log tree commit diff
AgeCommit message (Collapse)AuthorLines
2019-08-18Auto merge of #63635 - oli-obk:default-slice-dangles, r=eddybbors-9/+34
Do not generate allocations for zero sized allocations Alternative to https://github.com/rust-lang/rust/issues/62487 r? @eddyb There are other places where we could do this, too, but that would cause `static FOO: () = ();` to not have a unique address
2019-08-18Auto merge of #63269 - Aaron1011:feature/proc-macro-data, r=eddyb,petrochenkovbors-210/+240
Serialize additional data for procedural macros Split off from #62855 This PR serializes the declaration `Span` and attributes for all procedural macros. This allows Rustdoc to properly render doc comments and source links when performing inlinig procedural macros across crates
2019-08-18Auto merge of #62948 - matklad:failable-file-loading, r=petrochenkovbors-104/+102
Normalize newlines when loading files Fixes #62865
2019-08-18Auto merge of #61708 - dlrobertson:or-patterns-0, r=centrilbors-51/+241
Initial implementation of or-patterns An incomplete implementation of or-patterns (e.g. `Some(0 | 1)` as a pattern). This patch set aims to implement initial parsing of `or-patterns`. Related to: #54883 CC @alexreg @varkor r? @Centril
2019-08-17Auto merge of #63671 - Centril:rollup-zufavt5, r=Centrilbors-290/+924
Rollup of 5 pull requests Successful merges: - #62451 (Add APIs for uninitialized Box, Rc, and Arc. (Plus get_mut_unchecked)) - #63487 (Remove meaningless comments in src/test) - #63657 (Crank up invalid value lint) - #63667 (resolve: Properly integrate derives and `macro_rules` scopes) - #63669 (fix typos in mir/interpret) Failed merges: r? @ghost
2019-08-17Rollup merge of #63669 - Dante-Broggi:patch-1, r=jonas-schievinkMazdak Farrokhzad-2/+2
fix typos in mir/interpret
2019-08-17Rollup merge of #63667 - petrochenkov:deriveholders, r=matthewjasperMazdak Farrokhzad-47/+82
resolve: Properly integrate derives and `macro_rules` scopes So, ```rust #[derive(A, B)] struct S; m!(); ``` turns into something like ```rust struct S; A_placeholder!( struct S; ); B_placeholder!( struct S; ); m!(); ``` during expansion. And for `m!()` its "`macro_rules` scope" (aka "legacy scope") should point to the `B_placeholder` call rather than to the derive container `#[derive(A, B)]`. `fn build_reduced_graph` now makes sure the legacy scope points to the right thing. (It's still a mystery for me why this worked before https://github.com/rust-lang/rust/pull/63535.) Unfortunately, placeholders from derives are currently treated separately from placeholders from other macros and need to be passed as `extra_placeholders` rather than a part of the AST fragment. That's fixable, but I wanted to keep this PR more minimal to close the regression faster. Fixes https://github.com/rust-lang/rust/issues/63651 r? @matthewjasper
2019-08-17Rollup merge of #63657 - RalfJung:invalid_value, r=CentrilMazdak Farrokhzad-82/+267
Crank up invalid value lint * Warn against uninit `bool` and `char`. * Warn against 0-init `NonNull` and friends * Detect transmute-from-0 as zero-initialization ([seen in the wild](https://github.com/glium/glium/issues/1775#issuecomment-522144636))
2019-08-17Rollup merge of #63487 - sd234678:remove-meaningless-comments-in-src/test-2, ↵Mazdak Farrokhzad-149/+68
r=Centril Remove meaningless comments in src/test Moved from #63411
2019-08-17Rollup merge of #62451 - SimonSapin:new_uninit, r=RalfJungMazdak Farrokhzad-10/+505
Add APIs for uninitialized Box, Rc, and Arc. (Plus get_mut_unchecked) Assigning `MaybeUninit::<Foo>::uninit()` to a local variable is usually free, even when `size_of::<Foo>()` is large. However, passing it for example to `Arc::new` [causes at least one copy](https://youtu.be/F1AquroPfcI?t=4116) (from the stack to the newly allocated heap memory) even though there is no meaningful data. It is theoretically possible that a Sufficiently Advanced Compiler could optimize this copy away, but this is [reportedly unlikely to happen soon in LLVM](https://youtu.be/F1AquroPfcI?t=5431). This PR proposes two sets of features: * Constructors for containers (`Box`, `Rc`, `Arc`) of `MaybeUninit<T>` or `[MaybeUninit<T>]` that do not initialized the data, and unsafe conversions to the known-initialized types (without `MaybeUninit`). The constructors are guaranteed not to make unnecessary copies. * On `Rc` and `Arc`, an unsafe `get_mut_unchecked` method that provides `&mut T` access without checking the reference count. `Arc::get_mut` involves multiple atomic operations whose cost can be non-trivial. `Rc::get_mut` is less costly, but we add `Rc::get_mut_unchecked` anyway for symmetry with `Arc`. These can be useful independently, but they will presumably be typical when the new constructors of `Rc` and `Arc` are used. An alternative with a safe API would be to introduce `UniqueRc` and `UniqueArc` types that have the same memory layout as `Rc` and `Arc` (and so zero-cost conversion to them) but are guaranteed to have only one reference. But introducing entire new types feels “heavier” than new constructors on existing types, and initialization of `MaybeUninit<T>` typically requires unsafe code anyway. Summary of new APIs (all unstable in this PR): ```rust impl<T> Box<T> { pub fn new_uninit() -> Box<MaybeUninit<T>> {…} } impl<T> Box<MaybeUninit<T>> { pub unsafe fn assume_init(self) -> Box<T> {…} } impl<T> Box<[T]> { pub fn new_uninit_slice(len: usize) -> Box<[MaybeUninit<T>]> {…} } impl<T> Box<[MaybeUninit<T>]> { pub unsafe fn assume_init(self) -> Box<[T]> {…} } impl<T> Rc<T> { pub fn new_uninit() -> Rc<MaybeUninit<T>> {…} } impl<T> Rc<MaybeUninit<T>> { pub unsafe fn assume_init(self) -> Rc<T> {…} } impl<T> Rc<[T]> { pub fn new_uninit_slice(len: usize) -> Rc<[MaybeUninit<T>]> {…} } impl<T> Rc<[MaybeUninit<T>]> { pub unsafe fn assume_init(self) -> Rc<[T]> {…} } impl<T> Arc<T> { pub fn new_uninit() -> Arc<MaybeUninit<T>> {…} } impl<T> Arc<MaybeUninit<T>> { pub unsafe fn assume_init(self) -> Arc<T> {…} } impl<T> Arc<[T]> { pub fn new_uninit_slice(len: usize) -> Arc<[MaybeUninit<T>]> {…} } impl<T> Arc<[MaybeUninit<T>]> { pub unsafe fn assume_init(self) -> Arc<[T]> {…} } impl<T: ?Sized> Rc<T> { pub unsafe fn get_mut_unchecked(this: &mut Self) -> &mut T {…} } impl<T: ?Sized> Arc<T> { pub unsafe fn get_mut_unchecked(this: &mut Self) -> &mut T {…} } ```
2019-08-17test in a way that works even with muslRalf Jung-65/+58
2019-08-17Doc nitSimon Sapin-1/+1
Co-Authored-By: Ralf Jung <post@ralfj.de>
2019-08-17fix typosDante-Broggi-2/+2
2019-08-17resolve/expand: Rename some things for clarityVadim Petrochenkov-41/+43
2019-08-17Auto merge of #63658 - RalfJung:miri-op, r=oli-obkbors-92/+112
Refactor Miri ops (unary, binary) to have more types This is the part of https://github.com/rust-lang/rust/pull/63448 that is just a refactoring. It helps that PR by making it easier to perform machine arithmetic. r? @oli-obk @eddyb
2019-08-17resolve: Properly integrate derives and `macro_rules` scopesVadim Petrochenkov-14/+47
2019-08-17Serialize additional data for procedural macrosAaron Hill-210/+240
Split off from #62855 This PR deerializes the declaration `Span` and attributes for all procedural macros from their underlying function definitions. This allows Rustdoc to properly render doc comments and source links when inlining procedural macros across crates
2019-08-17initial implementation of or-pattern parsingDan Robertson-60/+142
Initial implementation of parsing or-patterns e.g., `Some(Foo | Bar)`. This is a partial implementation of RFC 2535.
2019-08-17Initial implementation of or patternsvarkor-26/+134
2019-08-17Rename private helper method allocate_for_unsized to allocate_for_layoutSimon Sapin-10/+10
2019-08-17less &Ralf Jung-3/+3
2019-08-17Doc nitsSimon Sapin-15/+15
Co-Authored-By: Ralf Jung <post@ralfj.de>
2019-08-17Auto merge of #63462 - matthewjasper:hygienic-builtin-derives, r=petrochenkovbors-272/+376
Opaque builtin derive macros * Buiilt-in derives are now opaque macros * This required limiting the visibility of some previously unexposed functions in `core`. * This also required the change to `Ident` serialization. * All gensyms are replaced with hygienic identifiers * Use hygiene to avoid most other name-resolution issues with buiilt-in derives. * As far as I know the only remaining case that breaks is an ADT that has the same name as one of its parameters. Fixing this completely seemed to be more effort than it's worth. * Remove gensym in `Ident::decode`, which lead to linker errors due to `inline` being gensymmed. * `Ident`now panics if incremental compilation tries to serialize it (it currently doesn't). * `Ident` no longer uses `gensym` to emulate cross-crate hygiene. It only applied to reexports. * `SyntaxContext` is no longer serializable. * The long-term fix for this is to properly implement cross-crate hygiene, but this seemed to be acceptable for now. * Move type/const parameter shadowing checks to `resolve` * This was previously split between resolve and type checking. The type checking pass compared `InternedString`s, not Identifiers. * Removed the `SyntaxContext` from `{ast, hir}::{InlineAsm, GlobalAsm}` cc #60869 r? @petrochenkov
2019-08-17drift leftwardRalf Jung-14/+12
2019-08-17fix testsRalf Jung-3/+3
2019-08-17Full stopRalf Jung-1/+1
Co-Authored-By: Mazdak Farrokhzad <twingoow@gmail.com>
2019-08-17use ImmTy::from_uint in a few more spotsRalf Jung-18/+9
2019-08-17make both unary_op and binary_op fully typed, including a return typeRalf Jung-69/+90
2019-08-17Add ImmTy::from_uintRalf Jung-5/+13
2019-08-17invalid_value: also detect transmute-from-0 (seen in the wild)Ralf Jung-45/+110
2019-08-17multi-variant enums are trickyRalf Jung-1/+3
2019-08-17invalid_value: warn for types with custom valid rangeRalf Jung-30/+102
2019-08-17warn about uninit bools and charsRalf Jung-7/+45
2019-08-17invalid_value: factor finding dangerous inits into separate functionRalf Jung-37/+54
2019-08-17Add testsOliver Scherer-0/+19
2019-08-17Cast only where necessaryOliver Scherer-4/+5
2019-08-17Auto merge of #63655 - Centril:rollup-ty1ot40, r=Centrilbors-10/+77
Rollup of 4 pull requests Successful merges: - #62737 (Override Cycle::try_fold) - #63505 (Hash the remapped sysroot instead of the original.) - #63559 (rustc_codegen_utils: account for 1-indexed anonymous lifetimes in v0 mangling.) - #63621 (Modify librustc_llvm to pass -DNDEBUG while compiling.) Failed merges: r? @ghost
2019-08-17Rollup merge of #63621 - jgalenson:dndebug, r=alexcrichtonMazdak Farrokhzad-0/+7
Modify librustc_llvm to pass -DNDEBUG while compiling. Currently, librustc_llvm builds are not reproducible because the LLVM files it compiles use the debug version of llvm_unreachable, which uses __FILE__. To fix this, we propagate NDEBUG from bootstrap if applicable and use it when compiling librustc_llvm. r? @alexcrichton
2019-08-17Rollup merge of #63559 - eddyb:v0-mangling-off-by-1, r=estebankMazdak Farrokhzad-8/+16
rustc_codegen_utils: account for 1-indexed anonymous lifetimes in v0 mangling. I don't really understand why `anonymize_late_bound_regions` starts with `BrAnon(1)` instead of `BrAnon(0)`, but it does (maybe @nikomatsakis knows?): https://github.com/rust-lang/rust/blob/c43d03a19f326f4a323569328cc501e86eb6d22e/src/librustc/ty/fold.rs#L696-L712 Thankfully, the mangling format and demangler implementations are fine, and I just needed to offset the anonymized lifetime indices by `1` to get the correct mangling. cc @alexcrichton @michaelwoerister
2019-08-17Rollup merge of #63505 - jgalenson:sysroot-hash, r=alexcrichtonMazdak Farrokhzad-2/+12
Hash the remapped sysroot instead of the original. One of the reasons that rustc builds are not reproducible is because the --sysroot path is dependent on the current directory. We can fix this by hashing the remapped sysroot instead of the original when applicable. Note that with this patch, the hash will stay the same if both the sysroot and the remapped path change. However, given that if the contents of the sysroot change the hash will also stay the same, this might be acceptable. I would appreciate feedback on the best way to do this. This helps #34902, although it does not fix it by itself.
2019-08-17Rollup merge of #62737 - timvermeulen:cycle_try_fold, r=scottmcmMazdak Farrokhzad-0/+42
Override Cycle::try_fold It's not very pretty, but I believe this is the simplest way to correctly implement `Cycle::try_fold`. The following may seem correct: ```rust loop { acc = self.iter.try_fold(acc, &mut f)?; self.iter = self.orig.clone(); } ``` ...but this loops infinitely in case `self.orig` is empty, as opposed to returning `acc`. So we first have to fully iterate `self.orig` to check whether it is empty or not, and before _that_, we have to iterate the remaining elements of `self.iter`. This should always call `self.orig.clone()` the same amount of times as repeated `next()` calls would. r? @scottmcm
2019-08-17Remove unused `SyntaxContext` serialization implsMatthew Jasper-20/+0
The implementations were wrong and unused.
2019-08-17Remove SyntaxContext from {ast, hir}::{GlobalAsm, InlineAsm}Matthew Jasper-25/+18
We now store it in the `Span` of the expression or item.
2019-08-17Move type parameter shadowing errors to resolveMatthew Jasper-109/+108
For some reason type checking did this. Further it didn't consider hygiene.
2019-08-17Remove gensyms from built-in derivesMatthew Jasper-86/+188
Also make them generally more hygienic with name resolution.
2019-08-17Make fmt-internal functions privateMatthew Jasper-5/+8
2019-08-17Make built-in derives opaque macrosMatthew Jasper-13/+13
2019-08-17Stop emulating cross-crate hygiene with gensymsMatthew Jasper-32/+59
Most `Ident`s are serialized as `InternedString`s the exceptions are: * Reexports * Attributes * Idents in macro definitions Using gensyms helped reexports emulate hygiene. However, the actual item wouldn't have a gensymmed name so would be usable cross-crate. So removing this case until we have proper cross-crate hygiene seems sensible. Codegen attributes (`inline`, `export_name`) are resolved by their `Symbol`. This meant that opaque macro-expanded codegen attributes could cause linker errors. This prevented making built-in derives hygienic.
2019-08-17Auto merge of #63491 - Xanewok:update-rls, r=Mark-Simulacrumbors-0/+0
Update RLS This fixes handling default configuration for the `crate_blacklist` RLS configuration. Technically this isn't needed, as the VS Code extension can be configured to accept a predefined blacklist that's equal to the default one but it's best that it also lands so that we don't need to work around that. Without this, manually passing a `null` value as the configuration unfortunately crashes the RLS. This is the last fix related to configuration. cc https://github.com/rust-lang/rust/pull/63472 r? @Mark-Simulacrum
2019-08-17Auto merge of #63648 - Centril:rollup-2kpdrj1, r=Centrilbors-207/+271
Rollup of 6 pull requests Successful merges: - #63149 (resolve: Populate external modules in more automatic and lazy way) - #63545 (Feature gate 'yield $expr?' pre-expansion) - #63548 (Update rustc-demangle to 0.1.16.) - #63558 (Remap paths for proc-macro crates.) - #63641 (add git keyword to submodule comments in config.example.toml) - #63642 (Rename overflowing_{add,sub,mul} intrinsics to wrapping_{add,sub,mul}.) Failed merges: r? @ghost