auto &MI = MaterializingInfos[Name];
for (auto &Q : MI.takeQueriesMeeting(SymbolState::Resolved)) {
Q->notifySymbolMetRequiredState(Name, ResolvedSym);
+ Q->removeQueryDependence(*this, Name);
if (Q->isComplete())
CompletedQueries.insert(std::move(Q));
}
}
}
-TEST_F(CoreAPIsStandardTest, FailEmissionEarly) {
+TEST_F(CoreAPIsStandardTest, FailEmissionAfterResolution) {
cantFail(JD.define(absoluteSymbols({{Baz, BazSym}})));
<< "Unexpected success while trying to test error propagation";
}
+TEST_F(CoreAPIsStandardTest, FailAfterPartialResolution) {
+
+ cantFail(JD.define(absoluteSymbols({{Foo, FooSym}})));
+
+ // Fail materialization of bar.
+ auto BarMU = std::make_unique<SimpleMaterializationUnit>(
+ SymbolFlagsMap({{Bar, BarSym.getFlags()}}),
+ [&](MaterializationResponsibility R) { R.failMaterialization(); });
+
+ cantFail(JD.define(std::move(BarMU)));
+
+ bool QueryHandlerRun = false;
+ ES.lookup(
+ JITDylibSearchList({{&JD, false}}), SymbolNameSet({Foo, Bar}),
+ SymbolState::Resolved,
+ [&](Expected<SymbolMap> Result) {
+ EXPECT_THAT_EXPECTED(std::move(Result), Failed())
+ << "Expected query to fail";
+ QueryHandlerRun = true;
+ },
+ NoDependenciesToRegister);
+ EXPECT_TRUE(QueryHandlerRun) << "Query handler never ran";
+}
+
TEST_F(CoreAPIsStandardTest, TestLookupWithUnthreadedMaterialization) {
auto MU = std::make_unique<SimpleMaterializationUnit>(
SymbolFlagsMap({{Foo, JITSymbolFlags::Exported}}),