Auto merge of #90037 - matthiaskrgr:rollup-cdfhxtn, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #89766 (RustWrapper: adapt for an LLVM API change) - #89867 (Fix macro_rules! duplication when reexported in the same module) - #89941 (removing TLS support in x86_64-unknown-none-hermitkernel) - #89956 (Suggest a case insensitive match name regardless of levenshtein distance) - #89988 (Do not promote values with const drop that need to be dropped) - #89997 (Add test for issue #84957 - `str.as_bytes()` in a `const` expression) - #90002 (⬆️ rust-analyzer) - #90034 (Tiny tweak to Iterator::unzip() doc comment example.) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
2f22e63cc4
@ -22,7 +22,7 @@ use std::mem;
|
||||
use std::ops::Deref;
|
||||
|
||||
use super::ops::{self, NonConstOp, Status};
|
||||
use super::qualifs::{self, CustomEq, HasMutInterior, NeedsNonConstDrop};
|
||||
use super::qualifs::{self, CustomEq, HasMutInterior, NeedsDrop, NeedsNonConstDrop};
|
||||
use super::resolver::FlowSensitiveAnalysis;
|
||||
use super::{is_lang_panic_fn, is_lang_special_const_fn, ConstCx, Qualif};
|
||||
use crate::const_eval::is_unstable_const_fn;
|
||||
@ -39,7 +39,8 @@ type QualifResults<'mir, 'tcx, Q> =
|
||||
#[derive(Default)]
|
||||
pub struct Qualifs<'mir, 'tcx> {
|
||||
has_mut_interior: Option<QualifResults<'mir, 'tcx, HasMutInterior>>,
|
||||
needs_drop: Option<QualifResults<'mir, 'tcx, NeedsNonConstDrop>>,
|
||||
needs_drop: Option<QualifResults<'mir, 'tcx, NeedsDrop>>,
|
||||
needs_non_const_drop: Option<QualifResults<'mir, 'tcx, NeedsNonConstDrop>>,
|
||||
indirectly_mutable: Option<IndirectlyMutableResults<'mir, 'tcx>>,
|
||||
}
|
||||
|
||||
@ -80,21 +81,48 @@ impl Qualifs<'mir, 'tcx> {
|
||||
location: Location,
|
||||
) -> bool {
|
||||
let ty = ccx.body.local_decls[local].ty;
|
||||
if !NeedsNonConstDrop::in_any_value_of_ty(ccx, ty) {
|
||||
if !NeedsDrop::in_any_value_of_ty(ccx, ty) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let needs_drop = self.needs_drop.get_or_insert_with(|| {
|
||||
let ConstCx { tcx, body, .. } = *ccx;
|
||||
|
||||
FlowSensitiveAnalysis::new(NeedsDrop, ccx)
|
||||
.into_engine(tcx, &body)
|
||||
.iterate_to_fixpoint()
|
||||
.into_results_cursor(&body)
|
||||
});
|
||||
|
||||
needs_drop.seek_before_primary_effect(location);
|
||||
needs_drop.get().contains(local) || self.indirectly_mutable(ccx, local, location)
|
||||
}
|
||||
|
||||
/// Returns `true` if `local` is `NeedsNonConstDrop` at the given `Location`.
|
||||
///
|
||||
/// Only updates the cursor if absolutely necessary
|
||||
pub fn needs_non_const_drop(
|
||||
&mut self,
|
||||
ccx: &'mir ConstCx<'mir, 'tcx>,
|
||||
local: Local,
|
||||
location: Location,
|
||||
) -> bool {
|
||||
let ty = ccx.body.local_decls[local].ty;
|
||||
if !NeedsNonConstDrop::in_any_value_of_ty(ccx, ty) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let needs_non_const_drop = self.needs_non_const_drop.get_or_insert_with(|| {
|
||||
let ConstCx { tcx, body, .. } = *ccx;
|
||||
|
||||
FlowSensitiveAnalysis::new(NeedsNonConstDrop, ccx)
|
||||
.into_engine(tcx, &body)
|
||||
.iterate_to_fixpoint()
|
||||
.into_results_cursor(&body)
|
||||
});
|
||||
|
||||
needs_drop.seek_before_primary_effect(location);
|
||||
needs_drop.get().contains(local) || self.indirectly_mutable(ccx, local, location)
|
||||
needs_non_const_drop.seek_before_primary_effect(location);
|
||||
needs_non_const_drop.get().contains(local) || self.indirectly_mutable(ccx, local, location)
|
||||
}
|
||||
|
||||
/// Returns `true` if `local` is `HasMutInterior` at the given `Location`.
|
||||
@ -173,6 +201,7 @@ impl Qualifs<'mir, 'tcx> {
|
||||
|
||||
ConstQualifs {
|
||||
needs_drop: self.needs_drop(ccx, RETURN_PLACE, return_loc),
|
||||
needs_non_const_drop: self.needs_non_const_drop(ccx, RETURN_PLACE, return_loc),
|
||||
has_mut_interior: self.has_mut_interior(ccx, RETURN_PLACE, return_loc),
|
||||
custom_eq,
|
||||
error_occured,
|
||||
@ -999,7 +1028,7 @@ impl Visitor<'tcx> for Checker<'mir, 'tcx> {
|
||||
}
|
||||
|
||||
// Forbid all `Drop` terminators unless the place being dropped is a local with no
|
||||
// projections that cannot be `NeedsDrop`.
|
||||
// projections that cannot be `NeedsNonConstDrop`.
|
||||
TerminatorKind::Drop { place: dropped_place, .. }
|
||||
| TerminatorKind::DropAndReplace { place: dropped_place, .. } => {
|
||||
// If we are checking live drops after drop-elaboration, don't emit duplicate
|
||||
@ -1019,15 +1048,15 @@ impl Visitor<'tcx> for Checker<'mir, 'tcx> {
|
||||
return;
|
||||
}
|
||||
|
||||
let needs_drop = if let Some(local) = dropped_place.as_local() {
|
||||
let needs_non_const_drop = if let Some(local) = dropped_place.as_local() {
|
||||
// Use the span where the local was declared as the span of the drop error.
|
||||
err_span = self.body.local_decls[local].source_info.span;
|
||||
self.qualifs.needs_drop(self.ccx, local, location)
|
||||
self.qualifs.needs_non_const_drop(self.ccx, local, location)
|
||||
} else {
|
||||
true
|
||||
};
|
||||
|
||||
if needs_drop {
|
||||
if needs_non_const_drop {
|
||||
self.check_op_spanned(
|
||||
ops::LiveDrop { dropped_at: Some(terminator.source_info.span) },
|
||||
err_span,
|
||||
|
@ -97,7 +97,7 @@ impl Visitor<'tcx> for CheckLiveDrops<'mir, 'tcx> {
|
||||
// `src/test/ui/consts/control-flow/drop-pass.rs`; e.g., when an `Option<Vec<T>>` is
|
||||
// initialized with `None` and never changed, it still emits drop glue.
|
||||
// Hence we additionally check the qualifs here to allow more code to pass.
|
||||
if self.qualifs.needs_drop(self.ccx, dropped_place.local, location) {
|
||||
if self.qualifs.needs_non_const_drop(self.ccx, dropped_place.local, location) {
|
||||
// Use the span where the dropped local was declared for the error.
|
||||
let span = self.body.local_decls[dropped_place.local].source_info.span;
|
||||
self.check_live_drop(span);
|
||||
|
@ -21,7 +21,8 @@ pub fn in_any_value_of_ty(
|
||||
) -> ConstQualifs {
|
||||
ConstQualifs {
|
||||
has_mut_interior: HasMutInterior::in_any_value_of_ty(cx, ty),
|
||||
needs_drop: NeedsNonConstDrop::in_any_value_of_ty(cx, ty),
|
||||
needs_drop: NeedsDrop::in_any_value_of_ty(cx, ty),
|
||||
needs_non_const_drop: NeedsNonConstDrop::in_any_value_of_ty(cx, ty),
|
||||
custom_eq: CustomEq::in_any_value_of_ty(cx, ty),
|
||||
error_occured,
|
||||
}
|
||||
@ -98,9 +99,31 @@ impl Qualif for HasMutInterior {
|
||||
}
|
||||
|
||||
/// Constant containing an ADT that implements `Drop`.
|
||||
/// This must be ruled out (a) because we cannot run `Drop` during compile-time
|
||||
/// as that might not be a `const fn`, and (b) because implicit promotion would
|
||||
/// remove side-effects that occur as part of dropping that value.
|
||||
/// This must be ruled out because implicit promotion would remove side-effects
|
||||
/// that occur as part of dropping that value. N.B., the implicit promotion has
|
||||
/// to reject const Drop implementations because even if side-effects are ruled
|
||||
/// out through other means, the execution of the drop could diverge.
|
||||
pub struct NeedsDrop;
|
||||
|
||||
impl Qualif for NeedsDrop {
|
||||
const ANALYSIS_NAME: &'static str = "flow_needs_drop";
|
||||
const IS_CLEARED_ON_MOVE: bool = true;
|
||||
|
||||
fn in_qualifs(qualifs: &ConstQualifs) -> bool {
|
||||
qualifs.needs_drop
|
||||
}
|
||||
|
||||
fn in_any_value_of_ty(cx: &ConstCx<'_, 'tcx>, ty: Ty<'tcx>) -> bool {
|
||||
ty.needs_drop(cx.tcx, cx.param_env)
|
||||
}
|
||||
|
||||
fn in_adt_inherently(cx: &ConstCx<'_, 'tcx>, adt: &'tcx AdtDef, _: SubstsRef<'tcx>) -> bool {
|
||||
adt.has_dtor(cx.tcx)
|
||||
}
|
||||
}
|
||||
|
||||
/// Constant containing an ADT that implements non-const `Drop`.
|
||||
/// This must be ruled out because we cannot run `Drop` during compile-time.
|
||||
pub struct NeedsNonConstDrop;
|
||||
|
||||
impl Qualif for NeedsNonConstDrop {
|
||||
@ -108,7 +131,7 @@ impl Qualif for NeedsNonConstDrop {
|
||||
const IS_CLEARED_ON_MOVE: bool = true;
|
||||
|
||||
fn in_qualifs(qualifs: &ConstQualifs) -> bool {
|
||||
qualifs.needs_drop
|
||||
qualifs.needs_non_const_drop
|
||||
}
|
||||
|
||||
fn in_any_value_of_ty(cx: &ConstCx<'_, 'tcx>, mut ty: Ty<'tcx>) -> bool {
|
||||
|
@ -230,7 +230,7 @@ impl<'tcx> Validator<'_, 'tcx> {
|
||||
|
||||
// We cannot promote things that need dropping, since the promoted value
|
||||
// would not get dropped.
|
||||
if self.qualif_local::<qualifs::NeedsNonConstDrop>(place.local) {
|
||||
if self.qualif_local::<qualifs::NeedsDrop>(place.local) {
|
||||
return Err(Unpromotable);
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include "llvm/Support/Host.h"
|
||||
#include "llvm/Support/Memory.h"
|
||||
#include "llvm/Support/SourceMgr.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#include "llvm/Support/TargetSelect.h"
|
||||
#include "llvm/Support/Timer.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
@ -21,6 +21,11 @@
|
||||
#include "llvm/Support/CBindingWrapping.h"
|
||||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Host.h"
|
||||
#if LLVM_VERSION_LT(14, 0)
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
#else
|
||||
#include "llvm/MC/TargetRegistry.h"
|
||||
#endif
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
|
||||
#include "llvm/Transforms/IPO/AlwaysInliner.h"
|
||||
|
@ -225,6 +225,7 @@ pub struct BorrowCheckResult<'tcx> {
|
||||
pub struct ConstQualifs {
|
||||
pub has_mut_interior: bool,
|
||||
pub needs_drop: bool,
|
||||
pub needs_non_const_drop: bool,
|
||||
pub custom_eq: bool,
|
||||
pub error_occured: Option<ErrorReported>,
|
||||
}
|
||||
|
@ -58,34 +58,28 @@ pub fn find_best_match_for_name(
|
||||
let lookup = &lookup.as_str();
|
||||
let max_dist = dist.unwrap_or_else(|| cmp::max(lookup.len(), 3) / 3);
|
||||
|
||||
let (case_insensitive_match, levenshtein_match) = name_vec
|
||||
// Priority of matches:
|
||||
// 1. Exact case insensitive match
|
||||
// 2. Levenshtein distance match
|
||||
// 3. Sorted word match
|
||||
if let Some(case_insensitive_match) =
|
||||
name_vec.iter().find(|candidate| candidate.as_str().to_uppercase() == lookup.to_uppercase())
|
||||
{
|
||||
return Some(*case_insensitive_match);
|
||||
}
|
||||
let levenshtein_match = name_vec
|
||||
.iter()
|
||||
.filter_map(|&name| {
|
||||
let dist = lev_distance(lookup, &name.as_str());
|
||||
if dist <= max_dist { Some((name, dist)) } else { None }
|
||||
})
|
||||
// Here we are collecting the next structure:
|
||||
// (case_insensitive_match, (levenshtein_match, levenshtein_distance))
|
||||
.fold((None, None), |result, (candidate, dist)| {
|
||||
(
|
||||
if candidate.as_str().to_uppercase() == lookup.to_uppercase() {
|
||||
Some(candidate)
|
||||
} else {
|
||||
result.0
|
||||
},
|
||||
match result.1 {
|
||||
None => Some((candidate, dist)),
|
||||
Some((c, d)) => Some(if dist < d { (candidate, dist) } else { (c, d) }),
|
||||
},
|
||||
)
|
||||
// (levenshtein_match, levenshtein_distance)
|
||||
.fold(None, |result, (candidate, dist)| match result {
|
||||
None => Some((candidate, dist)),
|
||||
Some((c, d)) => Some(if dist < d { (candidate, dist) } else { (c, d) }),
|
||||
});
|
||||
// Priority of matches:
|
||||
// 1. Exact case insensitive match
|
||||
// 2. Levenshtein distance match
|
||||
// 3. Sorted word match
|
||||
if let Some(candidate) = case_insensitive_match {
|
||||
Some(candidate)
|
||||
} else if levenshtein_match.is_some() {
|
||||
if levenshtein_match.is_some() {
|
||||
levenshtein_match.map(|(candidate, _)| candidate)
|
||||
} else {
|
||||
find_match_by_sorted_words(name_vec, lookup)
|
||||
|
@ -31,15 +31,11 @@ fn test_find_best_match_for_name() {
|
||||
|
||||
assert_eq!(find_best_match_for_name(&input, Symbol::intern("1111111111"), None), None);
|
||||
|
||||
let input = vec![Symbol::intern("aAAA")];
|
||||
assert_eq!(
|
||||
find_best_match_for_name(&input, Symbol::intern("AAAA"), None),
|
||||
Some(Symbol::intern("aAAA"))
|
||||
);
|
||||
|
||||
let input = vec![Symbol::intern("AAAA")];
|
||||
// Returns None because `lev_distance > max_dist / 3`
|
||||
assert_eq!(find_best_match_for_name(&input, Symbol::intern("aaaa"), None), None);
|
||||
assert_eq!(
|
||||
find_best_match_for_name(&input, Symbol::intern("aaaa"), None),
|
||||
Some(Symbol::intern("AAAA"))
|
||||
);
|
||||
|
||||
let input = vec![Symbol::intern("AAAA")];
|
||||
assert_eq!(
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::spec::{LinkArgs, LinkerFlavor, LldFlavor, PanicStrategy, TargetOptions, TlsModel};
|
||||
use crate::spec::{LinkArgs, LinkerFlavor, LldFlavor, PanicStrategy, TargetOptions};
|
||||
|
||||
pub fn opts() -> TargetOptions {
|
||||
let mut pre_link_args = LinkArgs::new();
|
||||
@ -13,12 +13,10 @@ pub fn opts() -> TargetOptions {
|
||||
disable_redzone: true,
|
||||
linker: Some("rust-lld".to_owned()),
|
||||
executables: true,
|
||||
has_elf_tls: true,
|
||||
pre_link_args,
|
||||
panic_strategy: PanicStrategy::Abort,
|
||||
position_independent_executables: true,
|
||||
static_position_independent_executables: true,
|
||||
tls_model: TlsModel::InitialExec,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
@ -2837,12 +2837,12 @@ pub trait Iterator {
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// let a = [(1, 2), (3, 4)];
|
||||
/// let a = [(1, 2), (3, 4), (5, 6)];
|
||||
///
|
||||
/// let (left, right): (Vec<_>, Vec<_>) = a.iter().cloned().unzip();
|
||||
///
|
||||
/// assert_eq!(left, [1, 3]);
|
||||
/// assert_eq!(right, [2, 4]);
|
||||
/// assert_eq!(left, [1, 3, 5]);
|
||||
/// assert_eq!(right, [2, 4, 6]);
|
||||
///
|
||||
/// // you can also unzip multiple nested tuples at once
|
||||
/// let a = [(1, (2, 3)), (4, (5, 6))];
|
||||
|
@ -182,7 +182,7 @@ impl TcpStream {
|
||||
Ok(self.clone())
|
||||
}
|
||||
|
||||
pub fn set_linger(&self, linger: Option<Duration>) -> io::Result<()> {
|
||||
pub fn set_linger(&self, _linger: Option<Duration>) -> io::Result<()> {
|
||||
unsupported()
|
||||
}
|
||||
|
||||
|
@ -87,13 +87,21 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
|
||||
// the rexport defines the path that a user will actually see. Accordingly,
|
||||
// we add the rexport as an item here, and then skip over the original
|
||||
// definition in `visit_item()` below.
|
||||
//
|
||||
// We also skip `#[macro_export] macro_rules!` that have already been inserted,
|
||||
// it can happen if within the same module a `#[macro_export] macro_rules!`
|
||||
// is declared but also a reexport of itself producing two exports of the same
|
||||
// macro in the same module.
|
||||
let mut inserted = FxHashSet::default();
|
||||
for export in self.cx.tcx.module_exports(CRATE_DEF_ID).unwrap_or(&[]) {
|
||||
if let Res::Def(DefKind::Macro(_), def_id) = export.res {
|
||||
if let Some(local_def_id) = def_id.as_local() {
|
||||
if self.cx.tcx.has_attr(def_id, sym::macro_export) {
|
||||
let hir_id = self.cx.tcx.hir().local_def_id_to_hir_id(local_def_id);
|
||||
let item = self.cx.tcx.hir().expect_item(hir_id);
|
||||
top_level_module.items.push((item, None));
|
||||
if inserted.insert(def_id) {
|
||||
let hir_id = self.cx.tcx.hir().local_def_id_to_hir_id(local_def_id);
|
||||
let item = self.cx.tcx.hir().expect_item(hir_id);
|
||||
top_level_module.items.push((item, None));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
17
src/test/rustdoc-json/reexport/macro.rs
Normal file
17
src/test/rustdoc-json/reexport/macro.rs
Normal file
@ -0,0 +1,17 @@
|
||||
// edition:2018
|
||||
|
||||
#![no_core]
|
||||
#![feature(no_core)]
|
||||
|
||||
// @count macro.json "$.index[*][?(@.name=='macro')].inner.items[*]" 2
|
||||
|
||||
// @set repro_id = macro.json "$.index[*][?(@.name=='repro')].id"
|
||||
// @has - "$.index[*][?(@.name=='macro')].inner.items[*]" $repro_id
|
||||
#[macro_export]
|
||||
macro_rules! repro {
|
||||
() => {};
|
||||
}
|
||||
|
||||
// @set repro2_id = macro.json "$.index[*][?(@.inner.name=='repro2')].id"
|
||||
// @has - "$.index[*][?(@.name=='macro')].inner.items[*]" $repro2_id
|
||||
pub use crate::repro as repro2;
|
14
src/test/rustdoc/issue-89852.rs
Normal file
14
src/test/rustdoc/issue-89852.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// edition:2018
|
||||
|
||||
#![no_core]
|
||||
#![feature(no_core)]
|
||||
|
||||
// @matches 'issue_89852/sidebar-items.js' '"repro"'
|
||||
// @!matches 'issue_89852/sidebar-items.js' '"repro".*"repro"'
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! repro {
|
||||
() => {};
|
||||
}
|
||||
|
||||
pub use crate::repro as repro2;
|
@ -0,0 +1,28 @@
|
||||
// build-pass
|
||||
|
||||
trait Foo {}
|
||||
|
||||
struct Bar {
|
||||
bytes: &'static [u8],
|
||||
func: fn(&Box<dyn Foo>),
|
||||
}
|
||||
fn example(_: &Box<dyn Foo>) {}
|
||||
|
||||
const BARS: &[Bar] = &[
|
||||
Bar {
|
||||
bytes: "0".as_bytes(),
|
||||
func: example,
|
||||
},
|
||||
Bar {
|
||||
bytes: "0".as_bytes(),
|
||||
func: example,
|
||||
},
|
||||
];
|
||||
|
||||
fn main() {
|
||||
let x = todo!();
|
||||
|
||||
for bar in BARS {
|
||||
(bar.func)(&x);
|
||||
}
|
||||
}
|
15
src/test/ui/consts/promoted-const-drop.rs
Normal file
15
src/test/ui/consts/promoted-const-drop.rs
Normal file
@ -0,0 +1,15 @@
|
||||
#![feature(const_trait_impl)]
|
||||
#![feature(const_mut_refs)]
|
||||
|
||||
struct A();
|
||||
|
||||
impl const Drop for A {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
const C: A = A();
|
||||
|
||||
fn main() {
|
||||
let _: &'static A = &A(); //~ ERROR temporary value dropped while borrowed
|
||||
let _: &'static [A] = &[C]; //~ ERROR temporary value dropped while borrowed
|
||||
}
|
24
src/test/ui/consts/promoted-const-drop.stderr
Normal file
24
src/test/ui/consts/promoted-const-drop.stderr
Normal file
@ -0,0 +1,24 @@
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> $DIR/promoted-const-drop.rs:13:26
|
||||
|
|
||||
LL | let _: &'static A = &A();
|
||||
| ---------- ^^^ creates a temporary which is freed while still in use
|
||||
| |
|
||||
| type annotation requires that borrow lasts for `'static`
|
||||
LL | let _: &'static [A] = &[C];
|
||||
LL | }
|
||||
| - temporary value is freed at the end of this statement
|
||||
|
||||
error[E0716]: temporary value dropped while borrowed
|
||||
--> $DIR/promoted-const-drop.rs:14:28
|
||||
|
|
||||
LL | let _: &'static [A] = &[C];
|
||||
| ------------ ^^^ creates a temporary which is freed while still in use
|
||||
| |
|
||||
| type annotation requires that borrow lasts for `'static`
|
||||
LL | }
|
||||
| - temporary value is freed at the end of this statement
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0716`.
|
@ -2,11 +2,14 @@ error[E0425]: cannot find value `Opaque` in this scope
|
||||
--> $DIR/rustc-macro-transparency.rs:26:5
|
||||
|
|
||||
LL | Opaque;
|
||||
| ^^^^^^ help: a local variable with a similar name exists (notice the capitalization): `opaque`
|
||||
| ^^^^^^ not found in this scope
|
||||
|
||||
error[E0423]: expected value, found macro `semitransparent`
|
||||
--> $DIR/rustc-macro-transparency.rs:29:5
|
||||
|
|
||||
LL | struct SemiTransparent;
|
||||
| ----------------------- similarly named unit struct `SemiTransparent` defined here
|
||||
...
|
||||
LL | semitransparent;
|
||||
| ^^^^^^^^^^^^^^^ not a value
|
||||
|
|
||||
@ -14,10 +17,17 @@ help: use `!` to invoke the macro
|
||||
|
|
||||
LL | semitransparent!;
|
||||
| +
|
||||
help: a unit struct with a similar name exists
|
||||
|
|
||||
LL | SemiTransparent;
|
||||
| ~~~~~~~~~~~~~~~
|
||||
|
||||
error[E0423]: expected value, found macro `opaque`
|
||||
--> $DIR/rustc-macro-transparency.rs:30:5
|
||||
|
|
||||
LL | struct Opaque;
|
||||
| -------------- similarly named unit struct `Opaque` defined here
|
||||
...
|
||||
LL | opaque;
|
||||
| ^^^^^^ not a value
|
||||
|
|
||||
@ -25,6 +35,10 @@ help: use `!` to invoke the macro
|
||||
|
|
||||
LL | opaque!;
|
||||
| +
|
||||
help: a unit struct with a similar name exists
|
||||
|
|
||||
LL | Opaque;
|
||||
| ~~~~~~
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
@ -5,7 +5,10 @@ LL | enum Delicious {
|
||||
| -------------- variant or associated item `PIE` not found here
|
||||
...
|
||||
LL | ApplePie = Delicious::Apple as isize | Delicious::PIE as isize,
|
||||
| ^^^ variant or associated item not found in `Delicious`
|
||||
| ^^^
|
||||
| |
|
||||
| variant or associated item not found in `Delicious`
|
||||
| help: there is a variant with a similar name: `Pie`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit ed4b312fa777ebb39ba1348fe3df574c441a485e
|
||||
Subproject commit 91cbda43c2af82b9377eff70a21f59ade18cd23c
|
Loading…
x
Reference in New Issue
Block a user