diff --git a/src/librustc_lint/levels.rs b/src/librustc_lint/levels.rs index 3d2ddf12a0a1f..05e7c9a0c780d 100644 --- a/src/librustc_lint/levels.rs +++ b/src/librustc_lint/levels.rs @@ -214,9 +214,9 @@ impl<'s> LintLevelsBuilder<'s> { match store.check_lint_name(&name.as_str(), tool_name) { CheckLintNameResult::Ok(ids) => { let src = LintSource::Node(name, li.span(), reason); - for id in ids { - self.check_gated_lint(*id, attr.span); - specs.insert(*id, (level, src)); + for &id in ids { + self.check_gated_lint(id, attr.span); + specs.insert(id, (level, src)); } } @@ -386,17 +386,18 @@ impl<'s> LintLevelsBuilder<'s> { BuilderPush { prev, changed: prev != self.cur } } - fn check_gated_lint(&self, id: LintId, span: Span) { - if id == LintId::of(builtin::UNSAFE_OP_IN_UNSAFE_FN) - && !self.sess.features_untracked().unsafe_block_in_unsafe_fn - { - feature_err( - &self.sess.parse_sess, - sym::unsafe_block_in_unsafe_fn, - span, - "the `unsafe_op_in_unsafe_fn` lint is unstable", - ) - .emit(); + /// Checks if the lint is gated on a feature that is not enabled. + fn check_gated_lint(&self, lint_id: LintId, span: Span) { + if let Some(feature) = lint_id.lint.feature_gate { + if !self.sess.features_untracked().enabled(feature) { + feature_err( + &self.sess.parse_sess, + feature, + span, + &format!("the `{}` lint is unstable", lint_id.lint.name_lower()), + ) + .emit(); + } } } diff --git a/src/librustc_save_analysis/dump_visitor.rs b/src/librustc_save_analysis/dump_visitor.rs index a5e61ab9ab033..0c76c9108dd56 100644 --- a/src/librustc_save_analysis/dump_visitor.rs +++ b/src/librustc_save_analysis/dump_visitor.rs @@ -210,9 +210,11 @@ impl<'l, 'tcx> DumpVisitor<'l, 'tcx> { // As write_sub_paths, but does not process the last ident in the path (assuming it // will be processed elsewhere). See note on write_sub_paths about global. fn write_sub_paths_truncated(&mut self, path: &'tcx hir::Path<'tcx>) { - for seg in &path.segments[..path.segments.len() - 1] { - if let Some(data) = self.save_ctxt.get_path_segment_data(seg) { - self.dumper.dump_ref(data); + if path.segments.len() > 0 { + for seg in &path.segments[..path.segments.len() - 1] { + if let Some(data) = self.save_ctxt.get_path_segment_data(seg) { + self.dumper.dump_ref(data); + } } } } diff --git a/src/librustc_save_analysis/lib.rs b/src/librustc_save_analysis/lib.rs index 8c7731c18e9c4..0341b54252661 100644 --- a/src/librustc_save_analysis/lib.rs +++ b/src/librustc_save_analysis/lib.rs @@ -534,10 +534,14 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { } } } - hir::ExprKind::Struct(hir::QPath::Resolved(_, path), ..) => { + hir::ExprKind::Struct(qpath, ..) => { + let segment = match qpath { + hir::QPath::Resolved(_, path) => path.segments.last().unwrap(), + hir::QPath::TypeRelative(_, segment) => segment, + }; match self.tables.expr_ty_adjusted(&hir_node).kind { ty::Adt(def, _) if !def.is_enum() => { - let sub_span = path.segments.last().unwrap().ident.span; + let sub_span = segment.ident.span; filter!(self.span_utils, sub_span); let span = self.span_from_span(sub_span); Some(Data::RefData(Ref { @@ -580,7 +584,7 @@ impl<'l, 'tcx> SaveContext<'l, 'tcx> { } _ => { // FIXME - bug!(); + bug!("invalid expression: {:?}", expr); } } } diff --git a/src/librustc_session/lint.rs b/src/librustc_session/lint.rs index 8a66fac1e3634..ffb4579309075 100644 --- a/src/librustc_session/lint.rs +++ b/src/librustc_session/lint.rs @@ -85,6 +85,9 @@ pub struct Lint { pub future_incompatible: Option, pub is_plugin: bool, + + /// `Some` if this lint is feature gated, otherwise `None`. + pub feature_gate: Option, } /// Extra information for a future incompatibility lint. @@ -107,6 +110,7 @@ impl Lint { is_plugin: false, report_in_external_macro: false, future_incompatible: None, + feature_gate: None, } } @@ -276,7 +280,9 @@ macro_rules! declare_lint { ); ); ($vis: vis $NAME: ident, $Level: ident, $desc: expr, - $(@future_incompatible = $fi:expr;)? $($v:ident),*) => ( + $(@future_incompatible = $fi:expr;)? + $(@feature_gate = $gate:expr;)? + $($v:ident),*) => ( $vis static $NAME: &$crate::lint::Lint = &$crate::lint::Lint { name: stringify!($NAME), default_level: $crate::lint::$Level, @@ -285,6 +291,7 @@ macro_rules! declare_lint { is_plugin: false, $($v: true,)* $(future_incompatible: Some($fi),)* + $(feature_gate: Some($gate),)* ..$crate::lint::Lint::default_fields_for_macro() }; ); @@ -328,6 +335,7 @@ macro_rules! declare_tool_lint { report_in_external_macro: $external, future_incompatible: None, is_plugin: true, + feature_gate: None, }; ); } diff --git a/src/librustc_session/lint/builtin.rs b/src/librustc_session/lint/builtin.rs index 7112ac35b082b..bb0d6e1a47ead 100644 --- a/src/librustc_session/lint/builtin.rs +++ b/src/librustc_session/lint/builtin.rs @@ -7,6 +7,7 @@ use crate::lint::FutureIncompatibleInfo; use crate::{declare_lint, declare_lint_pass}; use rustc_span::edition::Edition; +use rustc_span::symbol::sym; declare_lint! { pub ILL_FORMED_ATTRIBUTE_INPUT, @@ -530,6 +531,7 @@ declare_lint! { pub UNSAFE_OP_IN_UNSAFE_FN, Allow, "unsafe operations in unsafe functions without an explicit unsafe block are deprecated", + @feature_gate = sym::unsafe_block_in_unsafe_fn; } declare_lint_pass! { diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 06293a987124e..1690b946bb625 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -225,11 +225,6 @@ where { let warnings_lint_name = lint::builtin::WARNINGS.name; - // Whitelist feature-gated lints to avoid feature errors when trying to - // allow all lints. - // FIXME(#72694): handle feature-gated lints properly. - let unsafe_op_in_unsafe_fn_name = rustc_lint::builtin::UNSAFE_OP_IN_UNSAFE_FN.name; - whitelisted_lints.push(warnings_lint_name.to_owned()); whitelisted_lints.extend(lint_opts.iter().map(|(lint, _)| lint).cloned()); @@ -241,7 +236,9 @@ where let lint_opts = lints() .filter_map(|lint| { - if lint.name == warnings_lint_name || lint.name == unsafe_op_in_unsafe_fn_name { + // Whitelist feature-gated lints to avoid feature errors when trying to + // allow all lints. + if lint.name == warnings_lint_name || lint.feature_gate.is_some() { None } else { filter_call(lint) diff --git a/src/libstd/net/addr.rs b/src/libstd/net/addr.rs index b780340884e1f..25897c502ec5e 100644 --- a/src/libstd/net/addr.rs +++ b/src/libstd/net/addr.rs @@ -1000,6 +1000,14 @@ impl ToSocketAddrs for (&str, u16) { } } +#[stable(feature = "string_u16_to_socket_addrs", since = "1.46.0")] +impl ToSocketAddrs for (String, u16) { + type Iter = vec::IntoIter; + fn to_socket_addrs(&self) -> io::Result> { + (&*self.0, self.1).to_socket_addrs() + } +} + // accepts strings like 'localhost:12345' #[stable(feature = "rust1", since = "1.0.0")] impl ToSocketAddrs for str { diff --git a/src/test/codegen/abi-main-signature-16bit-c-int.rs b/src/test/codegen/abi-main-signature-16bit-c-int.rs index d7b8c48c33e98..4ed491dfb2b43 100644 --- a/src/test/codegen/abi-main-signature-16bit-c-int.rs +++ b/src/test/codegen/abi-main-signature-16bit-c-int.rs @@ -10,6 +10,7 @@ // ignore-mips64 // ignore-powerpc // ignore-powerpc64 +// ignore-riscv64 // ignore-s390x // ignore-sparc // ignore-sparc64 diff --git a/src/test/codegen/abi-sysv64.rs b/src/test/codegen/abi-sysv64.rs index 6456ad47615e8..89c9bcee052fb 100644 --- a/src/test/codegen/abi-sysv64.rs +++ b/src/test/codegen/abi-sysv64.rs @@ -4,6 +4,7 @@ // ignore-arm // ignore-aarch64 +// ignore-riscv64 sysv64 not supported // compile-flags: -C no-prepopulate-passes diff --git a/src/test/codegen/abi-x86-interrupt.rs b/src/test/codegen/abi-x86-interrupt.rs index db215860f206b..25c155c949dcd 100644 --- a/src/test/codegen/abi-x86-interrupt.rs +++ b/src/test/codegen/abi-x86-interrupt.rs @@ -4,6 +4,7 @@ // ignore-arm // ignore-aarch64 +// ignore-riscv64 x86-interrupt is not supported // compile-flags: -C no-prepopulate-passes diff --git a/src/test/codegen/call-llvm-intrinsics.rs b/src/test/codegen/call-llvm-intrinsics.rs index c7a464a9b0ef2..24e3d3cd64b58 100644 --- a/src/test/codegen/call-llvm-intrinsics.rs +++ b/src/test/codegen/call-llvm-intrinsics.rs @@ -1,5 +1,7 @@ // compile-flags: -C no-prepopulate-passes +// ignore-riscv64 + #![feature(link_llvm_intrinsics)] #![crate_type = "lib"] diff --git a/src/test/codegen/catch-unwind.rs b/src/test/codegen/catch-unwind.rs index 3c9bc35d1c8bd..7ff9c0d15e003 100644 --- a/src/test/codegen/catch-unwind.rs +++ b/src/test/codegen/catch-unwind.rs @@ -1,5 +1,14 @@ // compile-flags: -O +// On x86 the closure is inlined in foo() producting something like +// define i32 @foo() [...] { +// tail call void @bar() [...] +// ret i32 0 +// } +// On riscv the closure is another function, placed before fn foo so CHECK can't +// find it +// ignore-riscv64 FIXME + #![crate_type = "lib"] extern "C" { diff --git a/src/test/codegen/fastcall-inreg.rs b/src/test/codegen/fastcall-inreg.rs index f67487c83ba23..adbeae454494a 100644 --- a/src/test/codegen/fastcall-inreg.rs +++ b/src/test/codegen/fastcall-inreg.rs @@ -17,6 +17,7 @@ // ignore-powerpc64le // ignore-powerpc // ignore-r600 +// ignore-riscv64 // ignore-amdgcn // ignore-sparc // ignore-sparc64 diff --git a/src/test/codegen/repr-transparent-aggregates-1.rs b/src/test/codegen/repr-transparent-aggregates-1.rs index 018a7ba4756a9..c23c57c8c5900 100644 --- a/src/test/codegen/repr-transparent-aggregates-1.rs +++ b/src/test/codegen/repr-transparent-aggregates-1.rs @@ -7,6 +7,7 @@ // ignore-mips64 // ignore-powerpc // ignore-powerpc64 +// ignore-riscv64 see codegen/riscv-abi // ignore-windows // See repr-transparent.rs diff --git a/src/test/codegen/repr-transparent-aggregates-2.rs b/src/test/codegen/repr-transparent-aggregates-2.rs index 5669858672074..07e5af11f3577 100644 --- a/src/test/codegen/repr-transparent-aggregates-2.rs +++ b/src/test/codegen/repr-transparent-aggregates-2.rs @@ -6,6 +6,7 @@ // ignore-powerpc // ignore-powerpc64 // ignore-powerpc64le +// ignore-riscv64 see codegen/riscv-abi // ignore-s390x // ignore-sparc // ignore-sparc64 diff --git a/src/test/codegen/repr-transparent.rs b/src/test/codegen/repr-transparent.rs index 49fd015624ace..7647e0198769c 100644 --- a/src/test/codegen/repr-transparent.rs +++ b/src/test/codegen/repr-transparent.rs @@ -1,5 +1,8 @@ // compile-flags: -C no-prepopulate-passes +// ignore-riscv64 riscv64 has an i128 type used with test_Vector +// see codegen/riscv-abi for riscv functiona call tests + #![crate_type="lib"] #![feature(repr_simd, transparent_unions)] diff --git a/src/test/codegen/riscv-abi/call-llvm-intrinsics.rs b/src/test/codegen/riscv-abi/call-llvm-intrinsics.rs new file mode 100644 index 0000000000000..f100a23a31897 --- /dev/null +++ b/src/test/codegen/riscv-abi/call-llvm-intrinsics.rs @@ -0,0 +1,30 @@ +// compile-flags: -C no-prepopulate-passes + +// only-riscv64 + +#![feature(link_llvm_intrinsics)] +#![crate_type = "lib"] + +struct A; + +impl Drop for A { + fn drop(&mut self) { + println!("A"); + } +} + +extern { + #[link_name = "llvm.sqrt.f32"] + fn sqrt(x: f32) -> f32; +} + +pub fn do_call() { + let _a = A; + + unsafe { + // Ensure that we `call` LLVM intrinsics instead of trying to `invoke` them + // CHECK: store float 4.000000e+00, float* %{{.}}, align 4 + // CHECK: call float @llvm.sqrt.f32(float %{{.}} + sqrt(4.0); + } +} diff --git a/src/test/codegen/riscv-abi/riscv64-lp64-lp64f-lp64d-abi.rs b/src/test/codegen/riscv-abi/riscv64-lp64-lp64f-lp64d-abi.rs index f0f052fe5c557..180ba07764b61 100644 --- a/src/test/codegen/riscv-abi/riscv64-lp64-lp64f-lp64d-abi.rs +++ b/src/test/codegen/riscv-abi/riscv64-lp64-lp64f-lp64d-abi.rs @@ -39,12 +39,12 @@ pub extern "C" fn f_scalar_4(x: i64) -> i64 { x } -// CHECK: define float @f_fp_scalar_1(float) +// CHECK: define float @f_fp_scalar_1(float %0) #[no_mangle] pub extern "C" fn f_fp_scalar_1(x: f32) -> f32 { x } -// CHECK: define double @f_fp_scalar_2(double) +// CHECK: define double @f_fp_scalar_2(double %0) #[no_mangle] pub extern "C" fn f_fp_scalar_2(x: f64) -> f64 { x @@ -67,7 +67,7 @@ pub struct Tiny { d: u16, } -// CHECK: define void @f_agg_tiny(i64) +// CHECK: define void @f_agg_tiny(i64 %0) #[no_mangle] pub extern "C" fn f_agg_tiny(mut e: Tiny) { e.a += e.b; @@ -86,7 +86,7 @@ pub struct Small { b: *mut i64, } -// CHECK: define void @f_agg_small([2 x i64]) +// CHECK: define void @f_agg_small([2 x i64] %0) #[no_mangle] pub extern "C" fn f_agg_small(mut x: Small) { x.a += unsafe { *x.b }; @@ -104,7 +104,7 @@ pub struct SmallAligned { a: i128, } -// CHECK: define void @f_agg_small_aligned(i128) +// CHECK: define void @f_agg_small_aligned(i128 %0) #[no_mangle] pub extern "C" fn f_agg_small_aligned(mut x: SmallAligned) { x.a += x.a; @@ -130,7 +130,7 @@ pub extern "C" fn f_agg_large_ret(i: i32, j: i8) -> Large { Large { a: 1, b: 2, c: 3, d: 4 } } -// CHECK: define void @f_scalar_stack_1(i64, [2 x i64], i128, %Large* {{.*}}%d, i8 zeroext %e, i8 signext %f, i8 %g, i8 %h) +// CHECK: define void @f_scalar_stack_1(i64 %0, [2 x i64] %1, i128 %2, %Large* {{.*}}%d, i8 zeroext %e, i8 signext %f, i8 %g, i8 %h) #[no_mangle] pub extern "C" fn f_scalar_stack_1( a: Tiny, @@ -144,7 +144,7 @@ pub extern "C" fn f_scalar_stack_1( ) { } -// CHECK: define void @f_scalar_stack_2(%Large* {{.*}}sret{{.*}}, i64 %a, i128, i128, i64 %d, i8 zeroext %e, i8 %f, i8 %g) +// CHECK: define void @f_scalar_stack_2(%Large* {{.*}}sret{{.*}} %0, i64 %a, i128 %1, i128 %2, i64 %d, i8 zeroext %e, i8 %f, i8 %g) #[no_mangle] pub extern "C" fn f_scalar_stack_2( a: u64, diff --git a/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs b/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs index 66a3b9e4952a9..0b6e1878d4d3e 100644 --- a/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs +++ b/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs @@ -4,7 +4,7 @@ // only-linux #![crate_type = "lib"] -// CHECK: define void @f_fpr_tracking(double, double, double, double, double, double, double, double, i8 zeroext %i) +// CHECK: define void @f_fpr_tracking(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, i8 zeroext %i) #[no_mangle] pub extern "C" fn f_fpr_tracking( a: f64, @@ -36,7 +36,7 @@ pub struct DoubleFloat { g: f32, } -// CHECK: define void @f_double_s_arg(double) +// CHECK: define void @f_double_s_arg(double %0) #[no_mangle] pub extern "C" fn f_double_s_arg(a: Double) {} @@ -46,7 +46,7 @@ pub extern "C" fn f_ret_double_s() -> Double { Double { f: 1. } } -// CHECK: define void @f_double_double_s_arg({ double, double }) +// CHECK: define void @f_double_double_s_arg({ double, double } %0) #[no_mangle] pub extern "C" fn f_double_double_s_arg(a: DoubleDouble) {} @@ -56,7 +56,7 @@ pub extern "C" fn f_ret_double_double_s() -> DoubleDouble { DoubleDouble { f: 1., g: 2. } } -// CHECK: define void @f_double_float_s_arg({ double, float }) +// CHECK: define void @f_double_float_s_arg({ double, float } %0) #[no_mangle] pub extern "C" fn f_double_float_s_arg(a: DoubleFloat) {} @@ -66,7 +66,7 @@ pub extern "C" fn f_ret_double_float_s() -> DoubleFloat { DoubleFloat { f: 1., g: 2. } } -// CHECK: define void @f_double_double_s_arg_insufficient_fprs(double, double, double, double, double, double, double, [2 x i64]) +// CHECK: define void @f_double_double_s_arg_insufficient_fprs(double %0, double %1, double %2, double %3, double %4, double %5, double %6, [2 x i64] %7) #[no_mangle] pub extern "C" fn f_double_double_s_arg_insufficient_fprs( a: f64, @@ -104,7 +104,7 @@ pub struct DoubleInt64 { i: i64, } -// CHECK: define void @f_double_int8_s_arg({ double, i8 }) +// CHECK: define void @f_double_int8_s_arg({ double, i8 } %0) #[no_mangle] pub extern "C" fn f_double_int8_s_arg(a: DoubleInt8) {} @@ -114,7 +114,7 @@ pub extern "C" fn f_ret_double_int8_s() -> DoubleInt8 { DoubleInt8 { f: 1., i: 2 } } -// CHECK: define void @f_double_int32_s_arg({ double, i32 }) +// CHECK: define void @f_double_int32_s_arg({ double, i32 } %0) #[no_mangle] pub extern "C" fn f_double_int32_s_arg(a: DoubleInt32) {} @@ -124,7 +124,7 @@ pub extern "C" fn f_ret_double_int32_s() -> DoubleInt32 { DoubleInt32 { f: 1., i: 2 } } -// CHECK: define void @f_double_uint8_s_arg({ double, i8 }) +// CHECK: define void @f_double_uint8_s_arg({ double, i8 } %0) #[no_mangle] pub extern "C" fn f_double_uint8_s_arg(a: DoubleUInt8) {} @@ -134,7 +134,7 @@ pub extern "C" fn f_ret_double_uint8_s() -> DoubleUInt8 { DoubleUInt8 { f: 1., i: 2 } } -// CHECK: define void @f_double_int64_s_arg({ double, i64 }) +// CHECK: define void @f_double_int64_s_arg({ double, i64 } %0) #[no_mangle] pub extern "C" fn f_double_int64_s_arg(a: DoubleInt64) {} @@ -144,7 +144,7 @@ pub extern "C" fn f_ret_double_int64_s() -> DoubleInt64 { DoubleInt64 { f: 1., i: 2 } } -// CHECK: define void @f_double_int8_s_arg_insufficient_gprs(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, [2 x i64]) +// CHECK: define void @f_double_int8_s_arg_insufficient_gprs(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, [2 x i64] %0) #[no_mangle] pub extern "C" fn f_double_int8_s_arg_insufficient_gprs( a: i32, @@ -159,7 +159,7 @@ pub extern "C" fn f_double_int8_s_arg_insufficient_gprs( ) { } -// CHECK: define void @f_struct_double_int8_insufficient_fprs(float, double, double, double, double, double, double, double, [2 x i64]) +// CHECK: define void @f_struct_double_int8_insufficient_fprs(float %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, [2 x i64] %8) #[no_mangle] pub extern "C" fn f_struct_double_int8_insufficient_fprs( a: f32, @@ -179,7 +179,7 @@ pub struct DoubleArr1 { a: [f64; 1], } -// CHECK: define void @f_doublearr1_s_arg(double) +// CHECK: define void @f_doublearr1_s_arg(double %0) #[no_mangle] pub extern "C" fn f_doublearr1_s_arg(a: DoubleArr1) {} @@ -194,7 +194,7 @@ pub struct DoubleArr2 { a: [f64; 2], } -// CHECK: define void @f_doublearr2_s_arg({ double, double }) +// CHECK: define void @f_doublearr2_s_arg({ double, double } %0) #[no_mangle] pub extern "C" fn f_doublearr2_s_arg(a: DoubleArr2) {} @@ -214,7 +214,7 @@ pub struct DoubleArr2Tricky1 { g: [Tricky1; 2], } -// CHECK: define void @f_doublearr2_tricky1_s_arg({ double, double }) +// CHECK: define void @f_doublearr2_tricky1_s_arg({ double, double } %0) #[no_mangle] pub extern "C" fn f_doublearr2_tricky1_s_arg(a: DoubleArr2Tricky1) {} @@ -233,7 +233,7 @@ pub struct DoubleArr2Tricky2 { g: [Tricky1; 2], } -// CHECK: define void @f_doublearr2_tricky2_s_arg({ double, double }) +// CHECK: define void @f_doublearr2_tricky2_s_arg({ double, double } %0) #[no_mangle] pub extern "C" fn f_doublearr2_tricky2_s_arg(a: DoubleArr2Tricky2) {} @@ -267,7 +267,7 @@ pub struct CharCharDouble { c: f64, } -// CHECK: define void @f_char_char_double_s_arg([2 x i64]) +// CHECK: define void @f_char_char_double_s_arg([2 x i64] %0) #[no_mangle] pub extern "C" fn f_char_char_double_s_arg(a: CharCharDouble) {} @@ -282,7 +282,7 @@ pub union DoubleU { a: f64, } -// CHECK: define void @f_double_u_arg(i64) +// CHECK: define void @f_double_u_arg(i64 %0) #[no_mangle] pub extern "C" fn f_double_u_arg(a: DoubleU) {} diff --git a/src/test/codegen/riscv-abi/riscv64-lp64f-lp64d-abi.rs b/src/test/codegen/riscv-abi/riscv64-lp64f-lp64d-abi.rs index d843331f425de..1cea6e3db2a84 100644 --- a/src/test/codegen/riscv-abi/riscv64-lp64f-lp64d-abi.rs +++ b/src/test/codegen/riscv-abi/riscv64-lp64f-lp64d-abi.rs @@ -4,7 +4,7 @@ // only-linux #![crate_type = "lib"] -// CHECK: define void @f_fpr_tracking(float, float, float, float, float, float, float, float, i8 zeroext %i) +// CHECK: define void @f_fpr_tracking(float %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, i8 zeroext %i) #[no_mangle] pub extern "C" fn f_fpr_tracking( a: f32, @@ -30,7 +30,7 @@ pub struct FloatFloat { g: f32, } -// CHECK: define void @f_float_s_arg(float) +// CHECK: define void @f_float_s_arg(float %0) #[no_mangle] pub extern "C" fn f_float_s_arg(a: Float) {} @@ -40,7 +40,7 @@ pub extern "C" fn f_ret_float_s() -> Float { Float { f: 1. } } -// CHECK: define void @f_float_float_s_arg({ float, float }) +// CHECK: define void @f_float_float_s_arg({ float, float } %0) #[no_mangle] pub extern "C" fn f_float_float_s_arg(a: FloatFloat) {} @@ -50,7 +50,7 @@ pub extern "C" fn f_ret_float_float_s() -> FloatFloat { FloatFloat { f: 1., g: 2. } } -// CHECK: define void @f_float_float_s_arg_insufficient_fprs(float, float, float, float, float, float, float, i64) +// CHECK: define void @f_float_float_s_arg_insufficient_fprs(float %0, float %1, float %2, float %3, float %4, float %5, float %6, i64 %7) #[no_mangle] pub extern "C" fn f_float_float_s_arg_insufficient_fprs( a: f32, @@ -88,7 +88,7 @@ pub struct FloatInt64 { i: i64, } -// CHECK: define void @f_float_int8_s_arg({ float, i8 }) +// CHECK: define void @f_float_int8_s_arg({ float, i8 } %0) #[no_mangle] pub extern "C" fn f_float_int8_s_arg(a: FloatInt8) {} @@ -98,7 +98,7 @@ pub extern "C" fn f_ret_float_int8_s() -> FloatInt8 { FloatInt8 { f: 1., i: 2 } } -// CHECK: define void @f_float_int32_s_arg({ float, i32 }) +// CHECK: define void @f_float_int32_s_arg({ float, i32 } %0) #[no_mangle] pub extern "C" fn f_float_int32_s_arg(a: FloatInt32) {} @@ -108,7 +108,7 @@ pub extern "C" fn f_ret_float_int32_s() -> FloatInt32 { FloatInt32 { f: 1., i: 2 } } -// CHECK: define void @f_float_uint8_s_arg({ float, i8 }) +// CHECK: define void @f_float_uint8_s_arg({ float, i8 } %0) #[no_mangle] pub extern "C" fn f_float_uint8_s_arg(a: FloatUInt8) {} @@ -118,7 +118,7 @@ pub extern "C" fn f_ret_float_uint8_s() -> FloatUInt8 { FloatUInt8 { f: 1., i: 2 } } -// CHECK: define void @f_float_int64_s_arg({ float, i64 }) +// CHECK: define void @f_float_int64_s_arg({ float, i64 } %0) #[no_mangle] pub extern "C" fn f_float_int64_s_arg(a: FloatInt64) {} @@ -128,7 +128,7 @@ pub extern "C" fn f_ret_float_int64_s() -> FloatInt64 { FloatInt64 { f: 1., i: 2 } } -// CHECK: define void @f_float_int8_s_arg_insufficient_gprs(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, i64) +// CHECK: define void @f_float_int8_s_arg_insufficient_gprs(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, i64 %0) #[no_mangle] pub extern "C" fn f_float_int8_s_arg_insufficient_gprs( a: i32, @@ -143,7 +143,7 @@ pub extern "C" fn f_float_int8_s_arg_insufficient_gprs( ) { } -// CHECK: define void @f_struct_float_int8_insufficient_fprs(float, float, float, float, float, float, float, float, i64) +// CHECK: define void @f_struct_float_int8_insufficient_fprs(float %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, i64 %8) #[no_mangle] pub extern "C" fn f_struct_float_int8_insufficient_fprs( a: f32, @@ -163,7 +163,7 @@ pub struct FloatArr1 { a: [f32; 1], } -// CHECK: define void @f_floatarr1_s_arg(float) +// CHECK: define void @f_floatarr1_s_arg(float %0) #[no_mangle] pub extern "C" fn f_floatarr1_s_arg(a: FloatArr1) {} @@ -178,7 +178,7 @@ pub struct FloatArr2 { a: [f32; 2], } -// CHECK: define void @f_floatarr2_s_arg({ float, float }) +// CHECK: define void @f_floatarr2_s_arg({ float, float } %0) #[no_mangle] pub extern "C" fn f_floatarr2_s_arg(a: FloatArr2) {} @@ -198,7 +198,7 @@ pub struct FloatArr2Tricky1 { g: [Tricky1; 2], } -// CHECK: define void @f_floatarr2_tricky1_s_arg({ float, float }) +// CHECK: define void @f_floatarr2_tricky1_s_arg({ float, float } %0) #[no_mangle] pub extern "C" fn f_floatarr2_tricky1_s_arg(a: FloatArr2Tricky1) {} @@ -217,7 +217,7 @@ pub struct FloatArr2Tricky2 { g: [Tricky1; 2], } -// CHECK: define void @f_floatarr2_tricky2_s_arg({ float, float }) +// CHECK: define void @f_floatarr2_tricky2_s_arg({ float, float } %0) #[no_mangle] pub extern "C" fn f_floatarr2_tricky2_s_arg(a: FloatArr2Tricky2) {} @@ -234,7 +234,7 @@ pub struct IntFloatInt { c: i32, } -// CHECK: define void @f_int_float_int_s_arg([2 x i64]) +// CHECK: define void @f_int_float_int_s_arg([2 x i64] %0) #[no_mangle] pub extern "C" fn f_int_float_int_s_arg(a: IntFloatInt) {} @@ -251,7 +251,7 @@ pub struct CharCharFloat { c: f32, } -// CHECK: define void @f_char_char_float_s_arg(i64) +// CHECK: define void @f_char_char_float_s_arg(i64 %0) #[no_mangle] pub extern "C" fn f_char_char_float_s_arg(a: CharCharFloat) {} @@ -266,7 +266,7 @@ pub union FloatU { a: f32, } -// CHECK: define void @f_float_u_arg(i64) +// CHECK: define void @f_float_u_arg(i64 %0) #[no_mangle] pub extern "C" fn f_float_u_arg(a: FloatU) {} diff --git a/src/test/codegen/stack-probes.rs b/src/test/codegen/stack-probes.rs index b8ebf338cbf97..3e3222d4735ad 100644 --- a/src/test/codegen/stack-probes.rs +++ b/src/test/codegen/stack-probes.rs @@ -5,6 +5,7 @@ // ignore-powerpc // ignore-powerpc64 // ignore-powerpc64le +// ignore-riscv64 // ignore-s390x // ignore-sparc // ignore-sparc64 diff --git a/src/test/codegen/x86_mmx.rs b/src/test/codegen/x86_mmx.rs index a08ba3617403f..9a58ef1c37a80 100644 --- a/src/test/codegen/x86_mmx.rs +++ b/src/test/codegen/x86_mmx.rs @@ -6,6 +6,7 @@ // ignore-powerpc // ignore-powerpc64 // ignore-powerpc64le +// ignore-riscv64 // ignore-sparc // ignore-sparc64 // ignore-s390x diff --git a/src/test/run-make-fulldeps/incr-add-rust-src-component/Makefile b/src/test/run-make-fulldeps/incr-add-rust-src-component/Makefile new file mode 100644 index 0000000000000..50ff3dd56ce92 --- /dev/null +++ b/src/test/run-make-fulldeps/incr-add-rust-src-component/Makefile @@ -0,0 +1,44 @@ +-include ../tools.mk + +# rust-lang/rust#70924: Test that if we add rust-src component in between two +# incremetnal compiles, the compiler does not ICE on the second. + +# This test uses `ln -s` rather than copying to save testing time, but its +# usage doesn't work on windows. So ignore windows. + +# ignore-windows + +SYSROOT:=$(shell $(RUSTC) --print sysroot) +FAKEROOT=$(TMPDIR)/fakeroot +INCR=$(TMPDIR)/incr + +# Make a local copy of the sysroot; then remove the rust-src part of it, if +# present, for the *first* build. Then put in a facsimile of the rust-src +# component for the second build, in order to expose the ICE from issue #70924. +# +# Note that it is much easier to just do `cp -a $(SYSROOT)/* $(FAKEROOT)` as a +# first step, but I am concerned that would be too expensive in a unit test +# compared to making symbolic links. +# +# Anyway, the pattern you'll see here is: For every prefix in +# root/lib/rustlib/src, link all of prefix parent content, then remove the +# prefix, then loop on the next prefix. This way, we basically create a copy of +# the context around root/lib/rustlib/src, and can freely add/remove the src +# component itself. +all: + mkdir $(FAKEROOT) + ln -s $(SYSROOT)/* $(FAKEROOT) + rm -f $(FAKEROOT)/lib + mkdir $(FAKEROOT)/lib + ln -s $(SYSROOT)/lib/* $(FAKEROOT)/lib + rm -f $(FAKEROOT)/lib/rustlib + mkdir $(FAKEROOT)/lib/rustlib + ln -s $(SYSROOT)/lib/rustlib/* $(FAKEROOT)/lib/rustlib + rm -f $(FAKEROOT)/lib/rustlib/src + mkdir $(FAKEROOT)/lib/rustlib/src + ln -s $(SYSROOT)/lib/rustlib/src/* $(FAKEROOT)/lib/rustlib/src + rm -f $(FAKEROOT)/lib/rustlib/src/rust + $(RUSTC) --sysroot $(FAKEROOT) -C incremental=$(INCR) main.rs + mkdir -p $(FAKEROOT)/lib/rustlib/src/rust/src/libstd + touch $(FAKEROOT)/lib/rustlib/src/rust/src/libstd/lib.rs + $(RUSTC) --sysroot $(FAKEROOT) -C incremental=$(INCR) main.rs diff --git a/src/test/run-make-fulldeps/incr-add-rust-src-component/main.rs b/src/test/run-make-fulldeps/incr-add-rust-src-component/main.rs new file mode 100644 index 0000000000000..f6320bcb04aa8 --- /dev/null +++ b/src/test/run-make-fulldeps/incr-add-rust-src-component/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello World"); +} diff --git a/src/test/ui/save-analysis/issue-73020.rs b/src/test/ui/save-analysis/issue-73020.rs new file mode 100644 index 0000000000000..87ce0933681c5 --- /dev/null +++ b/src/test/ui/save-analysis/issue-73020.rs @@ -0,0 +1,5 @@ +// compile-flags: -Zsave-analysis +use {self}; //~ ERROR E0431 + +fn main () { +} diff --git a/src/test/ui/save-analysis/issue-73020.stderr b/src/test/ui/save-analysis/issue-73020.stderr new file mode 100644 index 0000000000000..5bb3aae99975c --- /dev/null +++ b/src/test/ui/save-analysis/issue-73020.stderr @@ -0,0 +1,9 @@ +error[E0431]: `self` import can only appear in an import list with a non-empty prefix + --> $DIR/issue-73020.rs:2:6 + | +LL | use {self}; + | ^^^^ can only appear in an import list with a non-empty prefix + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0431`. diff --git a/src/test/ui/save-analysis/issue-73022.rs b/src/test/ui/save-analysis/issue-73022.rs new file mode 100644 index 0000000000000..9ad89a319ba3b --- /dev/null +++ b/src/test/ui/save-analysis/issue-73022.rs @@ -0,0 +1,13 @@ +// build-pass +// compile-flags: -Zsave-analysis +enum Enum2 { + Variant8 { _field: bool }, +} + +impl Enum2 { + fn new_variant8() -> Enum2 { + Self::Variant8 { _field: true } + } +} + +fn main() {}