rust/compiler/rustc_codegen_llvm/src
bors 517c28e421 Auto merge of #87280 - lcnr:lazy-anon-const-default-substs, r=nikomatsakis
lazily "compute" anon const default substs

Continuing the work of #83086, this implements the discussed solution for the [unused substs problem](https://github.com/rust-lang/project-const-generics/blob/master/design-docs/anon-const-substs.md#unused-substs). As of now, anonymous constants inherit all of their parents generics, even if they do not use them, e.g. in `fn foo<T, const N: usize>() -> [T; N + 1]`, the array length has `T` as a generic parameter even though it doesn't use it. These *unused substs* cause some backwards incompatible, and imo incorrect behavior, e.g. #78369.

---
We do not actually filter any generic parameters here and the `default_anon_const_substs` query still a dummy which only checks that
- we now prevent the previously existing query cycles and are able to call `predicates_of(parent)` when computing the substs of anonymous constants
- the default anon consts substs only include the typeflags we assume it does.

Implementing that filtering will be left as future work.

---

The idea of this PR is to delay the creation of the anon const substs until after we've computed `predicates_of` for the parent of the anon const. As the predicates of the parent can however contain the anon const we still have to create a `ty::Const` for it.

We do this by changing the substs field of `ty::Unevaluated` to an option and modifying accesses to instead call the method `unevaluated.substs(tcx)` which returns the substs as before. If the substs - now `substs_` -  of `ty::Unevaluated` are `None`, it means that the anon const currently has its default substs, i.e. the substs it has when first constructed, which are the generic parameters it has available. To be able to call `unevaluated.substs(tcx)` in a `TypeVisitor`, we add the non-defaulted method `fn tcx_for_anon_const_substs(&self) -> Option<TyCtxt<'tcx>>`. In case `tcx_for_anon_const_substs` returns `None`, unknown anon const default substs are skipped entirely.

Even when `substs_` is `None` we still have to treat the constant as if it has its default substs. To do this, `TypeFlags` are modified so that it is clear whether they can still change when *exposing* any anon const default substs. A new flag, `HAS_UNKNOWN_DEFAULT_CONST_SUBSTS`, is added in case some default flags are missing.

The rest of this PR are some smaller changes to either not cause cycles by trying to access the default anon const substs too early or to be able to access the `tcx` in previously unused locations.

cc `@rust-lang/project-const-generics`
r? `@nikomatsakis`
2021-08-26 22:26:23 +00:00
..
back Handle SrcMgr diagnostics 2021-08-16 18:28:17 +02:00
coverageinfo Auto merge of #85178 - cjgillot:local-crate, r=oli-obk 2021-05-17 01:42:03 +00:00
debuginfo review 2021-08-26 11:14:31 +02:00
llvm Handle SrcMgr diagnostics 2021-08-16 18:28:17 +02:00
abi.rs Remove the decl arg from FnAbi::llvm_type 2021-08-05 10:58:55 -07:00
allocator.rs Prepare call/invoke for opaque pointers 2021-08-05 10:58:55 -07:00
asm.rs Auto merge of #87581 - Amanieu:asm_clobber_abi, r=nagisa 2021-08-14 22:29:27 +00:00
attributes.rs Add support for leaf fn frame pointer elimination 2021-06-30 19:45:17 +03:00
base.rs Always use llvm.used for coverage symbols 2021-08-21 10:08:05 +02:00
builder.rs Auto merge of #88242 - bonega:allocation_range, r=oli-obk 2021-08-25 02:17:41 +00:00
callee.rs Fix static relocation model for PowerPC64 2021-05-28 03:48:39 +02:00
common.rs Replace LLVMConstInBoundsGEP with LLVMConstInBoundsGEP2* 2021-08-04 15:51:30 +02:00
consts.rs improve comment 2021-08-25 17:49:28 -04:00
context.rs Always use llvm.used for coverage symbols 2021-08-21 10:08:05 +02:00
declare.rs Remove the decl arg from FnAbi::llvm_type 2021-08-05 10:58:55 -07:00
intrinsic.rs Fix typos “an”→“a” and a few different ones that appeared in the same search 2021-08-22 18:15:49 +02:00
lib.rs Dispose LLVM context after TargetMachine 2021-08-16 18:28:18 +02:00
llvm_util.rs clippy::single_char_pattern 2021-07-25 12:25:26 +02:00
mono_item.rs Stop emitting the dso_local LLVM attribute for external symbols under the static relocation model on macOS. 2021-08-20 17:10:41 -07:00
type_.rs Auto merge of #87254 - rusticstuff:rustc_codegen_llvm_dont_emit_zero_sized_padding, r=eddyb 2021-08-11 01:36:23 +00:00
type_of.rs Test: Use smallvec directly instead of boxed. 2021-08-09 15:42:37 +00:00
va_arg.rs Replace hard-coded field indexes with lookup on aarch64 non-macos. 2021-08-05 22:40:32 +00:00
value.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00