Skip to content

[do not merge] beta test for git change detection (#138591) #138597

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 70 commits into
base: beta
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
99587a0
fix musl's CVE-2025-26519
pietroalbini Feb 16, 2025
e4840ce
update version placeholders
cuviper Feb 17, 2025
2171400
bump channel to beta
cuviper Feb 17, 2025
f0cb410
Auto merge of #137182 - cuviper:beta-next, r=cuviper
bors Feb 17, 2025
c62a549
bump stage0 to 1.85.0
cuviper Feb 21, 2025
fc02174
Remove SSE ABI from i586-pc-windows-msvc
Noratrieb Feb 16, 2025
9448629
[beta-1.86] Update cargo
weihanglo Feb 24, 2025
b678aab
Auto merge of #137395 - cuviper:beta-next, r=cuviper
bors Feb 24, 2025
42212a5
Auto merge of #137507 - weihanglo:update-beta-cargo, r=weihanglo
bors Feb 27, 2025
f8f8aea
generate-copyright: pass the source root from bootstrap
pietroalbini Feb 14, 2025
27380b9
generate-copyright: pass the list of manifests from bootstrap
pietroalbini Feb 14, 2025
9e285ba
generate-copyright: pass the vendored sources from bootstrap
pietroalbini Feb 17, 2025
935005b
use the shared vendor impl for plan source tarballs
pietroalbini Feb 17, 2025
f32d360
Fix `*-win7-windows-msvc` target since 26eeac1a1e9fe46ffd80dd0d3dafdd…
QianNangong Feb 19, 2025
4b9df12
skip submodule updating logics on tarballs
onur-ozkan Feb 20, 2025
fd12db2
Improve behavior of IF_LET_RESCOPE around temporaries and place expre…
compiler-errors Feb 22, 2025
0180dd9
More comments
compiler-errors Feb 22, 2025
f54fe46
Consider lvalues of field and index as possibly temporary places
compiler-errors Feb 23, 2025
86e362f
downgrade bootstrap `cc`
onur-ozkan Feb 23, 2025
4f0b4a4
Remove Win SDK 10.0.26100.0 from CI
ChrisDenton Feb 27, 2025
4746aaf
[beta-1.86] Update cargo
weihanglo Mar 1, 2025
61e1603
Auto merge of #137747 - cuviper:beta-next, r=cuviper
bors Mar 2, 2025
98ec247
Add a test case for #137646
dianqk Feb 26, 2025
8f9c7df
Don't infer attributes of virtual calls based on the function body
dianqk Feb 26, 2025
e3e34e3
Don't infer unwinding of virtual calls based on the function attributes
dianqk Feb 27, 2025
6be2e1e
Revert "Auto merge of #135335 - oli-obk:push-zxwssomxxtnq, r=saethlin"
compiler-errors Mar 2, 2025
cd87b03
Add a test
compiler-errors Mar 2, 2025
0bd0738
Do not use rustup to build Rust for Linux
Kobzol Mar 3, 2025
b2af9a5
Auto merge of #138190 - cuviper:beta-next, r=cuviper
bors Mar 8, 2025
882139c
Windows: Use MoveFileEx by default in `fs:rename`
ChrisDenton Feb 24, 2025
9b20ca1
Return OutOfMemoryError and update docs
ChrisDenton Mar 6, 2025
10d5f67
rustdoc: disable forbidden #[target_feature] check
RalfJung Feb 25, 2025
17d569c
also fix potential issues with mixed stable/unstable target features …
RalfJung Feb 25, 2025
871f01d
add test
RalfJung Feb 28, 2025
6f5cf7d
also skip abi_required_features check in rustdoc
RalfJung Feb 28, 2025
6416d20
doctests: fix merging on stable
notriddle Mar 2, 2025
ad393e3
doctests: build test bundle and harness separately
notriddle Mar 3, 2025
4d1e502
Revert "Rollup merge of #136274 - compiler-errors:sized-wf, r=lcnr"
compiler-errors Mar 6, 2025
ea14c4a
Fix revert fallout
compiler-errors Mar 6, 2025
8c7969a
Auto merge of #138525 - cuviper:beta-next, r=cuviper
bors Mar 16, 2025
27fb3e6
Update GCC submodule
Kobzol Feb 12, 2025
cdd16a1
Improve GCC build in bootstrap
Kobzol Jan 30, 2025
2db0710
Install bzip2
Kobzol Feb 14, 2025
262848a
Update license metadata
Kobzol Feb 15, 2025
b711bca
Changed `.display()` to `.to_str()`
Kobzol Feb 17, 2025
f9a450b
Add missing unsafe block
Kobzol Mar 11, 2025
69cea2d
Update gcc submodule
Kobzol Feb 26, 2025
f7f5210
Add `dist:Gcc` build step
Kobzol Feb 26, 2025
0953073
Build GCC on the Linux x64 dist runner
Kobzol Feb 28, 2025
c1e778d
Add `gcc` bootstrap config section
Kobzol Mar 5, 2025
81b089c
Add `[gcc] download-ci-gcc` option
Kobzol Mar 5, 2025
624ba30
Add `download-ci-gcc-stamp` file
Kobzol Mar 5, 2025
c3bf2fc
Implement downloading GCC from CI
Kobzol Mar 5, 2025
44b48a7
Add change tracker entry
Kobzol Mar 5, 2025
69eafa7
Add triagebot entry for GCC modifications
Kobzol Mar 10, 2025
e3bb810
Do not download GCC in tests
Kobzol Mar 11, 2025
f367b6e
Change GCC build flags
Kobzol Mar 12, 2025
530c908
Use GCC for building GCC
Kobzol Mar 13, 2025
5fec5e6
Do not overwrite original `config.toml` in `opt-dist`
Kobzol Mar 13, 2025
1470024
Store libgccjit.so in a lib directory in the GCC CI tarball
Kobzol Mar 13, 2025
ca0a86a
Ensure that GCC is not built using Clang, as it misbehaves
Kobzol Mar 14, 2025
20f0e27
Fix bug in `get_git_modified_files`
Kobzol Mar 16, 2025
dc47f91
Implement a new unified function for figuring out how if a set of pat…
Kobzol Mar 16, 2025
4527723
Use `check_path_modifications` for detecting local GCC changes
Kobzol Mar 16, 2025
e7d4f10
Migrate LLVM CI change detection to `check_path_modifications`
Kobzol Mar 16, 2025
a24ea17
Add tests for negative matches
Kobzol Mar 16, 2025
517fa87
Port download-ci-rustc
Kobzol Mar 17, 2025
44babc5
Remove upstream remote
Kobzol Mar 18, 2025
506d23d
WIP
Kobzol Mar 18, 2025
bbe2d72
Make a modification that should invalidate download-ci-rustc
Kobzol Mar 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,6 @@ jobs:
# which then uses log commands to actually set them.
EXTRA_VARIABLES: ${{ toJson(matrix.env) }}

- name: setup upstream remote
run: src/ci/scripts/setup-upstream-remote.sh

- name: ensure the channel matches the target branch
run: src/ci/scripts/verify-channel.sh

Expand Down Expand Up @@ -173,6 +170,20 @@ jobs:
- name: ensure the stable version number is correct
run: src/ci/scripts/verify-stable-version-number.sh

# Temporary fix to unblock CI
# Remove the latest Windows SDK for 32-bit Windows MSVC builds.
# See issue https://github.com/rust-lang/rust/issues/137733 for more details.
- name: Remove Windows SDK 10.0.26100.0
shell: powershell
if: ${{ matrix.name == 'i686-msvc-1' || matrix.name == 'i686-msvc-2' || matrix.name == 'dist-i686-msvc' }}
run: |
$kits = (Get-ItemProperty -path 'HKLM:\SOFTWARE\Microsoft\Windows Kits\Installed Roots').KitsRoot10
$sdk_version = "10.0.26100.0"

foreach ($kind in 'Bin', 'Lib', 'Include') {
Remove-Item -Force -Recurse $kits\$kind\$sdk_version -ErrorAction Continue
}

- name: run the build
# Redirect stderr to stdout to avoid reordering the two streams in the GHA logs.
run: src/ci/scripts/run-build-from-ci.sh 2>&1
Expand Down
1 change: 1 addition & 0 deletions COPYRIGHT
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Modify copyright
Short version for non-lawyers:

The Rust Project is dual-licensed under Apache 2.0 and MIT
Expand Down
35 changes: 27 additions & 8 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ version = "0.1.0"
dependencies = [
"serde",
"serde_derive",
"tempfile",
]

[[package]]
Expand Down Expand Up @@ -2135,6 +2136,12 @@ version = "0.4.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"

[[package]]
name = "linux-raw-sys"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413"

[[package]]
name = "litemap"
version = "0.7.4"
Expand Down Expand Up @@ -4832,7 +4839,20 @@ dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys",
"linux-raw-sys 0.4.15",
"windows-sys 0.59.0",
]

[[package]]
name = "rustix"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f7178faa4b75a30e269c71e61c353ce2748cf3d76f0c44c393f4e60abf49b825"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys 0.9.3",
"windows-sys 0.59.0",
]

Expand Down Expand Up @@ -5246,15 +5266,14 @@ dependencies = [

[[package]]
name = "tempfile"
version = "3.15.0"
version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704"
checksum = "488960f40a3fd53d72c2a29a58722561dee8afdd175bd88e3db4677d7b2ba600"
dependencies = [
"cfg-if",
"fastrand",
"getrandom 0.2.15",
"getrandom 0.3.1",
"once_cell",
"rustix",
"rustix 1.0.2",
"windows-sys 0.59.0",
]

Expand Down Expand Up @@ -6599,8 +6618,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909"
dependencies = [
"libc",
"linux-raw-sys",
"rustix",
"linux-raw-sys 0.4.15",
"rustix 0.38.43",
]

[[package]]
Expand Down
5 changes: 0 additions & 5 deletions compiler/rustc_codegen_gcc/src/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,6 @@ impl<'gcc, 'tcx> ConstCodegenMethods<'tcx> for CodegenCx<'gcc, 'tcx> {
if type_is_pointer(typ) { self.context.new_null(typ) } else { self.const_int(typ, 0) }
}

fn is_undef(&self, _val: RValue<'gcc>) -> bool {
// FIXME: actually check for undef
false
}

fn const_undef(&self, typ: Type<'gcc>) -> RValue<'gcc> {
let local = self.current_func.borrow().expect("func").new_local(None, typ, "undefined");
if typ.is_struct().is_some() {
Expand Down
4 changes: 0 additions & 4 deletions compiler/rustc_codegen_llvm/src/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,6 @@ impl<'ll, 'tcx> ConstCodegenMethods<'tcx> for CodegenCx<'ll, 'tcx> {
unsafe { llvm::LLVMGetUndef(t) }
}

fn is_undef(&self, v: &'ll Value) -> bool {
unsafe { llvm::LLVMIsUndef(v) == True }
}

fn const_poison(&self, t: &'ll Type) -> &'ll Value {
unsafe { llvm::LLVMGetPoison(t) }
}
Expand Down
1 change: 0 additions & 1 deletion compiler/rustc_codegen_llvm/src/llvm/ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1035,7 +1035,6 @@ unsafe extern "C" {
pub(crate) fn LLVMMetadataTypeInContext(C: &Context) -> &Type;

// Operations on all values
pub(crate) fn LLVMIsUndef(Val: &Value) -> Bool;
pub(crate) fn LLVMTypeOf(Val: &Value) -> &Type;
pub(crate) fn LLVMGetValueName2(Val: &Value, Length: *mut size_t) -> *const c_char;
pub(crate) fn LLVMSetValueName2(Val: &Value, Name: *const c_char, NameLen: size_t);
Expand Down
59 changes: 22 additions & 37 deletions compiler/rustc_codegen_ssa/src/mir/operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,30 +204,14 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
let alloc_align = alloc.inner().align;
assert!(alloc_align >= layout.align.abi);

// Returns `None` when the value is partially undefined or any byte of it has provenance.
// Otherwise returns the value or (if the entire value is undef) returns an undef.
let read_scalar = |start, size, s: abi::Scalar, ty| {
let range = alloc_range(start, size);
match alloc.0.read_scalar(
bx,
range,
alloc_range(start, size),
/*read_provenance*/ matches!(s.primitive(), abi::Primitive::Pointer(_)),
) {
Ok(val) => Some(bx.scalar_to_backend(val, s, ty)),
Err(_) => {
// We may have failed due to partial provenance or unexpected provenance,
// continue down the normal code path if so.
if alloc.0.provenance().range_empty(range, &bx.tcx())
// Since `read_scalar` failed, but there were no relocations involved, the
// bytes must be partially or fully uninitialized. Thus we can now unwrap the
// information about the range of uninit bytes and check if it's the full range.
&& alloc.0.init_mask().is_range_initialized(range).unwrap_err() == range
{
Some(bx.const_undef(ty))
} else {
None
}
}
Ok(val) => bx.scalar_to_backend(val, s, ty),
Err(_) => bx.const_poison(ty),
}
};

Expand All @@ -238,14 +222,16 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
// check that walks over the type of `mplace` to make sure it is truly correct to treat this
// like a `Scalar` (or `ScalarPair`).
match layout.backend_repr {
BackendRepr::Scalar(s) => {
BackendRepr::Scalar(s @ abi::Scalar::Initialized { .. }) => {
let size = s.size(bx);
assert_eq!(size, layout.size, "abi::Scalar size does not match layout size");
if let Some(val) = read_scalar(offset, size, s, bx.immediate_backend_type(layout)) {
return OperandRef { val: OperandValue::Immediate(val), layout };
}
let val = read_scalar(offset, size, s, bx.immediate_backend_type(layout));
OperandRef { val: OperandValue::Immediate(val), layout }
}
BackendRepr::ScalarPair(a, b) => {
BackendRepr::ScalarPair(
a @ abi::Scalar::Initialized { .. },
b @ abi::Scalar::Initialized { .. },
) => {
let (a_size, b_size) = (a.size(bx), b.size(bx));
let b_offset = (offset + a_size).align_to(b.align(bx).abi);
assert!(b_offset.bytes() > 0);
Expand All @@ -261,21 +247,20 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> {
b,
bx.scalar_pair_element_backend_type(layout, 1, true),
);
if let (Some(a_val), Some(b_val)) = (a_val, b_val) {
return OperandRef { val: OperandValue::Pair(a_val, b_val), layout };
}
OperandRef { val: OperandValue::Pair(a_val, b_val), layout }
}
_ if layout.is_zst() => OperandRef::zero_sized(layout),
_ => {
// Neither a scalar nor scalar pair. Load from a place
// FIXME: should we cache `const_data_from_alloc` to avoid repeating this for the
// same `ConstAllocation`?
let init = bx.const_data_from_alloc(alloc);
let base_addr = bx.static_addr_of(init, alloc_align, None);

let llval = bx.const_ptr_byte_offset(base_addr, offset);
bx.load_operand(PlaceRef::new_sized(llval, layout))
}
_ if layout.is_zst() => return OperandRef::zero_sized(layout),
_ => {}
}
// Neither a scalar nor scalar pair. Load from a place
// FIXME: should we cache `const_data_from_alloc` to avoid repeating this for the
// same `ConstAllocation`?
let init = bx.const_data_from_alloc(alloc);
let base_addr = bx.static_addr_of(init, alloc_align, None);

let llval = bx.const_ptr_byte_offset(base_addr, offset);
bx.load_operand(PlaceRef::new_sized(llval, layout))
}

/// Asserts that this operand refers to a scalar and returns
Expand Down
26 changes: 2 additions & 24 deletions compiler/rustc_codegen_ssa/src/mir/rvalue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use rustc_middle::ty::{self, Instance, Ty, TyCtxt};
use rustc_middle::{bug, mir, span_bug};
use rustc_session::config::OptLevel;
use rustc_span::{DUMMY_SP, Span};
use tracing::{debug, instrument, trace};
use tracing::{debug, instrument};

use super::operand::{OperandRef, OperandValue};
use super::place::PlaceRef;
Expand Down Expand Up @@ -93,8 +93,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
return;
}

// If `v` is an integer constant whose value is just a single byte repeated N times,
// emit a `memset` filling the entire `dest` with that byte.
let try_init_all_same = |bx: &mut Bx, v| {
let start = dest.val.llval;
let size = bx.const_usize(dest.layout.size.bytes());
Expand All @@ -119,33 +117,13 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
false
};

trace!(?cg_elem.val);
match cg_elem.val {
OperandValue::Immediate(v) => {
if try_init_all_same(bx, v) {
return;
}
}
OperandValue::Pair(a, b) => {
let a_is_undef = bx.cx().is_undef(a);
match (a_is_undef, bx.cx().is_undef(b)) {
// Can happen for uninit unions
(true, true) => {
// FIXME: can we produce better output here?
}
(false, true) | (true, false) => {
let val = if a_is_undef { b } else { a };
if try_init_all_same(bx, val) {
return;
}
}
(false, false) => {
// FIXME: if both are the same value, use try_init_all_same
}
}
}
OperandValue::ZeroSized => unreachable!("checked above"),
OperandValue::Ref(..) => {}
_ => (),
}

let count = self
Expand Down
56 changes: 44 additions & 12 deletions compiler/rustc_codegen_ssa/src/target_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use rustc_middle::query::Providers;
use rustc_middle::ty::TyCtxt;
use rustc_session::parse::feature_err;
use rustc_span::{Span, Symbol, sym};
use rustc_target::target_features;
use rustc_target::target_features::{self, Stability};

use crate::errors;

Expand Down Expand Up @@ -87,12 +87,17 @@ pub(crate) fn from_target_feature_attr(
// But ensure the ABI does not forbid enabling this.
// Here we do assume that LLVM doesn't add even more implied features
// we don't know about, at least no features that would have ABI effects!
if abi_feature_constraints.incompatible.contains(&name.as_str()) {
tcx.dcx().emit_err(errors::ForbiddenTargetFeatureAttr {
span: item.span(),
feature: name.as_str(),
reason: "this feature is incompatible with the target ABI",
});
// We skip this logic in rustdoc, where we want to allow all target features of
// all targets, so we can't check their ABI compatibility and anyway we are not
// generating code so "it's fine".
if !tcx.sess.opts.actually_rustdoc {
if abi_feature_constraints.incompatible.contains(&name.as_str()) {
tcx.dcx().emit_err(errors::ForbiddenTargetFeatureAttr {
span: item.span(),
feature: name.as_str(),
reason: "this feature is incompatible with the target ABI",
});
}
}
target_features.push(TargetFeature { name, implied: name != feature_sym })
}
Expand Down Expand Up @@ -142,11 +147,38 @@ pub(crate) fn provide(providers: &mut Providers) {
rust_target_features: |tcx, cnum| {
assert_eq!(cnum, LOCAL_CRATE);
if tcx.sess.opts.actually_rustdoc {
// rustdoc needs to be able to document functions that use all the features, so
// whitelist them all
rustc_target::target_features::all_rust_features()
.map(|(a, b)| (a.to_string(), b))
.collect()
// HACK: rustdoc would like to pretend that we have all the target features, so we
// have to merge all the lists into one. To ensure an unstable target never prevents
// a stable one from working, we merge the stability info of all instances of the
// same target feature name, with the "most stable" taking precedence. And then we
// hope that this doesn't cause issues anywhere else in the compiler...
let mut result: UnordMap<String, Stability> = Default::default();
for (name, stability) in rustc_target::target_features::all_rust_features() {
use std::collections::hash_map::Entry;
match result.entry(name.to_owned()) {
Entry::Vacant(vacant_entry) => {
vacant_entry.insert(stability);
}
Entry::Occupied(mut occupied_entry) => {
// Merge the two stabilities, "more stable" taking precedence.
match (occupied_entry.get(), stability) {
(Stability::Stable, _)
| (
Stability::Unstable { .. },
Stability::Unstable { .. } | Stability::Forbidden { .. },
)
| (Stability::Forbidden { .. }, Stability::Forbidden { .. }) => {
// The stability in the entry is at least as good as the new one, just keep it.
}
_ => {
// Overwrite stabilite.
occupied_entry.insert(stability);
}
}
}
}
}
result
} else {
tcx.sess
.target
Expand Down
1 change: 0 additions & 1 deletion compiler/rustc_codegen_ssa/src/traits/consts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ pub trait ConstCodegenMethods<'tcx>: BackendTypes {
/// Generate an uninitialized value (matching uninitialized memory in MIR).
/// Whether memory is initialized or not is tracked byte-for-byte.
fn const_undef(&self, t: Self::Type) -> Self::Value;
fn is_undef(&self, v: Self::Value) -> bool;
/// Generate a fake value. Poison always affects the entire value, even if just a single byte is
/// poison. This can only be used in codepaths that are already UB, i.e., UB-free Rust code
/// (including code that e.g. copies uninit memory with `MaybeUninit`) can never encounter a
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_feature/src/accepted.rs
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ declare_features! (
/// Allows `#[target_feature(...)]`.
(accepted, target_feature, "1.27.0", None),
/// Allows the use of `#[target_feature]` on safe functions.
(accepted, target_feature_11, "CURRENT_RUSTC_VERSION", Some(69098)),
(accepted, target_feature_11, "1.86.0", Some(69098)),
/// Allows `fn main()` with return types which implements `Termination` (RFC 1937).
(accepted, termination_trait, "1.26.0", Some(43301)),
/// Allows `#[test]` functions where the return type implements `Termination` (RFC 1937).
Expand All @@ -401,7 +401,7 @@ declare_features! (
(accepted, track_caller, "1.46.0", Some(47809)),
/// Allows dyn upcasting trait objects via supertraits.
/// Dyn upcasting is casting, e.g., `dyn Foo -> dyn Bar` where `Foo: Bar`.
(accepted, trait_upcasting, "CURRENT_RUSTC_VERSION", Some(65991)),
(accepted, trait_upcasting, "1.86.0", Some(65991)),
/// Allows #[repr(transparent)] on univariant enums (RFC 2645).
(accepted, transparent_enums, "1.42.0", Some(60405)),
/// Allows indexing tuples.
Expand Down
Loading
Loading