Skip to content

Commit aa877bc

Browse files
committed
Auto merge of #128195 - matthiaskrgr:rollup-195dfdf, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #126908 (Use Cow<'static, str> for InlineAsmTemplatePiece::String) - #127999 (Inject arm32 shims into Windows metadata generation) - #128137 (CStr: derive PartialEq, Eq; add test for Ord) - #128185 (Fix a span error when parsing a wrong param of function.) - #128187 (Fix 1.80.0 version in RELEASES.md) - #128189 (Turn an unreachable code path into an ICE) r? `@ghost` `@rustbot` modify labels: rollup
2 parents eb10639 + cf1ce4b commit aa877bc

File tree

17 files changed

+142
-92
lines changed

17 files changed

+142
-92
lines changed

RELEASES.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Version 1.80 (2024-07-25)
1+
Version 1.80.0 (2024-07-25)
22
==========================
33

44
<a id="1.80-Language"></a>

compiler/rustc_ast/src/ast.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ use rustc_macros::{Decodable, Encodable, HashStable_Generic};
3636
use rustc_span::source_map::{respan, Spanned};
3737
use rustc_span::symbol::{kw, sym, Ident, Symbol};
3838
use rustc_span::{ErrorGuaranteed, Span, DUMMY_SP};
39+
use std::borrow::Cow;
3940
use std::cmp;
4041
use std::fmt;
4142
use std::mem;
@@ -2308,7 +2309,7 @@ impl std::fmt::Debug for InlineAsmOptions {
23082309

23092310
#[derive(Clone, PartialEq, Encodable, Decodable, Debug, Hash, HashStable_Generic)]
23102311
pub enum InlineAsmTemplatePiece {
2311-
String(String),
2312+
String(Cow<'static, str>),
23122313
Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
23132314
}
23142315

compiler/rustc_builtin_macros/src/asm.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ fn expand_preparsed_asm(
459459

460460
for (i, template_expr) in args.templates.into_iter().enumerate() {
461461
if i != 0 {
462-
template.push(ast::InlineAsmTemplatePiece::String("\n".to_string()));
462+
template.push(ast::InlineAsmTemplatePiece::String("\n".into()));
463463
}
464464

465465
let msg = "asm template must be a string literal";
@@ -527,7 +527,7 @@ fn expand_preparsed_asm(
527527

528528
// Don't treat raw asm as a format string.
529529
if args.options.contains(ast::InlineAsmOptions::RAW) {
530-
template.push(ast::InlineAsmTemplatePiece::String(template_str.to_string()));
530+
template.push(ast::InlineAsmTemplatePiece::String(template_str.to_string().into()));
531531
let template_num_lines = 1 + template_str.matches('\n').count();
532532
line_spans.extend(std::iter::repeat(template_sp).take(template_num_lines));
533533
continue;
@@ -577,7 +577,7 @@ fn expand_preparsed_asm(
577577
for piece in unverified_pieces {
578578
match piece {
579579
parse::Piece::String(s) => {
580-
template.push(ast::InlineAsmTemplatePiece::String(s.to_string()))
580+
template.push(ast::InlineAsmTemplatePiece::String(s.to_string().into()))
581581
}
582582
parse::Piece::NextArgument(arg) => {
583583
let span = arg_spans.next().unwrap_or(template_sp);

compiler/rustc_codegen_cranelift/src/inline_asm.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ pub(crate) fn codegen_inline_asm_terminator<'tcx>(
4646
// Used by panic_abort on Windows, but uses a syntax which only happens to work with
4747
// asm!() by accident and breaks with the GNU assembler as well as global_asm!() for
4848
// the LLVM backend.
49-
if template.len() == 1
50-
&& template[0] == InlineAsmTemplatePiece::String("int $$0x29".to_string())
51-
{
49+
if template.len() == 1 && template[0] == InlineAsmTemplatePiece::String("int $$0x29".into()) {
5250
fx.bcx.ins().trap(TrapCode::User(1));
5351
return;
5452
}

compiler/rustc_codegen_cranelift/src/intrinsics/llvm_x86.rs

+22-20
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
4040
shl rdx, 32
4141
or rax, rdx
4242
"
43-
.to_string(),
43+
.into(),
4444
)],
4545
&[
4646
CInlineAsmOperand::In {
@@ -471,7 +471,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
471471
// into 0x80000000 for which Cranelift doesn't have a native instruction.
472472
codegen_inline_asm_inner(
473473
fx,
474-
&[InlineAsmTemplatePiece::String(format!("cvtps2dq xmm0, xmm0"))],
474+
&[InlineAsmTemplatePiece::String("cvtps2dq xmm0, xmm0".into())],
475475
&[CInlineAsmOperand::InOut {
476476
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
477477
_late: true,
@@ -875,7 +875,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
875875

876876
codegen_inline_asm_inner(
877877
fx,
878-
&[InlineAsmTemplatePiece::String(asm.to_string())],
878+
&[InlineAsmTemplatePiece::String(asm.into())],
879879
&[
880880
CInlineAsmOperand::InOut {
881881
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::ax)),
@@ -914,7 +914,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
914914

915915
codegen_inline_asm_inner(
916916
fx,
917-
&[InlineAsmTemplatePiece::String(format!("pcmpestri xmm0, xmm1, {imm8}"))],
917+
&[InlineAsmTemplatePiece::String(format!("pcmpestri xmm0, xmm1, {imm8}").into())],
918918
&[
919919
CInlineAsmOperand::In {
920920
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
@@ -967,7 +967,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
967967

968968
codegen_inline_asm_inner(
969969
fx,
970-
&[InlineAsmTemplatePiece::String(format!("pcmpestrm xmm0, xmm1, {imm8}"))],
970+
&[InlineAsmTemplatePiece::String(format!("pcmpestrm xmm0, xmm1, {imm8}").into())],
971971
&[
972972
CInlineAsmOperand::InOut {
973973
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
@@ -1015,7 +1015,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
10151015

10161016
codegen_inline_asm_inner(
10171017
fx,
1018-
&[InlineAsmTemplatePiece::String(format!("pclmulqdq xmm0, xmm1, {imm8}"))],
1018+
&[InlineAsmTemplatePiece::String(format!("pclmulqdq xmm0, xmm1, {imm8}").into())],
10191019
&[
10201020
CInlineAsmOperand::InOut {
10211021
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
@@ -1052,7 +1052,9 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
10521052

10531053
codegen_inline_asm_inner(
10541054
fx,
1055-
&[InlineAsmTemplatePiece::String(format!("aeskeygenassist xmm0, xmm0, {imm8}"))],
1055+
&[InlineAsmTemplatePiece::String(
1056+
format!("aeskeygenassist xmm0, xmm0, {imm8}").into(),
1057+
)],
10561058
&[CInlineAsmOperand::InOut {
10571059
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
10581060
_late: true,
@@ -1071,7 +1073,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
10711073

10721074
codegen_inline_asm_inner(
10731075
fx,
1074-
&[InlineAsmTemplatePiece::String("aesimc xmm0, xmm0".to_string())],
1076+
&[InlineAsmTemplatePiece::String("aesimc xmm0, xmm0".into())],
10751077
&[CInlineAsmOperand::InOut {
10761078
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
10771079
_late: true,
@@ -1091,7 +1093,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
10911093

10921094
codegen_inline_asm_inner(
10931095
fx,
1094-
&[InlineAsmTemplatePiece::String("aesenc xmm0, xmm1".to_string())],
1096+
&[InlineAsmTemplatePiece::String("aesenc xmm0, xmm1".into())],
10951097
&[
10961098
CInlineAsmOperand::InOut {
10971099
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
@@ -1117,7 +1119,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
11171119

11181120
codegen_inline_asm_inner(
11191121
fx,
1120-
&[InlineAsmTemplatePiece::String("aesenclast xmm0, xmm1".to_string())],
1122+
&[InlineAsmTemplatePiece::String("aesenclast xmm0, xmm1".into())],
11211123
&[
11221124
CInlineAsmOperand::InOut {
11231125
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
@@ -1143,7 +1145,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
11431145

11441146
codegen_inline_asm_inner(
11451147
fx,
1146-
&[InlineAsmTemplatePiece::String("aesdec xmm0, xmm1".to_string())],
1148+
&[InlineAsmTemplatePiece::String("aesdec xmm0, xmm1".into())],
11471149
&[
11481150
CInlineAsmOperand::InOut {
11491151
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
@@ -1169,7 +1171,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
11691171

11701172
codegen_inline_asm_inner(
11711173
fx,
1172-
&[InlineAsmTemplatePiece::String("aesdeclast xmm0, xmm1".to_string())],
1174+
&[InlineAsmTemplatePiece::String("aesdeclast xmm0, xmm1".into())],
11731175
&[
11741176
CInlineAsmOperand::InOut {
11751177
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
@@ -1207,7 +1209,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
12071209

12081210
codegen_inline_asm_inner(
12091211
fx,
1210-
&[InlineAsmTemplatePiece::String(format!("sha1rnds4 xmm1, xmm2, {func}"))],
1212+
&[InlineAsmTemplatePiece::String(format!("sha1rnds4 xmm1, xmm2, {func}").into())],
12111213
&[
12121214
CInlineAsmOperand::InOut {
12131215
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
@@ -1233,7 +1235,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
12331235

12341236
codegen_inline_asm_inner(
12351237
fx,
1236-
&[InlineAsmTemplatePiece::String("sha1msg1 xmm1, xmm2".to_string())],
1238+
&[InlineAsmTemplatePiece::String("sha1msg1 xmm1, xmm2".into())],
12371239
&[
12381240
CInlineAsmOperand::InOut {
12391241
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
@@ -1259,7 +1261,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
12591261

12601262
codegen_inline_asm_inner(
12611263
fx,
1262-
&[InlineAsmTemplatePiece::String("sha1msg2 xmm1, xmm2".to_string())],
1264+
&[InlineAsmTemplatePiece::String("sha1msg2 xmm1, xmm2".into())],
12631265
&[
12641266
CInlineAsmOperand::InOut {
12651267
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
@@ -1285,7 +1287,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
12851287

12861288
codegen_inline_asm_inner(
12871289
fx,
1288-
&[InlineAsmTemplatePiece::String("sha1nexte xmm1, xmm2".to_string())],
1290+
&[InlineAsmTemplatePiece::String("sha1nexte xmm1, xmm2".into())],
12891291
&[
12901292
CInlineAsmOperand::InOut {
12911293
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
@@ -1312,7 +1314,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
13121314

13131315
codegen_inline_asm_inner(
13141316
fx,
1315-
&[InlineAsmTemplatePiece::String("sha256rnds2 xmm1, xmm2".to_string())],
1317+
&[InlineAsmTemplatePiece::String("sha256rnds2 xmm1, xmm2".into())],
13161318
&[
13171319
CInlineAsmOperand::InOut {
13181320
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
@@ -1343,7 +1345,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
13431345

13441346
codegen_inline_asm_inner(
13451347
fx,
1346-
&[InlineAsmTemplatePiece::String("sha256msg1 xmm1, xmm2".to_string())],
1348+
&[InlineAsmTemplatePiece::String("sha256msg1 xmm1, xmm2".into())],
13471349
&[
13481350
CInlineAsmOperand::InOut {
13491351
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
@@ -1369,7 +1371,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
13691371

13701372
codegen_inline_asm_inner(
13711373
fx,
1372-
&[InlineAsmTemplatePiece::String("sha256msg2 xmm1, xmm2".to_string())],
1374+
&[InlineAsmTemplatePiece::String("sha256msg2 xmm1, xmm2".into())],
13731375
&[
13741376
CInlineAsmOperand::InOut {
13751377
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
@@ -1435,7 +1437,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
14351437
let edx_place = res_place.place_field(fx, FieldIdx::new(1));
14361438
codegen_inline_asm_inner(
14371439
fx,
1438-
&[InlineAsmTemplatePiece::String("rdtsc".to_string())],
1440+
&[InlineAsmTemplatePiece::String("rdtsc".into())],
14391441
&[
14401442
CInlineAsmOperand::Out {
14411443
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::ax)),

compiler/rustc_mir_build/src/thir/cx/expr.rs

+5-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use crate::thir::cx::region::Scope;
33
use crate::thir::cx::Cx;
44
use crate::thir::util::UserAnnotatedTyHelpers;
55
use itertools::Itertools;
6-
use rustc_ast::LitKind;
76
use rustc_data_structures::stack::ensure_sufficient_stack;
87
use rustc_hir as hir;
98
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
@@ -22,8 +21,7 @@ use rustc_middle::ty::{
2221
self, AdtKind, InlineConstArgs, InlineConstArgsParts, ScalarInt, Ty, UpvarArgs, UserType,
2322
};
2423
use rustc_middle::{bug, span_bug};
25-
use rustc_span::source_map::Spanned;
26-
use rustc_span::{sym, Span, DUMMY_SP};
24+
use rustc_span::{sym, Span};
2725
use rustc_target::abi::{FieldIdx, FIRST_VARIANT};
2826
use tracing::{debug, info, instrument, trace};
2927

@@ -899,14 +897,10 @@ impl<'tcx> Cx<'tcx> {
899897
let hir_id = self.tcx.local_def_id_to_hir_id(def_id.expect_local());
900898
let generics = self.tcx.generics_of(hir_id.owner);
901899
let Some(&index) = generics.param_def_id_to_index.get(&def_id) else {
902-
let guar = self.tcx.dcx().has_errors().unwrap();
903-
// We already errored about a late bound const
904-
905-
let lit = self
906-
.tcx
907-
.hir_arena
908-
.alloc(Spanned { span: DUMMY_SP, node: LitKind::Err(guar) });
909-
return ExprKind::Literal { lit, neg: false };
900+
span_bug!(
901+
expr.span,
902+
"Should have already errored about late bound consts: {def_id:?}"
903+
);
910904
};
911905
let name = self.tcx.hir().name(hir_id);
912906
let param = ty::ParamConst::new(index, name);

compiler/rustc_parse/src/parser/item.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -2773,7 +2773,14 @@ impl<'a> Parser<'a> {
27732773
let snapshot = p.create_snapshot_for_diagnostic();
27742774
let param = p.parse_param_general(req_name, first_param).or_else(|e| {
27752775
let guar = e.emit();
2776-
let lo = p.prev_token.span;
2776+
// When parsing a param failed, we should check to make the span of the param
2777+
// not contain '(' before it.
2778+
// For example when parsing `*mut Self` in function `fn oof(*mut Self)`.
2779+
let lo = if let TokenKind::OpenDelim(Delimiter::Parenthesis) = p.prev_token.kind {
2780+
p.prev_token.span.shrink_to_hi()
2781+
} else {
2782+
p.prev_token.span
2783+
};
27772784
p.restore_snapshot(snapshot);
27782785
// Skip every token until next possible arg or end.
27792786
p.eat_to_tokens(&[&token::Comma, &token::CloseDelim(Delimiter::Parenthesis)]);

library/core/src/ffi/c_str.rs

+4-11
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ use crate::str;
9494
/// ```
9595
///
9696
/// [str]: prim@str "str"
97-
#[derive(Hash)]
97+
#[derive(PartialEq, Eq, Hash)]
9898
#[stable(feature = "core_c_str", since = "1.64.0")]
9999
#[rustc_has_incoherent_inherent_impls]
100100
#[lang = "CStr"]
@@ -104,7 +104,6 @@ use crate::str;
104104
// want `repr(transparent)` but we don't want it to show up in rustdoc, so we hide it under
105105
// `cfg(doc)`. This is an ad-hoc implementation of attribute privacy.
106106
#[repr(transparent)]
107-
#[allow(clippy::derived_hash_with_manual_eq)]
108107
pub struct CStr {
109108
// FIXME: this should not be represented with a DST slice but rather with
110109
// just a raw `c_char` along with some form of marker to make
@@ -678,15 +677,9 @@ impl CStr {
678677
}
679678
}
680679

681-
#[stable(feature = "rust1", since = "1.0.0")]
682-
impl PartialEq for CStr {
683-
#[inline]
684-
fn eq(&self, other: &CStr) -> bool {
685-
self.to_bytes().eq(other.to_bytes())
686-
}
687-
}
688-
#[stable(feature = "rust1", since = "1.0.0")]
689-
impl Eq for CStr {}
680+
// `.to_bytes()` representations are compared instead of the inner `[c_char]`s,
681+
// because `c_char` is `i8` (not `u8`) on some platforms.
682+
// That is why this is implemented manually and not derived.
690683
#[stable(feature = "rust1", since = "1.0.0")]
691684
impl PartialOrd for CStr {
692685
#[inline]

library/core/tests/ffi.rs

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
mod cstr;

library/core/tests/ffi/cstr.rs

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
use core::ffi::CStr;
2+
3+
#[test]
4+
fn compares_as_u8s() {
5+
let a: &CStr = c"Hello!"; // Starts with ascii
6+
let a_bytes: &[u8] = a.to_bytes();
7+
assert!((..0b1000_0000).contains(&a_bytes[0]));
8+
9+
let b: &CStr = c"こんにちは!"; // Starts with non ascii
10+
let b_bytes: &[u8] = b.to_bytes();
11+
assert!((0b1000_0000..).contains(&b_bytes[0]));
12+
13+
assert_eq!(Ord::cmp(a, b), Ord::cmp(a_bytes, b_bytes));
14+
assert_eq!(PartialOrd::partial_cmp(a, b), PartialOrd::partial_cmp(a_bytes, b_bytes));
15+
}

library/core/tests/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ mod clone;
132132
mod cmp;
133133
mod const_ptr;
134134
mod convert;
135+
mod ffi;
135136
mod fmt;
136137
mod future;
137138
mod hash;

0 commit comments

Comments
 (0)