rust/compiler
bors 11c94a1977 Auto merge of #79270 - RalfJung:array-repeat-consts, r=oli-obk
Acknowledge that `[CONST; N]` is stable

When `const_in_array_repeat_expressions` (RFC 2203) got unstably implemented as part of https://github.com/rust-lang/rust/pull/61749, accidentally, the special case of repeating a *constant* got stabilized immediately. That is why the following code works on stable:

```rust
const EMPTY: Vec<i32> = Vec::new();

pub const fn bar() -> [Vec<i32>; 2] {
    [EMPTY; 2]
}

fn main() {
    let x = bar();
}
```

In contrast, if we had written `[expr; 2]` for some expression that is not *literally* a constant but could be evaluated at compile-time (e.g. `(EMPTY,).0`), this would have failed.

We could take back this stabilization as it was clearly accidental. However, I propose we instead just officially accept this and stabilize a small subset of RFC 2203, while leaving the more complex case of general expressions that could be evaluated at compile-time unstable. Making that case work well is pretty much blocked on inline `const` expressions (to avoid relying too much on [implicit promotion](https://github.com/rust-lang/const-eval/blob/master/promotion.md)), so it could take a bit until it comes to full fruition. `[CONST; N]` is an uncontroversial subset of this feature that has no semantic ambiguities, does not rely on promotion, and basically provides the full expressive power of RFC 2203 but without the convenience (people have to define constants to repeat them, possibly using associated consts if generics are involved).

Well, I said "no semantic ambiguities", that is only almost true... the one point I am not sure about is `[CONST; 0]`. There are two possible behaviors here: either this is equivalent to `let x = CONST; [x; 0]`, or it is a NOP (if we argue that the constant is never actually instantiated). The difference between the two is that if `CONST` has a destructor, it should run in the former case (but currently doesn't, due to https://github.com/rust-lang/rust/issues/74836); but should not run if it is considered a NOP. For regular `[x; 0]` there seems to be consensus on running drop (there isn't really an alternative); any opinions for the `CONST` special case? Should this instantiate the const only to immediately run its destructors? That seems somewhat silly to me. After all, the `let`-expansion does *not* work in general, for `N > 1`.

Cc `@rust-lang/lang` `@rust-lang/wg-const-eval`
Cc https://github.com/rust-lang/rust/issues/49147
2020-12-21 13:12:36 +00:00
..
rustc
rustc_apfloat
rustc_arena
rustc_ast docs: Edit rustc_ast::token::Token 2020-12-17 11:55:49 -08:00
rustc_ast_lowering Rollup merge of #79051 - LeSeulArtichaut:if-let-guard, r=matthewjasper 2020-12-17 11:43:55 +09:00
rustc_ast_passes Change the message for if_let_guard feature gate 2020-12-17 17:08:18 +01:00
rustc_ast_pretty Fix pretty printing an AST representing &(mut ident) 2020-12-20 13:11:07 +01:00
rustc_attr Get rid of clean::Deprecation 2020-12-14 22:00:46 -05:00
rustc_builtin_macros fix clippy::unnecessary_filter_map 2020-12-11 23:02:19 +01:00
rustc_codegen_cranelift Make BoundRegion have a kind of BoungRegionKind 2020-12-18 15:27:28 -05:00
rustc_codegen_llvm Revert "cg_llvm: fewer_names in uncached_llvm_type" 2020-12-17 16:40:47 +00:00
rustc_codegen_ssa Use pointer type in AtomicPtr::swap implementation 2020-12-20 00:00:00 +00:00
rustc_data_structures Rollup merge of #79612 - jyn514:compiler-links, r=Aaron1011 2020-12-19 15:16:03 +09:00
rustc_driver
rustc_error_codes Rollup merge of #79639 - sasurau4:feature/add-long-explanation-E0212, r=GuillaumeGomez 2020-12-10 21:33:04 -08:00
rustc_errors Switch compiler/ to intra-doc links 2020-12-18 15:22:51 -05:00
rustc_expand implement edition-specific :pat behavior for 2015/18 2020-12-19 07:13:36 -06:00
rustc_feature tidy: Re-enable check for inline unit tests 2020-12-12 19:18:44 +03:00
rustc_fs_util
rustc_graphviz
rustc_hir Auto merge of #79073 - davidtwco:issue-78957-const-param-attrs, r=lcnr 2020-12-19 04:32:50 +00:00
rustc_hir_pretty Rollup merge of #79051 - LeSeulArtichaut:if-let-guard, r=matthewjasper 2020-12-17 11:43:55 +09:00
rustc_incremental
rustc_index Switch compiler/ to intra-doc links 2020-12-18 15:22:51 -05:00
rustc_infer Auto merge of #80163 - jackh726:binder-refactor-part-3, r=lcnr 2020-12-20 07:01:00 +00:00
rustc_interface Convenience funcs for some_option.unwrap_or(...) 2020-12-14 17:27:27 -08:00
rustc_lexer Fix typo 2020-12-18 22:13:25 +09:00
rustc_lint Move binder for dyn to each list item 2020-12-11 15:02:46 -05:00
rustc_lint_defs
rustc_llvm llvm: update ffi bindings for split dwarf 2020-12-16 10:31:42 +00:00
rustc_macros Stop using intermediate macros in definition of symbols 2020-12-17 15:20:45 -08:00
rustc_metadata Rollup merge of #80039 - LeSeulArtichaut:rm-tyencoder-tcx, r=matthewjasper 2020-12-17 11:44:03 +09:00
rustc_middle Rollup merge of #80171 - pierwill:pierwill-rustcmiddle-tykind, r=lcnr 2020-12-21 02:47:41 +01:00
rustc_mir Auto merge of #79270 - RalfJung:array-repeat-consts, r=oli-obk 2020-12-21 13:12:36 +00:00
rustc_mir_build Auto merge of #80104 - Nadrieril:usefulness-merging, r=varkor 2020-12-19 19:14:04 +00:00
rustc_parse implement edition-specific :pat behavior for 2015/18 2020-12-19 07:13:36 -06:00
rustc_parse_format
rustc_passes Auto merge of #79073 - davidtwco:issue-78957-const-param-attrs, r=lcnr 2020-12-19 04:32:50 +00:00
rustc_plugin_impl
rustc_privacy Move binder for dyn to each list item 2020-12-11 15:02:46 -05:00
rustc_query_system
rustc_resolve Move std_path construction into condition 2020-12-20 23:55:03 +01:00
rustc_save_analysis
rustc_serialize
rustc_session Rollup merge of #80073 - kulikjak:add-target-alias-support, r=varkor 2020-12-17 11:44:08 +09:00
rustc_span Rollup merge of #80130 - pierwill:patch-7, r=oli-obk 2020-12-18 16:22:07 +01:00
rustc_symbol_mangling Make BoundRegion have a kind of BoungRegionKind 2020-12-18 15:27:28 -05:00
rustc_target Add support for target aliases 2020-12-16 10:41:07 +01:00
rustc_trait_selection Handle desugaring in impl trait bound suggestion 2020-12-19 20:37:51 -05:00
rustc_traits Make BoundRegion have a kind of BoungRegionKind 2020-12-18 15:27:28 -05:00
rustc_ty_utils
rustc_type_ir Fix typo in DebruijnIndex documentation 2020-12-12 16:13:06 +01:00
rustc_typeck Rollup merge of #80170 - ldm0:fixice, r=lcnr 2020-12-21 02:47:39 +01:00