From fdd68dcbe67fac0d8b035497e19e6d9f2c1e888a Mon Sep 17 00:00:00 2001 From: Jon Ross-Perkins Date: Tue, 22 Jul 2025 15:31:41 -0700 Subject: [PATCH] Fix a crash when Core is poisoned (#5838) There are probably other ways to reproduce this, but this is roughly how I ran into it. --- toolchain/check/import.cpp | 2 +- .../packages/core_name_poisoning.carbon | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/toolchain/check/import.cpp b/toolchain/check/import.cpp index 8cba932493ed..7ea3b914fafd 100644 --- a/toolchain/check/import.cpp +++ b/toolchain/check/import.cpp @@ -648,7 +648,7 @@ auto ImportNameFromOtherPackage( const auto* import_scope_entry = LookupNameInImport( *import_ir.sem_ir, import_scope_id, name_id, identifier); - if (!import_scope_entry) { + if (!import_scope_entry || !import_scope_entry->result.is_found()) { continue; } SemIR::InstId import_scope_inst_id = diff --git a/toolchain/check/testdata/packages/core_name_poisoning.carbon b/toolchain/check/testdata/packages/core_name_poisoning.carbon index 22346a1ba742..ac3010dba7f7 100644 --- a/toolchain/check/testdata/packages/core_name_poisoning.carbon +++ b/toolchain/check/testdata/packages/core_name_poisoning.carbon @@ -12,6 +12,8 @@ // --- fail_implicitly_poison_core.carbon +library "[[@TEST_NAME]]"; + // CHECK:STDERR: fail_implicitly_poison_core.carbon:[[@LINE+4]]:9: error: `Core.Bool` implicitly referenced here, but package `Core` not found [CoreNotFound] // CHECK:STDERR: fn F(x: bool); // CHECK:STDERR: ^~~~ @@ -19,3 +21,27 @@ fn F(x: bool); class r#Core {} + +// --- fail_poisoned_core.carbon + +package Core library "[[@TEST_NAME]]"; + +// This introduces a poisoned name in `Core`. +// CHECK:STDERR: fail_poisoned_core.carbon:[[@LINE+4]]:8: error: name `Core.Int` implicitly referenced here, but not found [CoreNameNotFound] +// CHECK:STDERR: var x: i32; +// CHECK:STDERR: ^~~ +// CHECK:STDERR: +var x: i32; + +// --- fail_use_poisoned_core.carbon + +library "[[@TEST_NAME]]"; + +import Core library "poisoned_core"; + +// This accesses the poisoned name in `Core`. +// CHECK:STDERR: fail_use_poisoned_core.carbon:[[@LINE+4]]:9: error: name `Core.Int` implicitly referenced here, but not found [CoreNameNotFound] +// CHECK:STDERR: fn F(b: i32); +// CHECK:STDERR: ^~~ +// CHECK:STDERR: +fn F(b: i32);