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
This commit is contained in:
commit
aa877bc71c
17 changed files with 142 additions and 92 deletions
|
@ -1,4 +1,4 @@
|
||||||
Version 1.80 (2024-07-25)
|
Version 1.80.0 (2024-07-25)
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
<a id="1.80-Language"></a>
|
<a id="1.80-Language"></a>
|
||||||
|
|
|
@ -36,6 +36,7 @@ use rustc_macros::{Decodable, Encodable, HashStable_Generic};
|
||||||
use rustc_span::source_map::{respan, Spanned};
|
use rustc_span::source_map::{respan, Spanned};
|
||||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||||
use rustc_span::{ErrorGuaranteed, Span, DUMMY_SP};
|
use rustc_span::{ErrorGuaranteed, Span, DUMMY_SP};
|
||||||
|
use std::borrow::Cow;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
@ -2308,7 +2309,7 @@ impl std::fmt::Debug for InlineAsmOptions {
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, Encodable, Decodable, Debug, Hash, HashStable_Generic)]
|
#[derive(Clone, PartialEq, Encodable, Decodable, Debug, Hash, HashStable_Generic)]
|
||||||
pub enum InlineAsmTemplatePiece {
|
pub enum InlineAsmTemplatePiece {
|
||||||
String(String),
|
String(Cow<'static, str>),
|
||||||
Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
|
Placeholder { operand_idx: usize, modifier: Option<char>, span: Span },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -459,7 +459,7 @@ fn expand_preparsed_asm(
|
||||||
|
|
||||||
for (i, template_expr) in args.templates.into_iter().enumerate() {
|
for (i, template_expr) in args.templates.into_iter().enumerate() {
|
||||||
if i != 0 {
|
if i != 0 {
|
||||||
template.push(ast::InlineAsmTemplatePiece::String("\n".to_string()));
|
template.push(ast::InlineAsmTemplatePiece::String("\n".into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let msg = "asm template must be a string literal";
|
let msg = "asm template must be a string literal";
|
||||||
|
@ -527,7 +527,7 @@ fn expand_preparsed_asm(
|
||||||
|
|
||||||
// Don't treat raw asm as a format string.
|
// Don't treat raw asm as a format string.
|
||||||
if args.options.contains(ast::InlineAsmOptions::RAW) {
|
if args.options.contains(ast::InlineAsmOptions::RAW) {
|
||||||
template.push(ast::InlineAsmTemplatePiece::String(template_str.to_string()));
|
template.push(ast::InlineAsmTemplatePiece::String(template_str.to_string().into()));
|
||||||
let template_num_lines = 1 + template_str.matches('\n').count();
|
let template_num_lines = 1 + template_str.matches('\n').count();
|
||||||
line_spans.extend(std::iter::repeat(template_sp).take(template_num_lines));
|
line_spans.extend(std::iter::repeat(template_sp).take(template_num_lines));
|
||||||
continue;
|
continue;
|
||||||
|
@ -577,7 +577,7 @@ fn expand_preparsed_asm(
|
||||||
for piece in unverified_pieces {
|
for piece in unverified_pieces {
|
||||||
match piece {
|
match piece {
|
||||||
parse::Piece::String(s) => {
|
parse::Piece::String(s) => {
|
||||||
template.push(ast::InlineAsmTemplatePiece::String(s.to_string()))
|
template.push(ast::InlineAsmTemplatePiece::String(s.to_string().into()))
|
||||||
}
|
}
|
||||||
parse::Piece::NextArgument(arg) => {
|
parse::Piece::NextArgument(arg) => {
|
||||||
let span = arg_spans.next().unwrap_or(template_sp);
|
let span = arg_spans.next().unwrap_or(template_sp);
|
||||||
|
|
|
@ -46,9 +46,7 @@ pub(crate) fn codegen_inline_asm_terminator<'tcx>(
|
||||||
// Used by panic_abort on Windows, but uses a syntax which only happens to work with
|
// Used by panic_abort on Windows, but uses a syntax which only happens to work with
|
||||||
// asm!() by accident and breaks with the GNU assembler as well as global_asm!() for
|
// asm!() by accident and breaks with the GNU assembler as well as global_asm!() for
|
||||||
// the LLVM backend.
|
// the LLVM backend.
|
||||||
if template.len() == 1
|
if template.len() == 1 && template[0] == InlineAsmTemplatePiece::String("int $$0x29".into()) {
|
||||||
&& template[0] == InlineAsmTemplatePiece::String("int $$0x29".to_string())
|
|
||||||
{
|
|
||||||
fx.bcx.ins().trap(TrapCode::User(1));
|
fx.bcx.ins().trap(TrapCode::User(1));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
shl rdx, 32
|
shl rdx, 32
|
||||||
or rax, rdx
|
or rax, rdx
|
||||||
"
|
"
|
||||||
.to_string(),
|
.into(),
|
||||||
)],
|
)],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::In {
|
CInlineAsmOperand::In {
|
||||||
|
@ -471,7 +471,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
// into 0x80000000 for which Cranelift doesn't have a native instruction.
|
// into 0x80000000 for which Cranelift doesn't have a native instruction.
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String(format!("cvtps2dq xmm0, xmm0"))],
|
&[InlineAsmTemplatePiece::String("cvtps2dq xmm0, xmm0".into())],
|
||||||
&[CInlineAsmOperand::InOut {
|
&[CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
_late: true,
|
_late: true,
|
||||||
|
@ -875,7 +875,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String(asm.to_string())],
|
&[InlineAsmTemplatePiece::String(asm.into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::ax)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::ax)),
|
||||||
|
@ -914,7 +914,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String(format!("pcmpestri xmm0, xmm1, {imm8}"))],
|
&[InlineAsmTemplatePiece::String(format!("pcmpestri xmm0, xmm1, {imm8}").into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::In {
|
CInlineAsmOperand::In {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
|
@ -967,7 +967,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String(format!("pcmpestrm xmm0, xmm1, {imm8}"))],
|
&[InlineAsmTemplatePiece::String(format!("pcmpestrm xmm0, xmm1, {imm8}").into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
|
@ -1015,7 +1015,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String(format!("pclmulqdq xmm0, xmm1, {imm8}"))],
|
&[InlineAsmTemplatePiece::String(format!("pclmulqdq xmm0, xmm1, {imm8}").into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
|
@ -1052,7 +1052,9 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String(format!("aeskeygenassist xmm0, xmm0, {imm8}"))],
|
&[InlineAsmTemplatePiece::String(
|
||||||
|
format!("aeskeygenassist xmm0, xmm0, {imm8}").into(),
|
||||||
|
)],
|
||||||
&[CInlineAsmOperand::InOut {
|
&[CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
_late: true,
|
_late: true,
|
||||||
|
@ -1071,7 +1073,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("aesimc xmm0, xmm0".to_string())],
|
&[InlineAsmTemplatePiece::String("aesimc xmm0, xmm0".into())],
|
||||||
&[CInlineAsmOperand::InOut {
|
&[CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
_late: true,
|
_late: true,
|
||||||
|
@ -1091,7 +1093,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("aesenc xmm0, xmm1".to_string())],
|
&[InlineAsmTemplatePiece::String("aesenc xmm0, xmm1".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
|
@ -1117,7 +1119,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("aesenclast xmm0, xmm1".to_string())],
|
&[InlineAsmTemplatePiece::String("aesenclast xmm0, xmm1".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
|
@ -1143,7 +1145,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("aesdec xmm0, xmm1".to_string())],
|
&[InlineAsmTemplatePiece::String("aesdec xmm0, xmm1".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
|
@ -1169,7 +1171,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("aesdeclast xmm0, xmm1".to_string())],
|
&[InlineAsmTemplatePiece::String("aesdeclast xmm0, xmm1".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm0)),
|
||||||
|
@ -1207,7 +1209,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String(format!("sha1rnds4 xmm1, xmm2, {func}"))],
|
&[InlineAsmTemplatePiece::String(format!("sha1rnds4 xmm1, xmm2, {func}").into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
||||||
|
@ -1233,7 +1235,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("sha1msg1 xmm1, xmm2".to_string())],
|
&[InlineAsmTemplatePiece::String("sha1msg1 xmm1, xmm2".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
||||||
|
@ -1259,7 +1261,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("sha1msg2 xmm1, xmm2".to_string())],
|
&[InlineAsmTemplatePiece::String("sha1msg2 xmm1, xmm2".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
||||||
|
@ -1285,7 +1287,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("sha1nexte xmm1, xmm2".to_string())],
|
&[InlineAsmTemplatePiece::String("sha1nexte xmm1, xmm2".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
||||||
|
@ -1312,7 +1314,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("sha256rnds2 xmm1, xmm2".to_string())],
|
&[InlineAsmTemplatePiece::String("sha256rnds2 xmm1, xmm2".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
||||||
|
@ -1343,7 +1345,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("sha256msg1 xmm1, xmm2".to_string())],
|
&[InlineAsmTemplatePiece::String("sha256msg1 xmm1, xmm2".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
||||||
|
@ -1369,7 +1371,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
|
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("sha256msg2 xmm1, xmm2".to_string())],
|
&[InlineAsmTemplatePiece::String("sha256msg2 xmm1, xmm2".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::InOut {
|
CInlineAsmOperand::InOut {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::xmm1)),
|
||||||
|
@ -1435,7 +1437,7 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
|
||||||
let edx_place = res_place.place_field(fx, FieldIdx::new(1));
|
let edx_place = res_place.place_field(fx, FieldIdx::new(1));
|
||||||
codegen_inline_asm_inner(
|
codegen_inline_asm_inner(
|
||||||
fx,
|
fx,
|
||||||
&[InlineAsmTemplatePiece::String("rdtsc".to_string())],
|
&[InlineAsmTemplatePiece::String("rdtsc".into())],
|
||||||
&[
|
&[
|
||||||
CInlineAsmOperand::Out {
|
CInlineAsmOperand::Out {
|
||||||
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::ax)),
|
reg: InlineAsmRegOrRegClass::Reg(InlineAsmReg::X86(X86InlineAsmReg::ax)),
|
||||||
|
|
|
@ -3,7 +3,6 @@ use crate::thir::cx::region::Scope;
|
||||||
use crate::thir::cx::Cx;
|
use crate::thir::cx::Cx;
|
||||||
use crate::thir::util::UserAnnotatedTyHelpers;
|
use crate::thir::util::UserAnnotatedTyHelpers;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use rustc_ast::LitKind;
|
|
||||||
use rustc_data_structures::stack::ensure_sufficient_stack;
|
use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res};
|
||||||
|
@ -22,8 +21,7 @@ use rustc_middle::ty::{
|
||||||
self, AdtKind, InlineConstArgs, InlineConstArgsParts, ScalarInt, Ty, UpvarArgs, UserType,
|
self, AdtKind, InlineConstArgs, InlineConstArgsParts, ScalarInt, Ty, UpvarArgs, UserType,
|
||||||
};
|
};
|
||||||
use rustc_middle::{bug, span_bug};
|
use rustc_middle::{bug, span_bug};
|
||||||
use rustc_span::source_map::Spanned;
|
use rustc_span::{sym, Span};
|
||||||
use rustc_span::{sym, Span, DUMMY_SP};
|
|
||||||
use rustc_target::abi::{FieldIdx, FIRST_VARIANT};
|
use rustc_target::abi::{FieldIdx, FIRST_VARIANT};
|
||||||
use tracing::{debug, info, instrument, trace};
|
use tracing::{debug, info, instrument, trace};
|
||||||
|
|
||||||
|
@ -899,14 +897,10 @@ impl<'tcx> Cx<'tcx> {
|
||||||
let hir_id = self.tcx.local_def_id_to_hir_id(def_id.expect_local());
|
let hir_id = self.tcx.local_def_id_to_hir_id(def_id.expect_local());
|
||||||
let generics = self.tcx.generics_of(hir_id.owner);
|
let generics = self.tcx.generics_of(hir_id.owner);
|
||||||
let Some(&index) = generics.param_def_id_to_index.get(&def_id) else {
|
let Some(&index) = generics.param_def_id_to_index.get(&def_id) else {
|
||||||
let guar = self.tcx.dcx().has_errors().unwrap();
|
span_bug!(
|
||||||
// We already errored about a late bound const
|
expr.span,
|
||||||
|
"Should have already errored about late bound consts: {def_id:?}"
|
||||||
let lit = self
|
);
|
||||||
.tcx
|
|
||||||
.hir_arena
|
|
||||||
.alloc(Spanned { span: DUMMY_SP, node: LitKind::Err(guar) });
|
|
||||||
return ExprKind::Literal { lit, neg: false };
|
|
||||||
};
|
};
|
||||||
let name = self.tcx.hir().name(hir_id);
|
let name = self.tcx.hir().name(hir_id);
|
||||||
let param = ty::ParamConst::new(index, name);
|
let param = ty::ParamConst::new(index, name);
|
||||||
|
|
|
@ -2773,7 +2773,14 @@ impl<'a> Parser<'a> {
|
||||||
let snapshot = p.create_snapshot_for_diagnostic();
|
let snapshot = p.create_snapshot_for_diagnostic();
|
||||||
let param = p.parse_param_general(req_name, first_param).or_else(|e| {
|
let param = p.parse_param_general(req_name, first_param).or_else(|e| {
|
||||||
let guar = e.emit();
|
let guar = e.emit();
|
||||||
let lo = p.prev_token.span;
|
// When parsing a param failed, we should check to make the span of the param
|
||||||
|
// not contain '(' before it.
|
||||||
|
// For example when parsing `*mut Self` in function `fn oof(*mut Self)`.
|
||||||
|
let lo = if let TokenKind::OpenDelim(Delimiter::Parenthesis) = p.prev_token.kind {
|
||||||
|
p.prev_token.span.shrink_to_hi()
|
||||||
|
} else {
|
||||||
|
p.prev_token.span
|
||||||
|
};
|
||||||
p.restore_snapshot(snapshot);
|
p.restore_snapshot(snapshot);
|
||||||
// Skip every token until next possible arg or end.
|
// Skip every token until next possible arg or end.
|
||||||
p.eat_to_tokens(&[&token::Comma, &token::CloseDelim(Delimiter::Parenthesis)]);
|
p.eat_to_tokens(&[&token::Comma, &token::CloseDelim(Delimiter::Parenthesis)]);
|
||||||
|
|
|
@ -94,7 +94,7 @@ use crate::str;
|
||||||
/// ```
|
/// ```
|
||||||
///
|
///
|
||||||
/// [str]: prim@str "str"
|
/// [str]: prim@str "str"
|
||||||
#[derive(Hash)]
|
#[derive(PartialEq, Eq, Hash)]
|
||||||
#[stable(feature = "core_c_str", since = "1.64.0")]
|
#[stable(feature = "core_c_str", since = "1.64.0")]
|
||||||
#[rustc_has_incoherent_inherent_impls]
|
#[rustc_has_incoherent_inherent_impls]
|
||||||
#[lang = "CStr"]
|
#[lang = "CStr"]
|
||||||
|
@ -104,7 +104,6 @@ use crate::str;
|
||||||
// want `repr(transparent)` but we don't want it to show up in rustdoc, so we hide it under
|
// want `repr(transparent)` but we don't want it to show up in rustdoc, so we hide it under
|
||||||
// `cfg(doc)`. This is an ad-hoc implementation of attribute privacy.
|
// `cfg(doc)`. This is an ad-hoc implementation of attribute privacy.
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[allow(clippy::derived_hash_with_manual_eq)]
|
|
||||||
pub struct CStr {
|
pub struct CStr {
|
||||||
// FIXME: this should not be represented with a DST slice but rather with
|
// FIXME: this should not be represented with a DST slice but rather with
|
||||||
// just a raw `c_char` along with some form of marker to make
|
// just a raw `c_char` along with some form of marker to make
|
||||||
|
@ -678,15 +677,9 @@ impl CStr {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
// `.to_bytes()` representations are compared instead of the inner `[c_char]`s,
|
||||||
impl PartialEq for CStr {
|
// because `c_char` is `i8` (not `u8`) on some platforms.
|
||||||
#[inline]
|
// That is why this is implemented manually and not derived.
|
||||||
fn eq(&self, other: &CStr) -> bool {
|
|
||||||
self.to_bytes().eq(other.to_bytes())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
impl Eq for CStr {}
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl PartialOrd for CStr {
|
impl PartialOrd for CStr {
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
1
library/core/tests/ffi.rs
Normal file
1
library/core/tests/ffi.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mod cstr;
|
15
library/core/tests/ffi/cstr.rs
Normal file
15
library/core/tests/ffi/cstr.rs
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
use core::ffi::CStr;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn compares_as_u8s() {
|
||||||
|
let a: &CStr = c"Hello!"; // Starts with ascii
|
||||||
|
let a_bytes: &[u8] = a.to_bytes();
|
||||||
|
assert!((..0b1000_0000).contains(&a_bytes[0]));
|
||||||
|
|
||||||
|
let b: &CStr = c"こんにちは!"; // Starts with non ascii
|
||||||
|
let b_bytes: &[u8] = b.to_bytes();
|
||||||
|
assert!((0b1000_0000..).contains(&b_bytes[0]));
|
||||||
|
|
||||||
|
assert_eq!(Ord::cmp(a, b), Ord::cmp(a_bytes, b_bytes));
|
||||||
|
assert_eq!(PartialOrd::partial_cmp(a, b), PartialOrd::partial_cmp(a_bytes, b_bytes));
|
||||||
|
}
|
|
@ -132,6 +132,7 @@ mod clone;
|
||||||
mod cmp;
|
mod cmp;
|
||||||
mod const_ptr;
|
mod const_ptr;
|
||||||
mod convert;
|
mod convert;
|
||||||
|
mod ffi;
|
||||||
mod fmt;
|
mod fmt;
|
||||||
mod future;
|
mod future;
|
||||||
mod hash;
|
mod hash;
|
||||||
|
|
|
@ -276,44 +276,3 @@ compat_fn_with_fallback! {
|
||||||
Status as u32
|
Status as u32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// # Arm32 shim
|
|
||||||
//
|
|
||||||
// AddVectoredExceptionHandler and WSAStartup use platform-specific types.
|
|
||||||
// However, Microsoft no longer supports thumbv7a so definitions for those targets
|
|
||||||
// are not included in the win32 metadata. We work around that by defining them here.
|
|
||||||
//
|
|
||||||
// Where possible, these definitions should be kept in sync with https://docs.rs/windows-sys
|
|
||||||
cfg_if::cfg_if! {
|
|
||||||
if #[cfg(not(target_vendor = "uwp"))] {
|
|
||||||
#[link(name = "kernel32")]
|
|
||||||
extern "system" {
|
|
||||||
pub fn AddVectoredExceptionHandler(
|
|
||||||
first: u32,
|
|
||||||
handler: PVECTORED_EXCEPTION_HANDLER,
|
|
||||||
) -> *mut c_void;
|
|
||||||
}
|
|
||||||
pub type PVECTORED_EXCEPTION_HANDLER = Option<
|
|
||||||
unsafe extern "system" fn(exceptioninfo: *mut EXCEPTION_POINTERS) -> i32,
|
|
||||||
>;
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct EXCEPTION_POINTERS {
|
|
||||||
pub ExceptionRecord: *mut EXCEPTION_RECORD,
|
|
||||||
pub ContextRecord: *mut CONTEXT,
|
|
||||||
}
|
|
||||||
#[cfg(target_arch = "arm")]
|
|
||||||
pub enum CONTEXT {}
|
|
||||||
}}
|
|
||||||
// WSAStartup is only redefined here so that we can override WSADATA for Arm32
|
|
||||||
windows_targets::link!("ws2_32.dll" "system" fn WSAStartup(wversionrequested: u16, lpwsadata: *mut WSADATA) -> i32);
|
|
||||||
#[cfg(target_arch = "arm")]
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct WSADATA {
|
|
||||||
pub wVersion: u16,
|
|
||||||
pub wHighVersion: u16,
|
|
||||||
pub szDescription: [u8; 257],
|
|
||||||
pub szSystemStatus: [u8; 129],
|
|
||||||
pub iMaxSockets: u16,
|
|
||||||
pub iMaxUdpDg: u16,
|
|
||||||
pub lpVendorInfo: PSTR,
|
|
||||||
}
|
|
||||||
|
|
|
@ -2176,6 +2176,7 @@ Windows.Win32.Networking.WinSock.WSARecv
|
||||||
Windows.Win32.Networking.WinSock.WSASend
|
Windows.Win32.Networking.WinSock.WSASend
|
||||||
Windows.Win32.Networking.WinSock.WSASERVICE_NOT_FOUND
|
Windows.Win32.Networking.WinSock.WSASERVICE_NOT_FOUND
|
||||||
Windows.Win32.Networking.WinSock.WSASocketW
|
Windows.Win32.Networking.WinSock.WSASocketW
|
||||||
|
Windows.Win32.Networking.WinSock.WSAStartup
|
||||||
Windows.Win32.Networking.WinSock.WSASYSCALLFAILURE
|
Windows.Win32.Networking.WinSock.WSASYSCALLFAILURE
|
||||||
Windows.Win32.Networking.WinSock.WSASYSNOTREADY
|
Windows.Win32.Networking.WinSock.WSASYSNOTREADY
|
||||||
Windows.Win32.Networking.WinSock.WSATRY_AGAIN
|
Windows.Win32.Networking.WinSock.WSATRY_AGAIN
|
||||||
|
@ -2420,6 +2421,7 @@ Windows.Win32.System.Console.STD_HANDLE
|
||||||
Windows.Win32.System.Console.STD_INPUT_HANDLE
|
Windows.Win32.System.Console.STD_INPUT_HANDLE
|
||||||
Windows.Win32.System.Console.STD_OUTPUT_HANDLE
|
Windows.Win32.System.Console.STD_OUTPUT_HANDLE
|
||||||
Windows.Win32.System.Console.WriteConsoleW
|
Windows.Win32.System.Console.WriteConsoleW
|
||||||
|
Windows.Win32.System.Diagnostics.Debug.AddVectoredExceptionHandler
|
||||||
Windows.Win32.System.Diagnostics.Debug.ARM64_NT_NEON128
|
Windows.Win32.System.Diagnostics.Debug.ARM64_NT_NEON128
|
||||||
Windows.Win32.System.Diagnostics.Debug.CONTEXT
|
Windows.Win32.System.Diagnostics.Debug.CONTEXT
|
||||||
Windows.Win32.System.Diagnostics.Debug.EXCEPTION_RECORD
|
Windows.Win32.System.Diagnostics.Debug.EXCEPTION_RECORD
|
||||||
|
|
|
@ -5,6 +5,7 @@ windows_targets::link!("advapi32.dll" "system" fn OpenProcessToken(processhandle
|
||||||
windows_targets::link!("advapi32.dll" "system" "SystemFunction036" fn RtlGenRandom(randombuffer : *mut core::ffi::c_void, randombufferlength : u32) -> BOOLEAN);
|
windows_targets::link!("advapi32.dll" "system" "SystemFunction036" fn RtlGenRandom(randombuffer : *mut core::ffi::c_void, randombufferlength : u32) -> BOOLEAN);
|
||||||
windows_targets::link!("kernel32.dll" "system" fn AcquireSRWLockExclusive(srwlock : *mut SRWLOCK));
|
windows_targets::link!("kernel32.dll" "system" fn AcquireSRWLockExclusive(srwlock : *mut SRWLOCK));
|
||||||
windows_targets::link!("kernel32.dll" "system" fn AcquireSRWLockShared(srwlock : *mut SRWLOCK));
|
windows_targets::link!("kernel32.dll" "system" fn AcquireSRWLockShared(srwlock : *mut SRWLOCK));
|
||||||
|
windows_targets::link!("kernel32.dll" "system" fn AddVectoredExceptionHandler(first : u32, handler : PVECTORED_EXCEPTION_HANDLER) -> *mut core::ffi::c_void);
|
||||||
windows_targets::link!("kernel32.dll" "system" fn CancelIo(hfile : HANDLE) -> BOOL);
|
windows_targets::link!("kernel32.dll" "system" fn CancelIo(hfile : HANDLE) -> BOOL);
|
||||||
windows_targets::link!("kernel32.dll" "system" fn CloseHandle(hobject : HANDLE) -> BOOL);
|
windows_targets::link!("kernel32.dll" "system" fn CloseHandle(hobject : HANDLE) -> BOOL);
|
||||||
windows_targets::link!("kernel32.dll" "system" fn CompareStringOrdinal(lpstring1 : PCWSTR, cchcount1 : i32, lpstring2 : PCWSTR, cchcount2 : i32, bignorecase : BOOL) -> COMPARESTRING_RESULT);
|
windows_targets::link!("kernel32.dll" "system" fn CompareStringOrdinal(lpstring1 : PCWSTR, cchcount1 : i32, lpstring2 : PCWSTR, cchcount2 : i32, bignorecase : BOOL) -> COMPARESTRING_RESULT);
|
||||||
|
@ -114,6 +115,7 @@ windows_targets::link!("ws2_32.dll" "system" fn WSAGetLastError() -> WSA_ERROR);
|
||||||
windows_targets::link!("ws2_32.dll" "system" fn WSARecv(s : SOCKET, lpbuffers : *const WSABUF, dwbuffercount : u32, lpnumberofbytesrecvd : *mut u32, lpflags : *mut u32, lpoverlapped : *mut OVERLAPPED, lpcompletionroutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> i32);
|
windows_targets::link!("ws2_32.dll" "system" fn WSARecv(s : SOCKET, lpbuffers : *const WSABUF, dwbuffercount : u32, lpnumberofbytesrecvd : *mut u32, lpflags : *mut u32, lpoverlapped : *mut OVERLAPPED, lpcompletionroutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> i32);
|
||||||
windows_targets::link!("ws2_32.dll" "system" fn WSASend(s : SOCKET, lpbuffers : *const WSABUF, dwbuffercount : u32, lpnumberofbytessent : *mut u32, dwflags : u32, lpoverlapped : *mut OVERLAPPED, lpcompletionroutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> i32);
|
windows_targets::link!("ws2_32.dll" "system" fn WSASend(s : SOCKET, lpbuffers : *const WSABUF, dwbuffercount : u32, lpnumberofbytessent : *mut u32, dwflags : u32, lpoverlapped : *mut OVERLAPPED, lpcompletionroutine : LPWSAOVERLAPPED_COMPLETION_ROUTINE) -> i32);
|
||||||
windows_targets::link!("ws2_32.dll" "system" fn WSASocketW(af : i32, r#type : i32, protocol : i32, lpprotocolinfo : *const WSAPROTOCOL_INFOW, g : u32, dwflags : u32) -> SOCKET);
|
windows_targets::link!("ws2_32.dll" "system" fn WSASocketW(af : i32, r#type : i32, protocol : i32, lpprotocolinfo : *const WSAPROTOCOL_INFOW, g : u32, dwflags : u32) -> SOCKET);
|
||||||
|
windows_targets::link!("ws2_32.dll" "system" fn WSAStartup(wversionrequested : u16, lpwsadata : *mut WSADATA) -> i32);
|
||||||
windows_targets::link!("ws2_32.dll" "system" fn accept(s : SOCKET, addr : *mut SOCKADDR, addrlen : *mut i32) -> SOCKET);
|
windows_targets::link!("ws2_32.dll" "system" fn accept(s : SOCKET, addr : *mut SOCKADDR, addrlen : *mut i32) -> SOCKET);
|
||||||
windows_targets::link!("ws2_32.dll" "system" fn bind(s : SOCKET, name : *const SOCKADDR, namelen : i32) -> i32);
|
windows_targets::link!("ws2_32.dll" "system" fn bind(s : SOCKET, name : *const SOCKADDR, namelen : i32) -> i32);
|
||||||
windows_targets::link!("ws2_32.dll" "system" fn closesocket(s : SOCKET) -> i32);
|
windows_targets::link!("ws2_32.dll" "system" fn closesocket(s : SOCKET) -> i32);
|
||||||
|
@ -2284,6 +2286,12 @@ pub type EXCEPTION_DISPOSITION = i32;
|
||||||
pub const EXCEPTION_MAXIMUM_PARAMETERS: u32 = 15u32;
|
pub const EXCEPTION_MAXIMUM_PARAMETERS: u32 = 15u32;
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
|
pub struct EXCEPTION_POINTERS {
|
||||||
|
pub ExceptionRecord: *mut EXCEPTION_RECORD,
|
||||||
|
pub ContextRecord: *mut CONTEXT,
|
||||||
|
}
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Clone, Copy)]
|
||||||
pub struct EXCEPTION_RECORD {
|
pub struct EXCEPTION_RECORD {
|
||||||
pub ExceptionCode: NTSTATUS,
|
pub ExceptionCode: NTSTATUS,
|
||||||
pub ExceptionFlags: u32,
|
pub ExceptionFlags: u32,
|
||||||
|
@ -2860,6 +2868,8 @@ pub type PTIMERAPCROUTINE = Option<
|
||||||
dwtimerhighvalue: u32,
|
dwtimerhighvalue: u32,
|
||||||
),
|
),
|
||||||
>;
|
>;
|
||||||
|
pub type PVECTORED_EXCEPTION_HANDLER =
|
||||||
|
Option<unsafe extern "system" fn(exceptioninfo: *mut EXCEPTION_POINTERS) -> i32>;
|
||||||
pub type PWSTR = *mut u16;
|
pub type PWSTR = *mut u16;
|
||||||
pub const READ_CONTROL: FILE_ACCESS_RIGHTS = 131072u32;
|
pub const READ_CONTROL: FILE_ACCESS_RIGHTS = 131072u32;
|
||||||
pub const REALTIME_PRIORITY_CLASS: PROCESS_CREATION_FLAGS = 256u32;
|
pub const REALTIME_PRIORITY_CLASS: PROCESS_CREATION_FLAGS = 256u32;
|
||||||
|
@ -3292,5 +3302,19 @@ pub struct XSAVE_FORMAT {
|
||||||
pub XmmRegisters: [M128A; 8],
|
pub XmmRegisters: [M128A; 8],
|
||||||
pub Reserved4: [u8; 224],
|
pub Reserved4: [u8; 224],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(target_arch = "arm")]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct WSADATA {
|
||||||
|
pub wVersion: u16,
|
||||||
|
pub wHighVersion: u16,
|
||||||
|
pub szDescription: [u8; 257],
|
||||||
|
pub szSystemStatus: [u8; 129],
|
||||||
|
pub iMaxSockets: u16,
|
||||||
|
pub iMaxUdpDg: u16,
|
||||||
|
pub lpVendorInfo: PSTR,
|
||||||
|
}
|
||||||
|
#[cfg(target_arch = "arm")]
|
||||||
|
pub enum CONTEXT {}
|
||||||
// ignore-tidy-filelength
|
// ignore-tidy-filelength
|
||||||
use super::windows_targets;
|
use super::windows_targets;
|
||||||
|
|
|
@ -4,6 +4,24 @@ use std::fs;
|
||||||
use std::io::{Read, Seek, SeekFrom, Write};
|
use std::io::{Read, Seek, SeekFrom, Write};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
/// 32-bit ARM is not supported by Microsoft so ARM types are not generated.
|
||||||
|
/// Therefore we need to inject a few types to make the bindings work.
|
||||||
|
const ARM32_SHIM: &str = r#"
|
||||||
|
#[cfg(target_arch = "arm")]
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct WSADATA {
|
||||||
|
pub wVersion: u16,
|
||||||
|
pub wHighVersion: u16,
|
||||||
|
pub szDescription: [u8; 257],
|
||||||
|
pub szSystemStatus: [u8; 129],
|
||||||
|
pub iMaxSockets: u16,
|
||||||
|
pub iMaxUdpDg: u16,
|
||||||
|
pub lpVendorInfo: PSTR,
|
||||||
|
}
|
||||||
|
#[cfg(target_arch = "arm")]
|
||||||
|
pub enum CONTEXT {}
|
||||||
|
"#;
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
let mut path: PathBuf =
|
let mut path: PathBuf =
|
||||||
env::args_os().nth(1).expect("a path to the rust repository is required").into();
|
env::args_os().nth(1).expect("a path to the rust repository is required").into();
|
||||||
|
@ -16,6 +34,7 @@ fn main() -> Result<(), Box<dyn Error>> {
|
||||||
println!("{info}");
|
println!("{info}");
|
||||||
|
|
||||||
let mut f = std::fs::File::options().append(true).open("windows_sys.rs")?;
|
let mut f = std::fs::File::options().append(true).open("windows_sys.rs")?;
|
||||||
|
f.write_all(ARM32_SHIM.as_bytes())?;
|
||||||
writeln!(&mut f, "// ignore-tidy-filelength")?;
|
writeln!(&mut f, "// ignore-tidy-filelength")?;
|
||||||
writeln!(&mut f, "use super::windows_targets;")?;
|
writeln!(&mut f, "use super::windows_targets;")?;
|
||||||
|
|
||||||
|
|
12
tests/ui/suggestions/suggest-add-self-issue-128042.rs
Normal file
12
tests/ui/suggestions/suggest-add-self-issue-128042.rs
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
struct Thing {
|
||||||
|
state: u8,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Thing {
|
||||||
|
fn oof(*mut Self) { //~ ERROR expected parameter name, found `*`
|
||||||
|
self.state = 1;
|
||||||
|
//~^ ERROR expected value, found module `self`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
22
tests/ui/suggestions/suggest-add-self-issue-128042.stderr
Normal file
22
tests/ui/suggestions/suggest-add-self-issue-128042.stderr
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
error: expected parameter name, found `*`
|
||||||
|
--> $DIR/suggest-add-self-issue-128042.rs:6:12
|
||||||
|
|
|
||||||
|
LL | fn oof(*mut Self) {
|
||||||
|
| ^ expected parameter name
|
||||||
|
|
||||||
|
error[E0424]: expected value, found module `self`
|
||||||
|
--> $DIR/suggest-add-self-issue-128042.rs:7:9
|
||||||
|
|
|
||||||
|
LL | fn oof(*mut Self) {
|
||||||
|
| --- this function doesn't have a `self` parameter
|
||||||
|
LL | self.state = 1;
|
||||||
|
| ^^^^ `self` value is a keyword only available in methods with a `self` parameter
|
||||||
|
|
|
||||||
|
help: add a `self` receiver parameter to make the associated `fn` a method
|
||||||
|
|
|
||||||
|
LL | fn oof(&self, *mut Self) {
|
||||||
|
| ++++++
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0424`.
|
Loading…
Add table
Add a link
Reference in a new issue