Skip to content

Commit 44cad75

Browse files
committed
fix iteration-order-dependent output
1 parent 6dcb538 commit 44cad75

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

src/shims/foreign_items.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,14 +173,27 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx
173173
continue;
174174
};
175175
if symbol_name == link_name {
176-
if let Some((instance, original_cnum)) = instance_and_crate {
177-
throw_machine_stop!(TerminationInfo::MultipleSymbolDefinitions {
178-
link_name,
179-
first: tcx.def_span(instance.def_id()).data(),
180-
first_crate: tcx.crate_name(original_cnum),
181-
second: tcx.def_span(def_id).data(),
182-
second_crate: tcx.crate_name(cnum),
183-
});
176+
if let Some((original_instance, original_cnum)) = instance_and_crate {
177+
// Make sure we are consistent wrt what is 'first' and 'second'.
178+
let original_span = tcx.def_span(original_instance.def_id()).data();
179+
let span = tcx.def_span(def_id).data();
180+
if original_span < span {
181+
throw_machine_stop!(TerminationInfo::MultipleSymbolDefinitions {
182+
link_name,
183+
first: original_span,
184+
first_crate: tcx.crate_name(original_cnum),
185+
second: span,
186+
second_crate: tcx.crate_name(cnum),
187+
});
188+
} else {
189+
throw_machine_stop!(TerminationInfo::MultipleSymbolDefinitions {
190+
link_name,
191+
first: span,
192+
first_crate: tcx.crate_name(cnum),
193+
second: original_span,
194+
second_crate: tcx.crate_name(original_cnum),
195+
});
196+
}
184197
}
185198
if !matches!(tcx.def_kind(def_id), DefKind::Fn | DefKind::AssocFn) {
186199
throw_ub_format!(

tests/compile-fail/function_calls/exported_symbol_clashing.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#[no_mangle]
22
fn foo() {}
3-
//~^ HELP then it's defined here again, in crate `exported_symbol_clashing`
3+
//~^ HELP it's first defined here, in crate `exported_symbol_clashing`
44

55
#[export_name = "foo"]
66
fn bar() {}
7-
//~^ HELP it's first defined here, in crate `exported_symbol_clashing`
7+
//~^ HELP then it's defined here again, in crate `exported_symbol_clashing`
88

99
fn main() {
1010
extern "Rust" {

0 commit comments

Comments
 (0)