Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
6fb7d53
Check if dropping an expression may have indirect side-effects
samueltardieu Apr 11, 2025
d39600e
Skip inner ordering checking in presence of `#[repr(…)]`
samueltardieu Apr 14, 2025
b735dce
docs: Specify that common sort functions sort in an ascending direction
Natr1x Apr 30, 2025
4de5b27
`empty_struct_with_brackets`: do not lint macro code
samueltardieu Apr 15, 2025
a25c195
Remove redundant work in `trait_ref_of_method`.
Jarcho Apr 28, 2025
77157f5
Actually check for a problematic line comment in `with_leading_whites…
Jarcho Apr 28, 2025
82f8b1c
Do not pretend that `return` is not significant
samueltardieu May 8, 2025
a867981
Add new `useless_concat` lint
GuillaumeGomez Dec 14, 2024
126fb00
Add ui test for `useless_concat` lint
GuillaumeGomez Dec 14, 2024
7b06d2b
Move `concat` macro path into `clippy_utils::paths`
GuillaumeGomez Dec 29, 2024
73a19a0
Make lint span smaller for needless return
barun511 May 12, 2025
0d25090
Improve code and apply suggestions
GuillaumeGomez May 2, 2025
4ec2193
Fix size computation when element is a slice
samueltardieu May 14, 2025
fe4b4e8
`mem::size_of_val` is const-stable since Rust 1.85
samueltardieu May 14, 2025
f6e95a5
Fix false positive of `useless_conversion` when using `into_iter()`
relaxcn May 14, 2025
34c6ba7
comparison_chain: do not lint on 2 blocks expression
manoj23 May 15, 2025
93bd4d8
Merge commit '0450db33a5d8587f7c1d4b6d233dac963605766b' into clippy-s…
flip1995 May 15, 2025
a1931dd
`unnecessary_wraps`: do not include the whole body in the lint span
samueltardieu May 10, 2025
e0fd814
Fix tests
barun511 May 15, 2025
ff5e626
Fix false positive of `useless_conversion` when using `.into_iter().a…
llogiq May 16, 2025
95d7eda
comparison_chain: do not lint on 2 blocks expression (#14811)
llogiq May 16, 2025
57782e0
Rewrite `non_copy_const`
Jarcho Aug 3, 2024
7c41ec7
Reword `declare_interior_mutable_const` and
Jarcho Aug 7, 2024
318ba60
Rewrite tests for `declare_interior_mutable_const` and
Jarcho Aug 3, 2024
44681fd
Improve `cargo dev rename_lint`
Jarcho Apr 16, 2025
b3f4902
clippy_dev: order `deprecated_lints.rs` in `update_lints`
Jarcho Apr 16, 2025
13b070e
clippy_dev: Fix previous renames in `rename_lint`
Jarcho Apr 16, 2025
27acbf2
Reenable linting on UFCS `deref` calls.
Jarcho May 15, 2025
39ab00a
`match_same_arms`, `ifs_same_cond`: lint once per same arm/condition
Alexendoo Apr 16, 2025
feb70b5
`match_same_arms`, `ifs_same_cond`: lint once per same arm/condition …
samueltardieu May 16, 2025
5239b7f
`unnecessary_wraps`: do not include the whole body in the lint span (…
blyxyas May 16, 2025
5cb7e40
Reenable linting on UFCS `deref` calls (#14808)
llogiq May 16, 2025
94cfebb
Rewrite `non_copy_const` (#13207)
llogiq May 16, 2025
604b7b0
Extend `cargo dev rename_lint` (#14633)
samueltardieu May 16, 2025
dcd8bb6
Skip inner ordering checking in presence of `#[repr(…)]` (#14610)
samueltardieu May 16, 2025
e666b83
excessive_precision: Fix false positive when exponent has leading zero
HackAttack May 17, 2025
c97b476
excessive_precision: Fix false positive when exponent has leading zer…
samueltardieu May 17, 2025
9d47e0c
clippy_dev: remove the need for markers when bumping the version
Jarcho Apr 17, 2025
232be55
clippy_dev: refactor rustfmt calls
Jarcho Apr 17, 2025
9ebfb84
Refactor and speed up `cargo dev fmt` (#14638)
samueltardieu May 17, 2025
daeb6a1
Misc changes (#14702)
y21 May 17, 2025
da7b678
`empty_struct_with_brackets`: do not lint code coming from macro expa…
y21 May 17, 2025
b7caa1b
Do not call `TyCtxt::type_of()` on a trait
samueltardieu May 17, 2025
1e3fc3c
fix minor typo: toolcahin => toolchain
PLeVasseur May 18, 2025
15d47d7
Fixing minor typo in book (#14835)
samueltardieu May 18, 2025
618ccd7
Do not call `TyCtxt::type_of()` on a trait (#14830)
Alexendoo May 18, 2025
035146e
Remove rustc_attr_data_structures re-export from rustc_attr_parsing
mejrs May 18, 2025
19e967c
Add a reason to/remove some `//@no-rustfix` annotations
Alexendoo May 18, 2025
492c4e1
fix: `unnecessary_to_owned` FP when map key is a reference
profetia May 18, 2025
b03370b
Add a reason to/remove some `//@no-rustfix` annotations (#14839)
llogiq May 18, 2025
375c650
fix: `unnecessary_to_owned` FP when map key is a reference (#14834)
samueltardieu May 18, 2025
a22efe7
Rollup merge of #140874 - mejrs:rads, r=WaffleLapkin
Zalathar May 19, 2025
7123f2a
Docs: Use spaces in `good first issue` label
flip1995 May 19, 2025
d44e35d
Docs: Use spaces in `good first issue` label (#14844)
samueltardieu May 19, 2025
df33aaf
Check if dropping an expression may have indirect side-effects (#14594)
blyxyas May 19, 2025
ebc2a68
Add new `useless_concat` lint (#13829)
samueltardieu May 19, 2025
db42c7d
Remove obsolete restriction in code
samueltardieu May 19, 2025
e2b1de1
Access items through `rustc_session` instead of `rustc_lint_defs`
samueltardieu May 19, 2025
608f682
`cargo dev fmt`: format `clippy_lints_internal` as well
samueltardieu May 19, 2025
ac7c87e
Remove obsolete restriction in code (#14851)
samueltardieu May 19, 2025
e34e8ac
`cargo dev fmt`: format `clippy_lints_internal` as well (#14853)
Jarcho May 19, 2025
d4e7e5b
Access items through `rustc_session` instead of `rustc_lint_defs` (#1…
blyxyas May 19, 2025
bb724f3
Sort the existing list of symbols
samueltardieu May 18, 2025
82bf659
Ensure that symbols list stays sorted
samueltardieu May 18, 2025
e16801e
Use symbols instead of `&str` when possible
samueltardieu May 18, 2025
b87e90b
Use interned symbols instead of strings in more places (#14840)
Jarcho May 19, 2025
66697e8
`needless_match`: do not pretend that `return` is not significant in …
blyxyas May 19, 2025
8224956
Various macro fixes for loop lints
samueltardieu Apr 16, 2025
72a4e33
Fix ICE while computing type layout
samueltardieu May 18, 2025
6753e16
Fix ICE while computing type layout (#14837)
Jarcho May 19, 2025
f00c58b
Make lint span smaller for needless return (#14790)
Jarcho May 20, 2025
5687ed5
Various macro fixes for loop lints (#14631)
y21 May 20, 2025
03ba508
Fixes `manual_slice_size_computation` ICE and triggers in `const` con…
y21 May 20, 2025
910e640
Merge remote-tracking branch 'upstream/master' into rustup
flip1995 May 21, 2025
8a28b79
Bump nightly version -> 2025-05-21
flip1995 May 21, 2025
cadf98b
Rustup (#14860)
flip1995 May 21, 2025
a0c1ed3
Merge commit 'cadf98bb7d783e2ea3572446c3f80d3592ec5f86' into clippy-s…
flip1995 May 21, 2025
0e203f3
Update Cargo.lock
flip1995 May 21, 2025
d8a22a2
limit impls of `VaArgSafe` to just types that are actually safe
folkertdev May 21, 2025
5d9141c
fix better_any breakage by making the solver more unsound
lcnr May 21, 2025
46a5c91
std: fix doctest and explain for as_slices and as_mut_slices in VecDeque
xizheyin May 18, 2025
96ac571
Move -Zcrate-attr injection to just after crate root parsing
bjorn3 Feb 19, 2025
2a403dc
lower bodies' params to thir before the body's value
dianne May 21, 2025
f2d94c1
`unpretty=thir-tree`: don't require the final expr to be the entrypoint
dianne May 18, 2025
6d6259f
Document why we allow escaping bound vars in LTA norm
BoxyUwU May 21, 2025
bf64d66
Auto merge of #141343 - flip1995:clippy-subtree-update, r=Manishearth
bors May 21, 2025
d4b7915
Rollup merge of #140526 - Natr1x:sort-direction-documentation, r=dtolnay
matthiaskrgr May 21, 2025
b5edec2
Rollup merge of #141230 - xizheyin:issue-141217, r=tgross35
matthiaskrgr May 21, 2025
b9c6b33
Rollup merge of #141341 - folkertdev:limit-VaArgSafe-impls, r=working…
matthiaskrgr May 21, 2025
69b13e4
Rollup merge of #141347 - lcnr:lets-make-it-unsound-3, r=compiler-errors
matthiaskrgr May 21, 2025
eff339b
Rollup merge of #141351 - bjorn3:attr_handling_changes, r=Nadrieril
matthiaskrgr May 21, 2025
fea2e5c
Rollup merge of #141356 - dianne:thir-lower-params-before-body-expr, …
matthiaskrgr May 21, 2025
2663ea3
Rollup merge of #141357 - dianne:unhardcode-unpretty-thir-tree-body-e…
matthiaskrgr May 21, 2025
de4055f
Rollup merge of #141363 - BoxyUwU:doc_lta_norm_binders, r=lcnr
matthiaskrgr May 21, 2025
5df0f72
Auto merge of #141366 - matthiaskrgr:rollup-utvtyy3, r=matthiaskrgr
bors May 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -582,13 +582,11 @@ dependencies = [
name = "clippy_dev"
version = "0.0.1"
dependencies = [
"aho-corasick",
"chrono",
"clap",
"indoc",
"itertools",
"opener",
"shell-escape",
"walkdir",
]

Expand Down Expand Up @@ -4888,12 +4886,6 @@ dependencies = [
"lazy_static",
]

[[package]]
name = "shell-escape"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"

[[package]]
name = "shlex"
version = "1.3.0"
Expand Down
16 changes: 8 additions & 8 deletions compiler/rustc_interface/src/passes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ use crate::interface::Compiler;
use crate::{errors, limits, proc_macro_decls, util};

pub fn parse<'a>(sess: &'a Session) -> ast::Crate {
let krate = sess
let mut krate = sess
.time("parse_crate", || {
let mut parser = unwrap_or_emit_fatal(match &sess.io.input {
Input::File(file) => new_parser_from_file(&sess.psess, file, None),
Expand All @@ -64,6 +64,12 @@ pub fn parse<'a>(sess: &'a Session) -> ast::Crate {
input_stats::print_ast_stats(&krate, "PRE EXPANSION AST STATS", "ast-stats-1");
}

rustc_builtin_macros::cmdline_attrs::inject(
&mut krate,
&sess.psess,
&sess.opts.unstable_opts.crate_attr,
);

krate
}

Expand Down Expand Up @@ -805,17 +811,11 @@ pub static DEFAULT_QUERY_PROVIDERS: LazyLock<Providers> = LazyLock::new(|| {

pub fn create_and_enter_global_ctxt<T, F: for<'tcx> FnOnce(TyCtxt<'tcx>) -> T>(
compiler: &Compiler,
mut krate: rustc_ast::Crate,
krate: rustc_ast::Crate,
f: F,
) -> T {
let sess = &compiler.sess;

rustc_builtin_macros::cmdline_attrs::inject(
&mut krate,
&sess.psess,
&sess.opts.unstable_opts.crate_attr,
);

let pre_configured_attrs = rustc_expand::config::pre_configure_attrs(sess, &krate.attrs);

let crate_name = get_crate_name(sess, &pre_configured_attrs);
Expand Down
4 changes: 0 additions & 4 deletions compiler/rustc_mir_build/src/builder/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -450,10 +450,6 @@ fn construct_fn<'tcx>(
let span = tcx.def_span(fn_def);
let fn_id = tcx.local_def_id_to_hir_id(fn_def);

// The representation of thir for `-Zunpretty=thir-tree` relies on
// the entry expression being the last element of `thir.exprs`.
assert_eq!(expr.as_usize(), thir.exprs.len() - 1);

// Figure out what primary body this item has.
let body = tcx.hir_body_owned_by(fn_def);
let span_with_body = tcx.hir_span_with_body(fn_id);
Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_mir_build/src/thir/cx/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ pub(crate) fn thir_body(
if let Some(reported) = cx.typeck_results.tainted_by_errors {
return Err(reported);
}
let expr = cx.mirror_expr(body.value);

// Lower the params before the body's expression so errors from params are shown first.
let owner_id = tcx.local_def_id_to_hir_id(owner_def);
if let Some(fn_decl) = tcx.hir_fn_decl_by_hir_id(owner_id) {
let closure_env_param = cx.closure_env_param(owner_def, owner_id);
Expand All @@ -48,6 +48,7 @@ pub(crate) fn thir_body(
}
}

let expr = cx.mirror_expr(body.value);
Ok((tcx.alloc_steal_thir(cx.thir), expr))
}

Expand Down
9 changes: 4 additions & 5 deletions compiler/rustc_mir_build/src/thir/print.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ use rustc_span::def_id::LocalDefId;
/// Create a THIR tree for debugging.
pub fn thir_tree(tcx: TyCtxt<'_>, owner_def: LocalDefId) -> String {
match super::cx::thir_body(tcx, owner_def) {
Ok((thir, _)) => {
Ok((thir, expr)) => {
let thir = thir.steal();
let mut printer = ThirPrinter::new(&thir);
printer.print();
printer.print(expr);
printer.into_buffer()
}
Err(_) => "error".into(),
Expand Down Expand Up @@ -58,16 +58,15 @@ impl<'a, 'tcx> ThirPrinter<'a, 'tcx> {
}
}

fn print(&mut self) {
fn print(&mut self, body_expr: ExprId) {
print_indented!(self, "params: [", 0);
for param in self.thir.params.iter() {
self.print_param(param, 1);
}
print_indented!(self, "]", 0);

print_indented!(self, "body:", 0);
let expr = ExprId::from_usize(self.thir.exprs.len() - 1);
self.print_expr(expr, 1);
self.print_expr(body_expr, 1);
}

fn into_buffer(self) -> String {
Expand Down
44 changes: 42 additions & 2 deletions compiler/rustc_next_trait_solver/src/solve/trait_goals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ use rustc_type_ir::{
self as ty, Interner, Movability, TraitPredicate, TypeVisitableExt as _, TypingMode,
Upcast as _, elaborate,
};
use tracing::{instrument, trace};
use tracing::{debug, instrument, trace};

use crate::delegate::SolverDelegate;
use crate::solve::assembly::structural_traits::{self, AsyncCallableRelevantTypes};
use crate::solve::assembly::{self, AllowInferenceConstraints, AssembleCandidatesFrom, Candidate};
use crate::solve::inspect::ProbeKind;
use crate::solve::{
BuiltinImplSource, CandidateSource, Certainty, EvalCtxt, Goal, GoalSource, MaybeCause,
NoSolution, ParamEnvSource, QueryResult,
NoSolution, ParamEnvSource, QueryResult, has_only_region_constraints,
};

impl<D, I> assembly::GoalKind<D> for TraitPredicate<I>
Expand Down Expand Up @@ -1253,6 +1253,45 @@ where
D: SolverDelegate<Interner = I>,
I: Interner,
{
/// FIXME(#57893): For backwards compatability with the old trait solver implementation,
/// we need to handle overlap between builtin and user-written impls for trait objects.
///
/// This overlap is unsound in general and something which we intend to fix separately.
/// To avoid blocking the stabilization of the trait solver, we add this hack to avoid
/// breakage in cases which are *mostly fine*™. Importantly, this preference is strictly
/// weaker than the old behavior.
///
/// We only prefer builtin over user-written impls if there are no inference constraints.
/// Importantly, we also only prefer the builtin impls for trait goals, and not during
/// normalization. This means the only case where this special-case results in exploitable
/// unsoundness should be lifetime dependent user-written impls.
pub(super) fn unsound_prefer_builtin_dyn_impl(&mut self, candidates: &mut Vec<Candidate<I>>) {
match self.typing_mode() {
TypingMode::Coherence => return,
TypingMode::Analysis { .. }
| TypingMode::Borrowck { .. }
| TypingMode::PostBorrowckAnalysis { .. }
| TypingMode::PostAnalysis => {}
}

if candidates
.iter()
.find(|c| {
matches!(c.source, CandidateSource::BuiltinImpl(BuiltinImplSource::Object(_)))
})
.is_some_and(|c| has_only_region_constraints(c.result))
{
candidates.retain(|c| {
if matches!(c.source, CandidateSource::Impl(_)) {
debug!(?c, "unsoundly dropping impl in favor of builtin dyn-candidate");
false
} else {
true
}
});
}
}

#[instrument(level = "debug", skip(self), ret)]
pub(super) fn merge_trait_candidates(
&mut self,
Expand Down Expand Up @@ -1313,6 +1352,7 @@ where
}

self.filter_specialized_impls(AllowInferenceConstraints::No, &mut candidates);
self.unsound_prefer_builtin_dyn_impl(&mut candidates);

// If there are *only* global where bounds, then make sure to return that this
// is still reported as being proven-via the param-env so that rigid projections
Expand Down
17 changes: 13 additions & 4 deletions compiler/rustc_trait_selection/src/traits/normalize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,12 +299,21 @@ impl<'a, 'b, 'tcx> AssocTypeNormalizer<'a, 'b, 'tcx> {
);
}

// We don't replace bound vars in the generic arguments of the free alias with
// placeholders. This doesn't cause any issues as instantiating parameters with
// bound variables is special-cased to rewrite the debruijn index to be higher
// whenever we fold through a binder.
//
// However, we do replace any escaping bound vars in the resulting goals with
// placeholders as the trait solver does not expect to encounter escaping bound
// vars in obligations.
//
// FIXME(lazy_type_alias): Check how much this actually matters for perf before
// stabilization. This is a bit weird and generally not how we handle binders in
// the compiler so ideally we'd do the same boundvar->placeholder->boundvar dance
// that other kinds of normalization do.
let infcx = self.selcx.infcx;
self.obligations.extend(
// FIXME(BoxyUwU):
// FIXME(lazy_type_alias):
// It seems suspicious to instantiate the predicates with arguments that might be bound vars,
// we might wind up instantiating one of these bound vars underneath a hrtb.
infcx.tcx.predicates_of(free.def_id).instantiate_own(infcx.tcx, free.args).map(
|(mut predicate, span)| {
if free.has_escaping_bound_vars() {
Expand Down
33 changes: 28 additions & 5 deletions library/alloc/src/collections/vec_deque/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1312,6 +1312,8 @@ impl<T, A: Allocator> VecDeque<T, A> {
///
/// If [`make_contiguous`] was previously called, all elements of the
/// deque will be in the first slice and the second slice will be empty.
/// Otherwise, the exact split point depends on implementation details
/// and is not guaranteed.
///
/// [`make_contiguous`]: VecDeque::make_contiguous
///
Expand All @@ -1326,12 +1328,18 @@ impl<T, A: Allocator> VecDeque<T, A> {
/// deque.push_back(1);
/// deque.push_back(2);
///
/// assert_eq!(deque.as_slices(), (&[0, 1, 2][..], &[][..]));
/// let expected = [0, 1, 2];
/// let (front, back) = deque.as_slices();
/// assert_eq!(&expected[..front.len()], front);
/// assert_eq!(&expected[front.len()..], back);
///
/// deque.push_front(10);
/// deque.push_front(9);
///
/// assert_eq!(deque.as_slices(), (&[9, 10][..], &[0, 1, 2][..]));
/// let expected = [9, 10, 0, 1, 2];
/// let (front, back) = deque.as_slices();
/// assert_eq!(&expected[..front.len()], front);
/// assert_eq!(&expected[front.len()..], back);
/// ```
#[inline]
#[stable(feature = "deque_extras_15", since = "1.5.0")]
Expand All @@ -1347,6 +1355,8 @@ impl<T, A: Allocator> VecDeque<T, A> {
///
/// If [`make_contiguous`] was previously called, all elements of the
/// deque will be in the first slice and the second slice will be empty.
/// Otherwise, the exact split point depends on implementation details
/// and is not guaranteed.
///
/// [`make_contiguous`]: VecDeque::make_contiguous
///
Expand All @@ -1363,9 +1373,22 @@ impl<T, A: Allocator> VecDeque<T, A> {
/// deque.push_front(10);
/// deque.push_front(9);
///
/// deque.as_mut_slices().0[0] = 42;
/// deque.as_mut_slices().1[0] = 24;
/// assert_eq!(deque.as_slices(), (&[42, 10][..], &[24, 1][..]));
/// // Since the split point is not guaranteed, we may need to update
/// // either slice.
/// let mut update_nth = |index: usize, val: u32| {
/// let (front, back) = deque.as_mut_slices();
/// if index > front.len() - 1 {
/// back[index - front.len()] = val;
/// } else {
/// front[index] = val;
/// }
/// };
///
/// update_nth(0, 42);
/// update_nth(2, 24);
///
/// let v: Vec<_> = deque.into();
/// assert_eq!(v, [42, 10, 24, 1]);
/// ```
#[inline]
#[stable(feature = "deque_extras_15", since = "1.5.0")]
Expand Down
11 changes: 7 additions & 4 deletions library/alloc/src/slice.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ use crate::boxed::Box;
use crate::vec::Vec;

impl<T> [T] {
/// Sorts the slice, preserving initial order of equal elements.
/// Sorts the slice in ascending order, preserving initial order of equal elements.
///
/// This sort is stable (i.e., does not reorder equal elements) and *O*(*n* \* log(*n*))
/// worst-case.
Expand Down Expand Up @@ -137,7 +137,8 @@ impl<T> [T] {
stable_sort(self, T::lt);
}

/// Sorts the slice with a comparison function, preserving initial order of equal elements.
/// Sorts the slice in ascending order with a comparison function, preserving initial order of
/// equal elements.
///
/// This sort is stable (i.e., does not reorder equal elements) and *O*(*n* \* log(*n*))
/// worst-case.
Expand Down Expand Up @@ -197,7 +198,8 @@ impl<T> [T] {
stable_sort(self, |a, b| compare(a, b) == Less);
}

/// Sorts the slice with a key extraction function, preserving initial order of equal elements.
/// Sorts the slice in ascending order with a key extraction function, preserving initial order
/// of equal elements.
///
/// This sort is stable (i.e., does not reorder equal elements) and *O*(*m* \* *n* \* log(*n*))
/// worst-case, where the key function is *O*(*m*).
Expand Down Expand Up @@ -252,7 +254,8 @@ impl<T> [T] {
stable_sort(self, |a, b| f(a).lt(&f(b)));
}

/// Sorts the slice with a key extraction function, preserving initial order of equal elements.
/// Sorts the slice in ascending order with a key extraction function, preserving initial order
/// of equal elements.
///
/// This sort is stable (i.e., does not reorder equal elements) and *O*(*m* \* *n* + *n* \*
/// log(*n*)) worst-case, where the key function is *O*(*m*).
Expand Down
2 changes: 1 addition & 1 deletion library/core/src/ffi/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ pub mod c_str;
issue = "44930",
reason = "the `c_variadic` feature has not been properly tested on all supported platforms"
)]
pub use self::va_list::{VaList, VaListImpl};
pub use self::va_list::{VaArgSafe, VaList, VaListImpl};

#[unstable(
feature = "c_variadic",
Expand Down
Loading