Commit Graph

110774 Commits

Author SHA1 Message Date
Dylan DPC
e3a514c44a
Rollup merge of #71174 - Nokel81:fix-async-main-error, r=petrochenkov
Check that main/start is not async

* Add new error code E0752
* Add span to hir::IsAsync::Yes
* Emit an error if main or the start function is marked as async
* Add two regression tests

This PR fixes #68523.
2020-04-21 00:30:55 +02:00
Dylan DPC
69a528eda6
Rollup merge of #69362 - CAD97:alloc_layout_extras, r=Amanieu
Stabilize most common subset of alloc_layout_extras

Tracking issue: https://github.com/rust-lang/rust/issues/55724

Specifically, this stabilizes:

```rust
pub fn Layout::align_to(&self, align: usize) -> Result<Layout, LayoutErr>;
pub fn Layout::pad_to_align(&self) -> Layout;
pub fn Layout::extend(&self, next: Layout) -> Result<(Layout, usize), LayoutErr>;
pub fn Layout::array<T>(n: usize) -> Result<Layout, LayoutErr>;
```

Methods that are tracked by #55724 but are not stabilized here:

```rust
pub fn Layout::padding_needed_for(&self, align: usize) -> usize;
pub fn Layout::repeat(&self, n: usize) -> Result<(Layout, usize), LayoutErr>;
pub fn Layout::repeat_packed(&self, n: usize) -> Result<Layout, LayoutErr>;
pub fn Layout::extend_packed(&self, next: Layout) -> Result<Layout, LayoutErr>;
```

Combined, these stabilized functions allow code to construct and manipulate `repr(C)` layouts while letting the standard library handle correctness in the face of edge cases. For example use cases, consider the usage in [hashbrown](https://github.com/Amanieu/hashbrown/blob/2f2af1d/src/raw/mod.rs#L143), [crossbeam-skiplist](https://github.com/crossbeam-rs/crossbeam-skiplist/blob/master/src/base.rs#L99), [pointer-utils/slice-dst](92aeefeed9/crates/slice-dst/src/layout_polyfill.rs), and of course the standard library itself.

Providing a higher-level API such as `Layout::repr_c<const N: usize>(fields: [Layout; N]) -> Result<(Layout, [usize; N]), LayoutErr>` is blocked on const generics, which are a ways off. Providing an API that doesn't provide offsets would be quite suboptimal, as the reason for calculating the layout like this rather than `Layout::new` is to get the field offsets.

The primary issue with the current API is having to call `.pad_to_align()` to match the layout of a `repr(C)` struct. However, I think this is not just a (failing? limitation?) of the API, but rather intrinsic complexity. While all Rust-defined types have size==stride, and probably will for the foreseeable future, there is no inherent reason why this is a limitation of all allocations. As such, the `Layout` manipulation APIs shouldn't impose this limitation, and instead the higher level api of `repr_c` (or just plain old using `Layout::new`) can make keeping it simple.

cc @matklad r? @rust-lang/libs
2020-04-21 00:30:53 +02:00
Linus Färnstrand
9af047ff74 Fix show-const-contents rustdoc test 2020-04-20 23:38:07 +02:00
Linus Färnstrand
6850e4a1ae Use assoc float consts instead of module level 2020-04-20 23:38:06 +02:00
Linus Färnstrand
4ddf66187a Define module level int consts from assoc consts 2020-04-20 23:38:06 +02:00
Linus Färnstrand
9fc0833235 Stop accessing module level int consts via crate::<Ty> 2020-04-20 23:38:06 +02:00
Amanieu d'Antras
3eb1c43720 Ignore -Zprofile when building compiler_builtins 2020-04-20 20:31:32 +01:00
Jonas Schievink
415fd0cc1a const prop: don't special case return place 2020-04-20 21:18:20 +02:00
Jonas Schievink
9e6f38ab0d Use copy_op_transmute 2020-04-20 21:18:20 +02:00
Jonas Schievink
1ce6e6a999 Bless 32-bit test output 2020-04-20 21:18:20 +02:00
Jonas Schievink
f0ab46953b Remove unnecessary block 2020-04-20 21:18:20 +02:00
Jonas Schievink
a5c1851607 Fix codegen and mir-opt tests
Mostly renamed allocations, but I'm not sure about the const prop tests
2020-04-20 21:18:20 +02:00
Jonas Schievink
c5bfbb6ad1 Update const prop 2020-04-20 21:18:20 +02:00
Jonas Schievink
0fda0fd859 Dump return_place upon returning 2020-04-20 21:18:20 +02:00
Jonas Schievink
34ed891895 Fix pop_stack_frame logic 2020-04-20 21:18:20 +02:00
Jonas Schievink
a417f963fe Remove null places 2020-04-20 21:18:20 +02:00
Jonas Schievink
4eaf535d2b Treat RETURN_PLACE as a normal Local
Copy its value to the `return_place` upon leaving a call frame
2020-04-20 21:18:18 +02:00
bors
20fc02f836 Auto merge of #71356 - Dylan-DPC:rollup-liockhk, r=Dylan-DPC
Rollup of 5 pull requests

Successful merges:

 - #71250 (Replace big JS dict with JSON parsing)
 - #71270 (Fix `has_no_input_arg` check and rename it to `has_only_self_parameter`)
 - #71284 (fix -Zast-json to output correct JSON form)
 - #71328 (Stabilize PathBuf capacity methods)
 - #71334 (Update pattern docs.)

Failed merges:

r? @ghost
2020-04-20 19:11:28 +00:00
Mateusz Mikuła
9296d3ba82 Do not build tools if user do not want them 2020-04-20 20:30:13 +02:00
Esteban Küber
e536257061 Ensure tail expression will have a Ty for E0746
When the return type is `!Sized` we look for all the returned
expressions in the body to fetch their types and provide a reasonable
suggestion. The tail expression of the body is normally evaluated after
checking whether the return type is `Sized`. Changing the order of the
evaluation produces undesirable knock down effects, so we detect the
specific case that newcomers are likely to encounter ,returning a single
bare trait object, and only in that case we evaluate the tail
expression's type so that the suggestion will be accurate.
2020-04-20 11:17:03 -07:00
Esteban Küber
e7e3001557 Remove some allocations in predicate evaluation 2020-04-20 10:42:25 -07:00
Esteban Küber
6c921c2c5f Use more Iterators instead of Vecs 2020-04-20 10:42:25 -07:00
Esteban Küber
faeb0404a5 Remove unnecessary allocation 2020-04-20 10:42:25 -07:00
Esteban Küber
2000f91f68 Remove some Vec allocations in an effort to improve perf 2020-04-20 10:42:25 -07:00
CAD97
98f0a8241b Improve Layout::extend docs 2020-04-20 12:30:35 -04:00
Christopher Durham
9c3adaf89c
Update src/libcore/alloc/layout.rs
Co-Authored-By: Amanieu d'Antras <amanieu@gmail.com>
2020-04-20 12:28:30 -04:00
Esteban Küber
d3c96f03b5 Suggest -> impl Trait and -> Box<dyn Trait> on fn that doesn't return
During development, a function could have a return type set that is a
bare trait object by accident. We already suggest using either a boxed
trait object or `impl Trait` if the return paths will allow it. We now
do so too when there are *no* return paths or they all resolve to `!`.
We still don't handle cases where the trait object is *not* the entirety
of the return type gracefully.
2020-04-20 09:24:41 -07:00
Dylan DPC
b921587c91
Rollup merge of #71334 - ehuss:pattern-docs, r=kennytm
Update pattern docs.

A few changes to help clarify string pattern usage:

* Add some examples and stability information in the `pattern` module.
* Fixes the links at https://doc.rust-lang.org/std/str/pattern/ because intra-doc-links don't work with re-exported modules (#65983 I think?).
* Consistently use the same phrasing for `str` methods taking a pattern.
    * Also mention that array of `char` is also accepted.

When `Pattern` is stabilized, the phrasing in the `str` methods can be updated to be more general to reflect the exact behavior. I'm reluctant to do this now because the stability story for `Pattern` is uncertain. It may perhaps look something like:

> The pattern can be any type that implements the [`Pattern`] trait. Notable examples are `&str`, [`char`], arrays of [`char`], or functions or closures that determines if a character matches. Additional libraries might provide more complex patterns like regular expressions.

This is complicated because methods like `trim_matches` have bounds, which for example don't support `str`, so those methods may need more elaboration.
2020-04-20 18:07:12 +02:00
Dylan DPC
7561714aa1
Rollup merge of #71328 - Mark-Simulacrum:stabilize-pathbuf-capacity, r=sfackler
Stabilize PathBuf capacity methods

Closes https://github.com/rust-lang/rust/issues/58234.

Stabilization FCP finished in https://github.com/rust-lang/rust/issues/58234#issuecomment-616048777.
2020-04-20 18:07:11 +02:00
Dylan DPC
314b78c550
Rollup merge of #71284 - JOE1994:serialize_id, r=petrochenkov
fix -Zast-json to output correct JSON form

fixes #71086 (Reverts some of the changes made in #70215)

JSON output (from an empty library) after fix has something for **"id"** field
```shell
lonelyjoe@lonelyjoe-desktop:~/workspace/empty_lib/src$ rustc lib.rs -Zast-json
```
```json
{
   "module":{
      "inner":{
         "lo":0,
         "hi":94
      },
      "items":[
         {
            "attrs":[
               {
                  "kind":{
                     "variant":"Normal",
                     "fields":[
                        {
                           "path":{
                              "span":{
                                 "lo":0,
                                 "hi":0
                              },
                              "segments":[
                                 {
                                    "ident":{
                                       "name":"prelude_import",
                                       "span":{
                                          "lo":0,
                                          "hi":0
                                       }
                                    },
                                    "id":3,
                                    "args":null
                                 }
                              ]
                           },
                           "args":"Empty"
                        }
                     ]
                  },
                  "id":null,
                  "style":"Outer",
                  "span":{
                     "lo":0,
                     "hi":0
                  }
               }
            ],
            "id":4,
            "span":{
               "lo":0,
               "hi":0
            },
            "vis":{
               "node":"Inherited",
               "span":{
                  "lo":0,
                  "hi":0
               }
            },
            "ident":{
               "name":"",
               "span":{
                  "lo":0,
                  "hi":0
               }
            },
            "kind":{
               "variant":"Use",
               "fields":[
                  {
                     "prefix":{
                        "span":{
                           "lo":0,
                           "hi":0
                        },
                        "segments":[
                           {
                              "ident":{
                                 "name":"{{root}}",
                                 "span":{
                                    "lo":0,
                                    "hi":0
                                 }
                              },
                              "id":5,
                              "args":null
                           },
                           {
                              "ident":{
                                 "name":"std",
                                 "span":{
                                    "lo":0,
                                    "hi":0
                                 }
                              },
                              "id":6,
                              "args":null
                           },
                           {
                              "ident":{
                                 "name":"prelude",
                                 "span":{
                                    "lo":0,
                                    "hi":0
                                 }
                              },
                              "id":7,
                              "args":null
                           },
                           {
                              "ident":{
                                 "name":"v1",
                                 "span":{
                                    "lo":0,
                                    "hi":0
                                 }
                              },
                              "id":8,
                              "args":null
                           }
                        ]
                     },
                     "kind":"Glob",
                     "span":{
                        "lo":0,
                        "hi":0
                     }
                  }
               ]
            },
            "tokens":null
         },
         {
            "attrs":[
               {
                  "kind":{
                     "variant":"Normal",
                     "fields":[
                        {
                           "path":{
                              "span":{
                                 "lo":0,
                                 "hi":0
                              },
                              "segments":[
                                 {
                                    "ident":{
                                       "name":"macro_use",
                                       "span":{
                                          "lo":0,
                                          "hi":0
                                       }
                                    },
                                    "id":9,
                                    "args":null
                                 }
                              ]
                           },
                           "args":"Empty"
                        }
                     ]
                  },
                  "id":null,
                  "style":"Outer",
                  "span":{
                     "lo":0,
                     "hi":0
                  }
               }
            ],
            "id":10,
            "span":{
               "lo":0,
               "hi":0
            },
            "vis":{
               "node":"Inherited",
               "span":{
                  "lo":0,
                  "hi":0
               }
            },
            "ident":{
               "name":"std",
               "span":{
                  "lo":0,
                  "hi":0
               }
            },
            "kind":{
               "variant":"ExternCrate",
               "fields":[
                  null
               ]
            },
            "tokens":null
         }
      ],
      "inline":true
   },
   "attrs":[

   ],
   "span":{
      "lo":0,
      "hi":94
   },
   "proc_macros":[

   ]
}
```
2020-04-20 18:07:09 +02:00
Dylan DPC
e80d30347a
Rollup merge of #71270 - Rustin-Liu:rustin-patch-has-self, r=estebank
Fix `has_no_input_arg` check and rename it to `has_only_self_parameter`

Signed-off-by: Rustin-Liu <rustin.liu@gmail.com>

Fixes https://github.com/rust-lang/rust/pull/70643#discussion_r401571789.
2020-04-20 18:07:07 +02:00
Dylan DPC
2f06ac08e9
Rollup merge of #71250 - GuillaumeGomez:use-json-instead-of-js, r=kinnison
Replace big JS dict with JSON parsing

Part of #56545.

@ollie27 suggested that using JSON instead of a JS dict might be faster, so I decided to test it. And the results far exceeded whatever expectations I had...

I used https://github.com/adamgreig/stm32ral for my tests. If you want to build it locally:

```bash
$ cargo doc --features doc --open
```

But I strongly recommend to do it with this PR. Some numbers:

 * Loading a page with the JSON search-index: less than 1 second
 * Loading a page with the JS search-index: crashed after 30 seconds

I think the results are clear enough...

r? @ollie27

cc @rust-lang/rustdoc
2020-04-20 18:07:05 +02:00
Felix S. Klock II
19e5a654dc Expand comment to justify not checking if all the exports are green. 2020-04-20 10:33:27 -04:00
Sebastian Malton
6120acec87 Check that main/start is not async
* Add new error code E0752
* Add span to hir::IsAsync::Yes
* Emit an error if main or the start function is marked as async
* Add two regression tests

Fix formatting errors and bless test outputs
* move tests to ui/async-await

fix test error text

remove span from IsAsync
2020-04-20 09:37:11 -04:00
varkor
f8b796b10b Add error message for using type parameter as the type of a const parameter 2020-04-20 14:01:59 +01:00
bors
8ce3f840ae Auto merge of #70729 - nnethercote:a-big-options-clean-up, r=petrochenkov
A big options clean-up

Lots of improvements here.

r? @Centril
2020-04-20 12:30:45 +00:00
varkor
3eea7b31ee Make the structural_match error diagnostic for const generics clearer 2020-04-20 12:46:27 +01:00
Niko Matsakis
4e53a9af47 tweak comments 2020-04-20 09:42:14 +00:00
Shotaro Yamada
fae4e2a155 Remove unused ToHex/FromHex trait 2020-04-20 17:59:27 +09:00
Shotaro Yamada
33905adc5f Remove unused dependencies 2020-04-20 17:59:27 +09:00
bors
4ca5fd2d7b Auto merge of #71232 - eddyb:print-const-adts, r=oli-obk
ty/print: pretty-print constant aggregates (arrays, tuples and ADTs).

Oddly enough, we don't have any UI tests showing this off in types, only `mir-opt` tests.
However, the pretty form should show up in the test output diff of #71018, if this PR is merged first.

<hr/>

Examples of before/after:
|`Option<bool>`|
|:-:|
|`{transmute(0x01): std::option::Option<bool>}`|
|  ↓↓↓  |
|`std::option::Option::<bool>::Some(true)`|

| `RawVec<u32>` |
|:-:|
| `ByRef { alloc: Allocation { bytes: [4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], relocations: Relocations(SortedMap { data: [] }), undef_mask: UndefMask { blocks: [65535], len: Size { raw: 16 } }, size: Size { raw: 16 }, align: Align { pow2: 3 }, mutability: Not, extra: () }, offset: Size { raw: 0 } }: alloc::raw_vec::RawVec::<u32>`|
|  ↓↓↓  |
|`alloc::raw_vec::RawVec::<u32> { ptr: std::ptr::Unique::<u32> { pointer: {0x4 as *const u32}, _marker: std::marker::PhantomData::<u32> }, cap: 0usize, alloc: std::alloc::Global }`|

<hr/>

This PR is a prerequisite for #61486, *sort of*, in that we need to be able to pretty-print values in order to even consider how we might mangle them.
We still don't have pretty-printing for constants of reference types, @oli-obk has the necessary support logic in a PR but I didn't want to interfere with that.

<hr/>

Each commit should be reviewed separately, as I've fixed a couple deficiencies along the way.

r? @oli-obk cc @rust-lang/wg-mir-opt @varkor @yodaldevoid
2020-04-20 05:30:12 +00:00
Dylan MacKenzie
79543397d7 Bless new miri_unleashed test 2020-04-19 20:42:36 -07:00
JOE1994
b469d2db6d check '-Zast-json' & '-Zast-json-noexpand' to output legal JSON 2020-04-19 22:24:42 -04:00
bors
9b2f8dbba3 Auto merge of #71007 - Amanieu:deprecate_asm, r=Mark-Simulacrum
Deprecate the asm! macro in favor of llvm_asm!

Since we will be changing the syntax of `asm!` soon, deprecate it and encourage people to use `llvm_asm!` instead (which preserves the old syntax). This will avoid breakage when `asm!` is changed.

RFC: https://github.com/rust-lang/rfcs/pull/2843
2020-04-20 02:18:00 +00:00
Wesley Wiser
c183b4c13f [ConstProp] Use a BitSet<Local> instead of IndexVec<Local, bool> 2020-04-19 21:52:47 -04:00
Mark Rousskov
77ee088623 Stabilize PathBuf capacity methods 2020-04-19 21:49:27 -04:00
Josh Stone
7fca9f809d allow(unused_must_use) in issue-23611-enum-swap-in-drop.rs 2020-04-19 18:15:06 -07:00
Dylan MacKenzie
e5b58b089e Note that some terminators should cause an error 2020-04-19 17:50:56 -07:00
Dylan MacKenzie
d24e39bb91 Exhaustively match on TerminatorKind during const checking 2020-04-19 17:50:56 -07:00
Dylan MacKenzie
e590002652 Exhaustively match on StatementKind during const checking 2020-04-19 17:50:56 -07:00