Skip to content

Commit 9f36aa2

Browse files
committed
Auto merge of rust-lang#129435 - tgross35:rollup-rjmzof2, r=tgross35
Rollup of 7 pull requests Successful merges: - rust-lang#128192 (rustc_target: Add various aarch64 features) - rust-lang#128507 (Migrate `libtest-thread-limit` `run-make` test to rmake) - rust-lang#129190 (Add f16 and f128 to tests/ui/consts/const-float-bits-conv.rs) - rust-lang#129276 (Stabilize feature `char_indices_offset`) - rust-lang#129350 (adapt integer comparison tests for LLVM 20 IR changes) - rust-lang#129414 (Fix extern crates not being hidden with `doc(hidden)`) - rust-lang#129426 (rustdoc-search: use tighter json for names and parents) r? `@ghost` `@rustbot` modify labels: rollup
2 parents b5723af + 9bc517d commit 9f36aa2

File tree

26 files changed

+447
-95
lines changed

26 files changed

+447
-95
lines changed

Diff for: Cargo.lock

+1
Original file line numberDiff line numberDiff line change
@@ -3129,6 +3129,7 @@ dependencies = [
31293129
"bstr",
31303130
"build_helper",
31313131
"gimli 0.31.0",
3132+
"libc",
31323133
"object 0.36.3",
31333134
"regex",
31343135
"serde_json",

Diff for: compiler/rustc_codegen_llvm/src/attributes.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -521,13 +521,20 @@ pub fn llfn_attrs_from_instance<'ll, 'tcx>(
521521

522522
let function_features = function_features
523523
.iter()
524-
.flat_map(|feat| {
525-
llvm_util::to_llvm_features(cx.tcx.sess, feat).into_iter().map(|f| format!("+{f}"))
526-
})
524+
// Convert to LLVMFeatures and filter out unavailable ones
525+
.flat_map(|feat| llvm_util::to_llvm_features(cx.tcx.sess, feat))
526+
// Convert LLVMFeatures & dependencies to +<feats>s
527+
.flat_map(|feat| feat.into_iter().map(|f| format!("+{f}")))
527528
.chain(codegen_fn_attrs.instruction_set.iter().map(|x| match x {
528529
InstructionSetAttr::ArmA32 => "-thumb-mode".to_string(),
529530
InstructionSetAttr::ArmT32 => "+thumb-mode".to_string(),
530531
}))
532+
// HACK: LLVM versions 19+ do not have the FPMR feature and treat it as always enabled
533+
// It only exists as a feature in LLVM 18, cannot be passed down for any other version
534+
.chain(match &*cx.tcx.sess.target.arch {
535+
"aarch64" if llvm_util::get_version().0 == 18 => vec!["+fpmr".to_string()],
536+
_ => vec![],
537+
})
531538
.collect::<Vec<String>>();
532539

533540
if cx.tcx.sess.target.is_like_wasm {

Diff for: compiler/rustc_codegen_llvm/src/llvm_util.rs

+59-33
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ impl<'a> IntoIterator for LLVMFeature<'a> {
209209
// Though note that Rust can also be build with an external precompiled version of LLVM
210210
// which might lead to failures if the oldest tested / supported LLVM version
211211
// doesn't yet support the relevant intrinsics
212-
pub fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> LLVMFeature<'a> {
212+
pub fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFeature<'a>> {
213213
let arch = if sess.target.arch == "x86_64" {
214214
"x86"
215215
} else if sess.target.arch == "arm64ec" {
@@ -218,40 +218,59 @@ pub fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> LLVMFeature<'a> {
218218
&*sess.target.arch
219219
};
220220
match (arch, s) {
221-
("x86", "sse4.2") => {
222-
LLVMFeature::with_dependency("sse4.2", TargetFeatureFoldStrength::EnableOnly("crc32"))
223-
}
224-
("x86", "pclmulqdq") => LLVMFeature::new("pclmul"),
225-
("x86", "rdrand") => LLVMFeature::new("rdrnd"),
226-
("x86", "bmi1") => LLVMFeature::new("bmi"),
227-
("x86", "cmpxchg16b") => LLVMFeature::new("cx16"),
228-
("x86", "lahfsahf") => LLVMFeature::new("sahf"),
229-
("aarch64", "rcpc2") => LLVMFeature::new("rcpc-immo"),
230-
("aarch64", "dpb") => LLVMFeature::new("ccpp"),
231-
("aarch64", "dpb2") => LLVMFeature::new("ccdp"),
232-
("aarch64", "frintts") => LLVMFeature::new("fptoint"),
233-
("aarch64", "fcma") => LLVMFeature::new("complxnum"),
234-
("aarch64", "pmuv3") => LLVMFeature::new("perfmon"),
235-
("aarch64", "paca") => LLVMFeature::new("pauth"),
236-
("aarch64", "pacg") => LLVMFeature::new("pauth"),
221+
("x86", "sse4.2") => Some(LLVMFeature::with_dependency(
222+
"sse4.2",
223+
TargetFeatureFoldStrength::EnableOnly("crc32"),
224+
)),
225+
("x86", "pclmulqdq") => Some(LLVMFeature::new("pclmul")),
226+
("x86", "rdrand") => Some(LLVMFeature::new("rdrnd")),
227+
("x86", "bmi1") => Some(LLVMFeature::new("bmi")),
228+
("x86", "cmpxchg16b") => Some(LLVMFeature::new("cx16")),
229+
("x86", "lahfsahf") => Some(LLVMFeature::new("sahf")),
230+
("aarch64", "rcpc2") => Some(LLVMFeature::new("rcpc-immo")),
231+
("aarch64", "dpb") => Some(LLVMFeature::new("ccpp")),
232+
("aarch64", "dpb2") => Some(LLVMFeature::new("ccdp")),
233+
("aarch64", "frintts") => Some(LLVMFeature::new("fptoint")),
234+
("aarch64", "fcma") => Some(LLVMFeature::new("complxnum")),
235+
("aarch64", "pmuv3") => Some(LLVMFeature::new("perfmon")),
236+
("aarch64", "paca") => Some(LLVMFeature::new("pauth")),
237+
("aarch64", "pacg") => Some(LLVMFeature::new("pauth")),
238+
("aarch64", "sve-b16b16") => Some(LLVMFeature::new("b16b16")),
239+
("aarch64", "flagm2") => Some(LLVMFeature::new("altnzcv")),
237240
// Rust ties fp and neon together.
238241
("aarch64", "neon") => {
239-
LLVMFeature::with_dependency("neon", TargetFeatureFoldStrength::Both("fp-armv8"))
242+
Some(LLVMFeature::with_dependency("neon", TargetFeatureFoldStrength::Both("fp-armv8")))
240243
}
241244
// In LLVM neon implicitly enables fp, but we manually enable
242245
// neon when a feature only implicitly enables fp
243-
("aarch64", "fhm") => LLVMFeature::new("fp16fml"),
244-
("aarch64", "fp16") => LLVMFeature::new("fullfp16"),
246+
("aarch64", "fhm") => Some(LLVMFeature::new("fp16fml")),
247+
("aarch64", "fp16") => Some(LLVMFeature::new("fullfp16")),
248+
// Filter out features that are not supported by the current LLVM version
249+
("aarch64", "faminmax") if get_version().0 < 18 => None,
250+
("aarch64", "fp8") if get_version().0 < 18 => None,
251+
("aarch64", "fp8dot2") if get_version().0 < 18 => None,
252+
("aarch64", "fp8dot4") if get_version().0 < 18 => None,
253+
("aarch64", "fp8fma") if get_version().0 < 18 => None,
254+
("aarch64", "fpmr") if get_version().0 != 18 => None,
255+
("aarch64", "lut") if get_version().0 < 18 => None,
256+
("aarch64", "sme-f8f16") if get_version().0 < 18 => None,
257+
("aarch64", "sme-f8f32") if get_version().0 < 18 => None,
258+
("aarch64", "sme-fa64") if get_version().0 < 18 => None,
259+
("aarch64", "sme-lutv2") if get_version().0 < 18 => None,
260+
("aarch64", "ssve-fp8dot2") if get_version().0 < 18 => None,
261+
("aarch64", "ssve-fp8dot4") if get_version().0 < 18 => None,
262+
("aarch64", "ssve-fp8fma") if get_version().0 < 18 => None,
263+
("aarch64", "v9.5a") if get_version().0 < 18 => None,
245264
// In LLVM 18, `unaligned-scalar-mem` was merged with `unaligned-vector-mem` into a single feature called
246265
// `fast-unaligned-access`. In LLVM 19, it was split back out.
247266
("riscv32" | "riscv64", "unaligned-scalar-mem") if get_version().0 == 18 => {
248-
LLVMFeature::new("fast-unaligned-access")
267+
Some(LLVMFeature::new("fast-unaligned-access"))
249268
}
250269
// For LLVM 18, enable the evex512 target feature if a avx512 target feature is enabled.
251270
("x86", s) if get_version().0 >= 18 && s.starts_with("avx512") => {
252-
LLVMFeature::with_dependency(s, TargetFeatureFoldStrength::EnableOnly("evex512"))
271+
Some(LLVMFeature::with_dependency(s, TargetFeatureFoldStrength::EnableOnly("evex512")))
253272
}
254-
(_, s) => LLVMFeature::new(s),
273+
(_, s) => Some(LLVMFeature::new(s)),
255274
}
256275
}
257276

@@ -291,13 +310,17 @@ pub fn target_features(sess: &Session, allow_unstable: bool) -> Vec<Symbol> {
291310
return true;
292311
}
293312
// check that all features in a given smallvec are enabled
294-
for llvm_feature in to_llvm_features(sess, feature) {
295-
let cstr = SmallCStr::new(llvm_feature);
296-
if !unsafe { llvm::LLVMRustHasFeature(&target_machine, cstr.as_ptr()) } {
297-
return false;
313+
if let Some(feat) = to_llvm_features(sess, feature) {
314+
for llvm_feature in feat {
315+
let cstr = SmallCStr::new(llvm_feature);
316+
if !unsafe { llvm::LLVMRustHasFeature(&target_machine, cstr.as_ptr()) } {
317+
return false;
318+
}
298319
}
320+
true
321+
} else {
322+
false
299323
}
300-
true
301324
})
302325
.map(|(feature, _, _)| Symbol::intern(feature)),
303326
);
@@ -386,9 +409,9 @@ fn print_target_features(out: &mut String, sess: &Session, tm: &llvm::TargetMach
386409
.target
387410
.supported_target_features()
388411
.iter()
389-
.map(|(feature, _gate, _implied)| {
412+
.filter_map(|(feature, _gate, _implied)| {
390413
// LLVM asserts that these are sorted. LLVM and Rust both use byte comparison for these strings.
391-
let llvm_feature = to_llvm_features(sess, *feature).llvm_feature_name;
414+
let llvm_feature = to_llvm_features(sess, *feature)?.llvm_feature_name;
392415
let desc =
393416
match llvm_target_features.binary_search_by_key(&llvm_feature, |(f, _d)| f).ok() {
394417
Some(index) => {
@@ -398,7 +421,7 @@ fn print_target_features(out: &mut String, sess: &Session, tm: &llvm::TargetMach
398421
None => "",
399422
};
400423

401-
(*feature, desc)
424+
Some((*feature, desc))
402425
})
403426
.collect::<Vec<_>>();
404427

@@ -595,7 +618,7 @@ pub(crate) fn global_llvm_features(
595618
if feature_state.is_none() {
596619
let rust_feature =
597620
supported_features.iter().find_map(|&(rust_feature, _, _)| {
598-
let llvm_features = to_llvm_features(sess, rust_feature);
621+
let llvm_features = to_llvm_features(sess, rust_feature)?;
599622
if llvm_features.contains(feature)
600623
&& !llvm_features.contains(rust_feature)
601624
{
@@ -641,7 +664,7 @@ pub(crate) fn global_llvm_features(
641664
// passing requests down to LLVM. This means that all in-language
642665
// features also work on the command line instead of having two
643666
// different names when the LLVM name and the Rust name differ.
644-
let llvm_feature = to_llvm_features(sess, feature);
667+
let llvm_feature = to_llvm_features(sess, feature)?;
645668

646669
Some(
647670
std::iter::once(format!(
@@ -691,6 +714,9 @@ fn backend_feature_name<'a>(sess: &Session, s: &'a str) -> Option<&'a str> {
691714
let feature = s
692715
.strip_prefix(&['+', '-'][..])
693716
.unwrap_or_else(|| sess.dcx().emit_fatal(InvalidTargetFeaturePrefix { feature: s }));
717+
if s.is_empty() {
718+
return None;
719+
}
694720
// Rustc-specific feature requests like `+crt-static` or `-crt-static`
695721
// are not passed down to LLVM.
696722
if RUSTC_SPECIFIC_FEATURES.contains(&feature) {

Diff for: compiler/rustc_feature/src/unstable.rs

+1
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ declare_features! (
300300
// FIXME: Document these and merge with the list below.
301301

302302
// Unstable `#[target_feature]` directives.
303+
(unstable, aarch64_unstable_target_feature, "CURRENT_RUSTC_VERSION", Some(44839)),
303304
(unstable, aarch64_ver_target_feature, "1.27.0", Some(44839)),
304305
(unstable, arm_target_feature, "1.27.0", Some(44839)),
305306
(unstable, avx512_target_feature, "1.27.0", Some(44839)),

Diff for: compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ symbols! {
356356
_task_context,
357357
a32,
358358
aarch64_target_feature,
359+
aarch64_unstable_target_feature,
359360
aarch64_ver_target_feature,
360361
abi,
361362
abi_amdgpu_kernel,

Diff for: compiler/rustc_target/src/target_features.rs

+73-5
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
9999
("bti", Stable, &[]),
100100
// FEAT_CRC
101101
("crc", Stable, &[]),
102+
// FEAT_CSSC
103+
("cssc", Unstable(sym::aarch64_unstable_target_feature), &[]),
102104
// FEAT_DIT
103105
("dit", Stable, &[]),
104106
// FEAT_DotProd
@@ -107,21 +109,37 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
107109
("dpb", Stable, &[]),
108110
// FEAT_DPB2
109111
("dpb2", Stable, &["dpb"]),
112+
// FEAT_ECV
113+
("ecv", Unstable(sym::aarch64_unstable_target_feature), &[]),
110114
// FEAT_F32MM
111115
("f32mm", Stable, &["sve"]),
112116
// FEAT_F64MM
113117
("f64mm", Stable, &["sve"]),
118+
// FEAT_FAMINMAX
119+
("faminmax", Unstable(sym::aarch64_unstable_target_feature), &[]),
114120
// FEAT_FCMA
115121
("fcma", Stable, &["neon"]),
116122
// FEAT_FHM
117123
("fhm", Stable, &["fp16"]),
118124
// FEAT_FLAGM
119125
("flagm", Stable, &[]),
126+
// FEAT_FLAGM2
127+
("flagm2", Unstable(sym::aarch64_unstable_target_feature), &[]),
120128
// FEAT_FP16
121129
// Rust ties FP and Neon: https://github.com/rust-lang/rust/pull/91608
122130
("fp16", Stable, &["neon"]),
131+
// FEAT_FP8
132+
("fp8", Unstable(sym::aarch64_unstable_target_feature), &["faminmax", "lut", "bf16"]),
133+
// FEAT_FP8DOT2
134+
("fp8dot2", Unstable(sym::aarch64_unstable_target_feature), &["fp8dot4"]),
135+
// FEAT_FP8DOT4
136+
("fp8dot4", Unstable(sym::aarch64_unstable_target_feature), &["fp8fma"]),
137+
// FEAT_FP8FMA
138+
("fp8fma", Unstable(sym::aarch64_unstable_target_feature), &["fp8"]),
123139
// FEAT_FRINTTS
124140
("frintts", Stable, &[]),
141+
// FEAT_HBC
142+
("hbc", Unstable(sym::aarch64_unstable_target_feature), &[]),
125143
// FEAT_I8MM
126144
("i8mm", Stable, &[]),
127145
// FEAT_JSCVT
@@ -131,6 +149,14 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
131149
("lor", Stable, &[]),
132150
// FEAT_LSE
133151
("lse", Stable, &[]),
152+
// FEAT_LSE128
153+
("lse128", Unstable(sym::aarch64_unstable_target_feature), &["lse"]),
154+
// FEAT_LSE2
155+
("lse2", Unstable(sym::aarch64_unstable_target_feature), &[]),
156+
// FEAT_LUT
157+
("lut", Unstable(sym::aarch64_unstable_target_feature), &[]),
158+
// FEAT_MOPS
159+
("mops", Unstable(sym::aarch64_unstable_target_feature), &[]),
134160
// FEAT_MTE & FEAT_MTE2
135161
("mte", Stable, &[]),
136162
// FEAT_AdvSimd & FEAT_FP
@@ -143,14 +169,16 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
143169
("pan", Stable, &[]),
144170
// FEAT_PMUv3
145171
("pmuv3", Stable, &[]),
146-
// FEAT_RAND
172+
// FEAT_RNG
147173
("rand", Stable, &[]),
148174
// FEAT_RAS & FEAT_RASv1p1
149175
("ras", Stable, &[]),
150-
// FEAT_RCPC
176+
// FEAT_LRCPC
151177
("rcpc", Stable, &[]),
152-
// FEAT_RCPC2
178+
// FEAT_LRCPC2
153179
("rcpc2", Stable, &["rcpc"]),
180+
// FEAT_LRCPC3
181+
("rcpc3", Unstable(sym::aarch64_unstable_target_feature), &["rcpc2"]),
154182
// FEAT_RDM
155183
("rdm", Stable, &["neon"]),
156184
// FEAT_SB
@@ -161,10 +189,36 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
161189
("sha3", Stable, &["sha2"]),
162190
// FEAT_SM3 & FEAT_SM4
163191
("sm4", Stable, &["neon"]),
192+
// FEAT_SME
193+
("sme", Unstable(sym::aarch64_unstable_target_feature), &["bf16"]),
194+
// FEAT_SME_F16F16
195+
("sme-f16f16", Unstable(sym::aarch64_unstable_target_feature), &["sme2"]),
196+
// FEAT_SME_F64F64
197+
("sme-f64f64", Unstable(sym::aarch64_unstable_target_feature), &["sme"]),
198+
// FEAT_SME_F8F16
199+
("sme-f8f16", Unstable(sym::aarch64_unstable_target_feature), &["sme-f8f32"]),
200+
// FEAT_SME_F8F32
201+
("sme-f8f32", Unstable(sym::aarch64_unstable_target_feature), &["sme2", "fp8"]),
202+
// FEAT_SME_FA64
203+
("sme-fa64", Unstable(sym::aarch64_unstable_target_feature), &["sme", "sve2"]),
204+
// FEAT_SME_I16I64
205+
("sme-i16i64", Unstable(sym::aarch64_unstable_target_feature), &["sme"]),
206+
// FEAT_SME_LUTv2
207+
("sme-lutv2", Unstable(sym::aarch64_unstable_target_feature), &[]),
208+
// FEAT_SME2
209+
("sme2", Unstable(sym::aarch64_unstable_target_feature), &["sme"]),
210+
// FEAT_SME2p1
211+
("sme2p1", Unstable(sym::aarch64_unstable_target_feature), &["sme2"]),
164212
// FEAT_SPE
165213
("spe", Stable, &[]),
166214
// FEAT_SSBS & FEAT_SSBS2
167215
("ssbs", Stable, &[]),
216+
// FEAT_SSVE_FP8FDOT2
217+
("ssve-fp8dot2", Unstable(sym::aarch64_unstable_target_feature), &["ssve-fp8dot4"]),
218+
// FEAT_SSVE_FP8FDOT4
219+
("ssve-fp8dot4", Unstable(sym::aarch64_unstable_target_feature), &["ssve-fp8fma"]),
220+
// FEAT_SSVE_FP8FMA
221+
("ssve-fp8fma", Unstable(sym::aarch64_unstable_target_feature), &["sme2", "fp8"]),
168222
// FEAT_SVE
169223
// It was decided that SVE requires Neon: https://github.com/rust-lang/rust/pull/91608
170224
//
@@ -173,16 +227,20 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
173227
//
174228
// "For backwards compatibility, Neon and VFP are required in the latest architectures."
175229
("sve", Stable, &["neon"]),
230+
// FEAT_SVE_B16B16 (SVE or SME Instructions)
231+
("sve-b16b16", Unstable(sym::aarch64_unstable_target_feature), &["bf16"]),
176232
// FEAT_SVE2
177233
("sve2", Stable, &["sve"]),
178-
// FEAT_SVE2_AES
234+
// FEAT_SVE_AES & FEAT_SVE_PMULL128
179235
("sve2-aes", Stable, &["sve2", "aes"]),
180236
// FEAT_SVE2_BitPerm
181237
("sve2-bitperm", Stable, &["sve2"]),
182238
// FEAT_SVE2_SHA3
183239
("sve2-sha3", Stable, &["sve2", "sha3"]),
184240
// FEAT_SVE2_SM4
185241
("sve2-sm4", Stable, &["sve2", "sm4"]),
242+
// FEAT_SVE2p1
243+
("sve2p1", Unstable(sym::aarch64_unstable_target_feature), &["sve2"]),
186244
// FEAT_TME
187245
("tme", Stable, &[]),
188246
(
@@ -199,9 +257,19 @@ const AARCH64_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
199257
("v8.4a", Unstable(sym::aarch64_ver_target_feature), &["v8.3a", "dotprod", "dit", "flagm"]),
200258
("v8.5a", Unstable(sym::aarch64_ver_target_feature), &["v8.4a", "ssbs", "sb", "dpb2", "bti"]),
201259
("v8.6a", Unstable(sym::aarch64_ver_target_feature), &["v8.5a", "bf16", "i8mm"]),
202-
("v8.7a", Unstable(sym::aarch64_ver_target_feature), &[]),
260+
("v8.7a", Unstable(sym::aarch64_ver_target_feature), &["v8.6a", "wfxt"]),
261+
("v8.8a", Unstable(sym::aarch64_ver_target_feature), &["v8.7a", "hbc", "mops"]),
262+
("v8.9a", Unstable(sym::aarch64_ver_target_feature), &["v8.8a", "cssc"]),
263+
("v9.1a", Unstable(sym::aarch64_ver_target_feature), &["v9a", "v8.6a"]),
264+
("v9.2a", Unstable(sym::aarch64_ver_target_feature), &["v9.1a", "v8.7a"]),
265+
("v9.3a", Unstable(sym::aarch64_ver_target_feature), &["v9.2a", "v8.8a"]),
266+
("v9.4a", Unstable(sym::aarch64_ver_target_feature), &["v9.3a", "v8.9a"]),
267+
("v9.5a", Unstable(sym::aarch64_ver_target_feature), &["v9.4a"]),
268+
("v9a", Unstable(sym::aarch64_ver_target_feature), &["v8.5a", "sve2"]),
203269
// FEAT_VHE
204270
("vh", Stable, &[]),
271+
// FEAT_WFxT
272+
("wfxt", Unstable(sym::aarch64_unstable_target_feature), &[]),
205273
// tidy-alphabetical-end
206274
];
207275

Diff for: library/core/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@
110110
#![cfg_attr(bootstrap, feature(offset_of_nested))]
111111
#![feature(array_ptr_get)]
112112
#![feature(asm_experimental_arch)]
113-
#![feature(char_indices_offset)]
114113
#![feature(const_align_of_val)]
115114
#![feature(const_align_of_val_raw)]
116115
#![feature(const_align_offset)]

0 commit comments

Comments
 (0)