From 97eef9b09ff8c16aedc294ed2eba7c4acf29c387 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Fri, 17 Oct 2025 15:21:17 +0200 Subject: [PATCH 01/20] C++ Interop: Fix access deduction Always take into account both the lookup access specifier and the lexical access specifier. When set, lookup access specifier takes precedence. When not set, we have two use cases: 1. This is not a record member, so no access is specified at all. Treat this as public. 2. This is a private record member of a base class. Treat this as private. --- toolchain/check/BUILD | 2 + toolchain/check/cpp/access.cpp | 44 +++ toolchain/check/cpp/access.h | 20 + toolchain/check/cpp/import.cpp | 36 +- toolchain/check/cpp/overload_resolution.cpp | 21 +- .../testdata/interop/cpp/class/access.carbon | 372 ++++++++++++++++++ 6 files changed, 456 insertions(+), 39 deletions(-) create mode 100644 toolchain/check/cpp/access.cpp create mode 100644 toolchain/check/cpp/access.h diff --git a/toolchain/check/BUILD b/toolchain/check/BUILD index 54491bd487423..3fea8437120fb 100644 --- a/toolchain/check/BUILD +++ b/toolchain/check/BUILD @@ -21,6 +21,7 @@ cc_library( "context.cpp", "control_flow.cpp", "convert.cpp", + "cpp/access.cpp", "cpp/call.cpp", "cpp/custom_type_mapping.cpp", "cpp/import.cpp", @@ -72,6 +73,7 @@ cc_library( "context.h", "control_flow.h", "convert.h", + "cpp/access.h", "cpp/call.h", "cpp/custom_type_mapping.h", "cpp/import.h", diff --git a/toolchain/check/cpp/access.cpp b/toolchain/check/cpp/access.cpp new file mode 100644 index 0000000000000..cbdf36c15e660 --- /dev/null +++ b/toolchain/check/cpp/access.cpp @@ -0,0 +1,44 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#include "toolchain/check/cpp/access.h" + +namespace Carbon::Check { + +static auto CalculateEffectiveAccess(clang::AccessSpecifier lookup_access, + clang::AccessSpecifier lexical_access) + -> clang::AccessSpecifier { + if (lookup_access != clang::AS_none) { + // Lookup access takes precedence. + return lookup_access; + } + + if (lexical_access != clang::AS_none) { + // When a base class private member is accessed through a derived class, the + // lookup access would be set to `AS_none`. + CARBON_CHECK(lexical_access == clang::AS_private); + return lexical_access; + } + + // No access specified means that this is not a record member, so we treat it + // as public. + return clang::AS_public; +} + +auto DeduceClangAccess(clang::AccessSpecifier lookup_access, + clang::AccessSpecifier lexical_access) + -> SemIR::AccessKind { + switch (CalculateEffectiveAccess(lookup_access, lexical_access)) { + case clang::AS_public: + return SemIR::AccessKind::Public; + case clang::AS_protected: + return SemIR::AccessKind::Protected; + case clang::AS_private: + return SemIR::AccessKind::Private; + case clang::AS_none: + CARBON_FATAL("Couldn't deduce access"); + } +} + +} // namespace Carbon::Check diff --git a/toolchain/check/cpp/access.h b/toolchain/check/cpp/access.h new file mode 100644 index 0000000000000..d523869a4ca69 --- /dev/null +++ b/toolchain/check/cpp/access.h @@ -0,0 +1,20 @@ +// Part of the Carbon Language project, under the Apache License v2.0 with LLVM +// Exceptions. See /LICENSE for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +#ifndef CARBON_TOOLCHAIN_CHECK_CPP_ACCESS_H_ +#define CARBON_TOOLCHAIN_CHECK_CPP_ACCESS_H_ + +#include "toolchain/sem_ir/name_scope.h" + +namespace Carbon::Check { + +// Deduces the effective access kind from the given lookup and lexical access +// specifiers. +auto DeduceClangAccess(clang::AccessSpecifier lookup_access, + clang::AccessSpecifier lexical_access) + -> SemIR::AccessKind; + +} // namespace Carbon::Check + +#endif // CARBON_TOOLCHAIN_CHECK_CPP_ACCESS_H_ diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index 5c5b7c5ee99ba..3a38c55ca23f5 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -4,6 +4,7 @@ #include "toolchain/check/cpp/import.h" +#include #include #include #include @@ -34,6 +35,7 @@ #include "toolchain/check/context.h" #include "toolchain/check/control_flow.h" #include "toolchain/check/convert.h" +#include "toolchain/check/cpp/access.h" #include "toolchain/check/cpp/custom_type_mapping.h" #include "toolchain/check/cpp/thunk.h" #include "toolchain/check/diagnostic_helpers.h" @@ -2014,18 +2016,10 @@ auto ImportCppFunctionDecl(Context& context, SemIR::LocId loc_id, SemIR::ClangDeclKey::ForFunctionDecl(clang_decl, num_params)); } -// Maps `clang::AccessSpecifier` to `SemIR::AccessKind`. -static auto MapAccess(clang::AccessSpecifier access_specifier) +// Deduces the access given UnresolvedSetIterator. +static auto MapAccess(clang::UnresolvedSetIterator iterator) -> SemIR::AccessKind { - switch (access_specifier) { - case clang::AS_public: - case clang::AS_none: - return SemIR::AccessKind::Public; - case clang::AS_protected: - return SemIR::AccessKind::Protected; - case clang::AS_private: - return SemIR::AccessKind::Private; - } + return DeduceClangAccess(iterator.getAccess(), iterator->getAccess()); } // Imports a Clang declaration into Carbon and adds that name into the @@ -2034,13 +2028,12 @@ static auto ImportNameDeclIntoScope(Context& context, SemIR::LocId loc_id, SemIR::NameScopeId scope_id, SemIR::NameId name_id, SemIR::ClangDeclKey key, - clang::AccessSpecifier access) + SemIR::AccessKind access_kind) -> SemIR::ScopeLookupResult { SemIR::InstId inst_id = ImportDeclAndDependencies(context, loc_id, key); if (!inst_id.has_value()) { return SemIR::ScopeLookupResult::MakeNotFound(); } - SemIR::AccessKind access_kind = MapAccess(access); AddNameToScope(context, scope_id, name_id, access_kind, inst_id); return SemIR::ScopeLookupResult::MakeWrappedLookupResult(inst_id, access_kind); @@ -2130,16 +2123,13 @@ auto ImportCppOverloadSet( // after overload resolution. static auto GetOverloadSetAccess(const clang::UnresolvedSet<4>& overload_set) -> SemIR::AccessKind { - clang::AccessSpecifier access = overload_set.begin().getAccess(); - for (auto it = overload_set.begin() + 1; it != overload_set.end(); ++it) { - CARBON_CHECK( - (it.getAccess() == clang::AS_none) == (access == clang::AS_none), - "Unexpected mixture of members and non-members"); - if (it.getAccess() < access) { - access = it->getAccess(); - } + SemIR::AccessKind access_kind = MapAccess(overload_set.begin()); + for (auto it = overload_set.begin() + 1; + it != overload_set.end() && access_kind != SemIR::AccessKind::Public; + ++it) { + access_kind = std::min(access_kind, MapAccess(it)); } - return MapAccess(access); + return access_kind; } // Imports an overload set from Clang to Carbon and adds the name into the @@ -2260,7 +2250,7 @@ auto ImportNameFromCpp(Context& context, SemIR::LocId loc_id, } auto key = SemIR::ClangDeclKey::ForNonFunctionDecl(lookup->getFoundDecl()); return ImportNameDeclIntoScope(context, loc_id, scope_id, name_id, key, - lookup->begin().getAccess()); + MapAccess(lookup->begin())); } auto ImportClassDefinitionForClangDecl(Context& context, SemIR::LocId loc_id, diff --git a/toolchain/check/cpp/overload_resolution.cpp b/toolchain/check/cpp/overload_resolution.cpp index 15237c8f45f35..95abc7fccd372 100644 --- a/toolchain/check/cpp/overload_resolution.cpp +++ b/toolchain/check/cpp/overload_resolution.cpp @@ -8,6 +8,7 @@ #include "clang/Sema/Overload.h" #include "clang/Sema/Sema.h" #include "toolchain/base/kind_switch.h" +#include "toolchain/check/cpp/access.h" #include "toolchain/check/cpp/import.h" #include "toolchain/check/cpp/location.h" #include "toolchain/check/cpp/operators.h" @@ -88,22 +89,10 @@ static auto CheckOverloadAccess(Context& context, SemIR::LocId loc_id, const SemIR::CppOverloadSet& overload_set, clang::DeclAccessPair overload, SemIR::InstId overload_inst_id) -> void { - SemIR::AccessKind member_access_kind; - switch (overload->getAccess()) { - case clang::AS_none: - case clang::AS_public: { - return; - } - - case clang::AS_protected: { - member_access_kind = SemIR::AccessKind::Protected; - break; - } - - case clang::AS_private: { - member_access_kind = SemIR::AccessKind::Private; - break; - } + SemIR::AccessKind member_access_kind = + DeduceClangAccess(overload.getAccess(), overload->getAccess()); + if (member_access_kind == SemIR::AccessKind::Public) { + return; } auto name_scope_const_id = context.constant_values().Get( diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 24c33adc8017a..bf761b1d96c78 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -529,6 +529,204 @@ class D { } } +// --- overload_set_base_class.h + +#include "overload_set.h" + +class PublicDerived : public C {}; +class ProtectedDerived : protected C {}; +class PrivateDerived : private C {}; + +// --- import_overload_set_public_base_class_call_public.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +fn F() { + //@dump-sem-ir-begin + Cpp.PublicDerived.foo(); + //@dump-sem-ir-end +} + +// --- fail_import_overload_set_public_base_class_call_non_public.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +fn F() { + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.PublicDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicDerived.foo(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicDerived.foo(1); + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PublicDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicDerived.foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicDerived.foo(1, 2); +} + +// --- import_overload_set_public_base_class_derived_call_non_private.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +class Derived { + extend base: Cpp.PublicDerived; + + fn F() { + //@dump-sem-ir-begin + foo(); + foo(1); + //@dump-sem-ir-end + } +} + +// --- fail_import_overload_set_public_base_class_derived_call_private.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +class Derived { + extend base: Cpp.PublicDerived; + + fn F() { + // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PublicDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + foo(1, 2); + } +} + +// --- fail_import_overload_set_protected_base_class.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +fn F() { + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.ProtectedDerived.foo(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.ProtectedDerived.foo(); + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.ProtectedDerived.foo(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.ProtectedDerived.foo(1); + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.ProtectedDerived.foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.ProtectedDerived.foo(1, 2); +} + +// --- import_overload_set_protected_base_class_derived_call_non_private.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +class Derived { + extend base: Cpp.ProtectedDerived; + + fn F() { + //@dump-sem-ir-begin + foo(); + foo(1); + //@dump-sem-ir-end + } +} + +// --- fail_import_overload_set_protected_base_class_derived_call_private.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +class Derived { + extend base: Cpp.ProtectedDerived; + + fn F() { + // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + foo(1, 2); + } +} + +// --- fail_import_overload_set_private_base_class.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +fn F() { + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PrivateDerived.foo(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PrivateDerived.foo(); + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PrivateDerived.foo(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PrivateDerived.foo(1); + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PrivateDerived.foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PrivateDerived.foo(1, 2); +} + +// --- fail_import_overload_set_private_base_class_derived.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "overload_set_base_class.h"; + +class Derived { + extend base: Cpp.PrivateDerived; + + fn F() { + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: foo(); + // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + foo(); + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: foo(1); + // CHECK:STDERR: ^~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + foo(1); + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + foo(1, 2); + } +} + // ============================================================================ // Base class // ============================================================================ @@ -971,6 +1169,180 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: --- import_overload_set_public_base_class_call_public.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %PublicDerived: type = class_type @PublicDerived [concrete] +// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.type: type = cpp_overload_set_type @PublicDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.foo.type: type = fn_type @C.foo [concrete] +// CHECK:STDOUT: %C.foo: %C.foo.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { +// CHECK:STDOUT: .PublicDerived = %PublicDerived.decl +// CHECK:STDOUT: import Cpp//... +// CHECK:STDOUT: } +// CHECK:STDOUT: %PublicDerived.decl: type = class_decl @PublicDerived [concrete = constants.%PublicDerived] {} {} +// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %C.foo.decl: %C.foo.type = fn_decl @C.foo [concrete = constants.%C.foo] {} {} +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @F() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicDerived.ref: type = name_ref PublicDerived, imports.%PublicDerived.decl [concrete = constants.%PublicDerived] +// CHECK:STDOUT: %foo.ref: %PublicDerived.foo.cpp_overload_set.type = name_ref foo, imports.%PublicDerived.foo.cpp_overload_set.value [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %C.foo.call: init %empty_tuple.type = call imports.%C.foo.decl() +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- import_overload_set_public_base_class_derived_call_non_private.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.type: type = cpp_overload_set_type @PublicDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.foo.type.54cd32.1: type = fn_type @C.foo.1 [concrete] +// CHECK:STDOUT: %C.foo.25ba20.1: %C.foo.type.54cd32.1 = struct_value () [concrete] +// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] +// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] +// CHECK:STDOUT: %C.foo.type.54cd32.2: type = fn_type @C.foo.2 [concrete] +// CHECK:STDOUT: %C.foo.25ba20.2: %C.foo.type.54cd32.2 = struct_value () [concrete] +// CHECK:STDOUT: %ImplicitAs.type.d14: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] +// CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] +// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340 = struct_value () [symbolic] +// CHECK:STDOUT: %ImplicitAs.impl_witness.204: = impl_witness imports.%ImplicitAs.impl_witness_table.9e9, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584 = struct_value () [concrete] +// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.d14 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.204) [concrete] +// CHECK:STDOUT: %.1df: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] +// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %C.foo.decl.10458f.1: %C.foo.type.54cd32.1 = fn_decl @C.foo.1 [concrete = constants.%C.foo.25ba20.1] {} {} +// CHECK:STDOUT: %C.foo.decl.10458f.2: %C.foo.type.54cd32.2 = fn_decl @C.foo.2 [concrete = constants.%C.foo.25ba20.2] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import_ref.ee7: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340) = import_ref Core//prelude/parts/int, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0)] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.9e9 = impl_witness_table (%Core.import_ref.ee7), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Cpp = +// CHECK:STDOUT: .base = %.loc7 +// CHECK:STDOUT: .F = %Derived.F.decl +// CHECK:STDOUT: .foo = +// CHECK:STDOUT: extend %PublicDerived.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.F() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %foo.ref.loc11: %PublicDerived.foo.cpp_overload_set.type = name_ref foo, imports.%PublicDerived.foo.cpp_overload_set.value [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %C.foo.call.loc11: init %empty_tuple.type = call imports.%C.foo.decl.10458f.1() +// CHECK:STDOUT: %foo.ref.loc12: %PublicDerived.foo.cpp_overload_set.type = name_ref foo, imports.%PublicDerived.foo.cpp_overload_set.value [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] +// CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] +// CHECK:STDOUT: %bound_method.loc12_9.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc12_9.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_9.2(%int_1) [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_9.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_9.2: %i32 = converted %int_1, %.loc12_9.1 [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %C.foo.call.loc12: init %empty_tuple.type = call imports.%C.foo.decl.10458f.2(%.loc12_9.2) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- import_overload_set_protected_base_class_derived_call_non_private.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %ProtectedDerived.foo.cpp_overload_set.type: type = cpp_overload_set_type @ProtectedDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %ProtectedDerived.foo.cpp_overload_set.value: %ProtectedDerived.foo.cpp_overload_set.type = cpp_overload_set_value @ProtectedDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.foo.type.54cd32.1: type = fn_type @C.foo.1 [concrete] +// CHECK:STDOUT: %C.foo.25ba20.1: %C.foo.type.54cd32.1 = struct_value () [concrete] +// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] +// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] +// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] +// CHECK:STDOUT: %C.foo.type.54cd32.2: type = fn_type @C.foo.2 [concrete] +// CHECK:STDOUT: %C.foo.25ba20.2: %C.foo.type.54cd32.2 = struct_value () [concrete] +// CHECK:STDOUT: %ImplicitAs.type.d14: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] +// CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] +// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340 = struct_value () [symbolic] +// CHECK:STDOUT: %ImplicitAs.impl_witness.204: = impl_witness imports.%ImplicitAs.impl_witness_table.9e9, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584 = struct_value () [concrete] +// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.d14 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.204) [concrete] +// CHECK:STDOUT: %.1df: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0 [concrete] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] +// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] +// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %ProtectedDerived.foo.cpp_overload_set.value: %ProtectedDerived.foo.cpp_overload_set.type = cpp_overload_set_value @ProtectedDerived.foo.cpp_overload_set [concrete = constants.%ProtectedDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %C.foo.decl.10458f.1: %C.foo.type.54cd32.1 = fn_decl @C.foo.1 [concrete = constants.%C.foo.25ba20.1] {} {} +// CHECK:STDOUT: %C.foo.decl.10458f.2: %C.foo.type.54cd32.2 = fn_decl @C.foo.2 [concrete = constants.%C.foo.25ba20.2] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Core.import_ref.ee7: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340) = import_ref Core//prelude/parts/int, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0)] +// CHECK:STDOUT: %ImplicitAs.impl_witness_table.9e9 = impl_witness_table (%Core.import_ref.ee7), @Core.IntLiteral.as.ImplicitAs.impl [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Cpp = +// CHECK:STDOUT: .base = %.loc7 +// CHECK:STDOUT: .F = %Derived.F.decl +// CHECK:STDOUT: .foo = +// CHECK:STDOUT: extend %ProtectedDerived.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.F() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %foo.ref.loc11: %ProtectedDerived.foo.cpp_overload_set.type = name_ref foo, imports.%ProtectedDerived.foo.cpp_overload_set.value [concrete = constants.%ProtectedDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %C.foo.call.loc11: init %empty_tuple.type = call imports.%C.foo.decl.10458f.1() +// CHECK:STDOUT: %foo.ref.loc12: %ProtectedDerived.foo.cpp_overload_set.type = name_ref foo, imports.%ProtectedDerived.foo.cpp_overload_set.value [concrete = constants.%ProtectedDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] +// CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] +// CHECK:STDOUT: %bound_method.loc12_9.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] +// CHECK:STDOUT: %bound_method.loc12_9.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_9.2(%int_1) [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_9.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_9.2: %i32 = converted %int_1, %.loc12_9.1 [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %C.foo.call.loc12: init %empty_tuple.type = call imports.%C.foo.decl.10458f.2(%.loc12_9.2) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: // CHECK:STDOUT: --- import_base_class_public.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { From d18b5f4bd6189395cf1dcefa8248a2cb4a8a3bf5 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 10:55:31 +0200 Subject: [PATCH 02/20] Rebane `DeduceClangAccess()` to `ConvertCppAccess()`. --- toolchain/check/cpp/access.cpp | 4 ++-- toolchain/check/cpp/access.h | 6 +++--- toolchain/check/cpp/import.cpp | 4 ++-- toolchain/check/cpp/overload_resolution.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/toolchain/check/cpp/access.cpp b/toolchain/check/cpp/access.cpp index cbdf36c15e660..cfc2f6854573e 100644 --- a/toolchain/check/cpp/access.cpp +++ b/toolchain/check/cpp/access.cpp @@ -26,8 +26,8 @@ static auto CalculateEffectiveAccess(clang::AccessSpecifier lookup_access, return clang::AS_public; } -auto DeduceClangAccess(clang::AccessSpecifier lookup_access, - clang::AccessSpecifier lexical_access) +auto ConvertCppAccess(clang::AccessSpecifier lookup_access, + clang::AccessSpecifier lexical_access) -> SemIR::AccessKind { switch (CalculateEffectiveAccess(lookup_access, lexical_access)) { case clang::AS_public: diff --git a/toolchain/check/cpp/access.h b/toolchain/check/cpp/access.h index d523869a4ca69..32b00eedc96f8 100644 --- a/toolchain/check/cpp/access.h +++ b/toolchain/check/cpp/access.h @@ -9,10 +9,10 @@ namespace Carbon::Check { -// Deduces the effective access kind from the given lookup and lexical access +// Calculates the effective access kind from the given lookup and lexical access // specifiers. -auto DeduceClangAccess(clang::AccessSpecifier lookup_access, - clang::AccessSpecifier lexical_access) +auto ConvertCppAccess(clang::AccessSpecifier lookup_access, + clang::AccessSpecifier lexical_access) -> SemIR::AccessKind; } // namespace Carbon::Check diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index 3a38c55ca23f5..c48f8d353d864 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2016,10 +2016,10 @@ auto ImportCppFunctionDecl(Context& context, SemIR::LocId loc_id, SemIR::ClangDeclKey::ForFunctionDecl(clang_decl, num_params)); } -// Deduces the access given UnresolvedSetIterator. +// Calculates the access given `UnresolvedSetIterator`. static auto MapAccess(clang::UnresolvedSetIterator iterator) -> SemIR::AccessKind { - return DeduceClangAccess(iterator.getAccess(), iterator->getAccess()); + return ConvertCppAccess(iterator.getAccess(), iterator->getAccess()); } // Imports a Clang declaration into Carbon and adds that name into the diff --git a/toolchain/check/cpp/overload_resolution.cpp b/toolchain/check/cpp/overload_resolution.cpp index 95abc7fccd372..b08217eff8076 100644 --- a/toolchain/check/cpp/overload_resolution.cpp +++ b/toolchain/check/cpp/overload_resolution.cpp @@ -90,7 +90,7 @@ static auto CheckOverloadAccess(Context& context, SemIR::LocId loc_id, clang::DeclAccessPair overload, SemIR::InstId overload_inst_id) -> void { SemIR::AccessKind member_access_kind = - DeduceClangAccess(overload.getAccess(), overload->getAccess()); + ConvertCppAccess(overload.getAccess(), overload->getAccess()); if (member_access_kind == SemIR::AccessKind::Public) { return; } From c296cd8277f9be623c8df17850240b6bebd795d9 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 13:32:20 +0200 Subject: [PATCH 03/20] Fix access calculation to support layered inheritance --- toolchain/check/cpp/access.cpp | 36 +++--- toolchain/check/cpp/access.h | 8 +- toolchain/check/cpp/import.cpp | 3 +- toolchain/check/cpp/overload_resolution.cpp | 3 +- .../testdata/interop/cpp/class/access.carbon | 107 ++++++++++++++++++ 5 files changed, 129 insertions(+), 28 deletions(-) diff --git a/toolchain/check/cpp/access.cpp b/toolchain/check/cpp/access.cpp index cfc2f6854573e..9cdce92fc571b 100644 --- a/toolchain/check/cpp/access.cpp +++ b/toolchain/check/cpp/access.cpp @@ -6,30 +6,26 @@ namespace Carbon::Check { -static auto CalculateEffectiveAccess(clang::AccessSpecifier lookup_access, - clang::AccessSpecifier lexical_access) +static auto CalculateEffectiveAccess(clang::DeclAccessPair access_pair) -> clang::AccessSpecifier { - if (lookup_access != clang::AS_none) { + switch (access_pair.getAccess()) { // Lookup access takes precedence. - return lookup_access; - } - - if (lexical_access != clang::AS_none) { - // When a base class private member is accessed through a derived class, the - // lookup access would be set to `AS_none`. - CARBON_CHECK(lexical_access == clang::AS_private); - return lexical_access; + case clang::AS_public: + case clang::AS_protected: + case clang::AS_private: + return access_pair.getAccess(); + case clang::AS_none: + // No access specified meaning depends on the declaration. For class + // members it means we lost access along the inheritance path. Otherwise + // it means there's no access associated with this function so we treat it + // as public. + return access_pair->isCXXClassMember() ? clang::AS_private + : clang::AS_public; } - - // No access specified means that this is not a record member, so we treat it - // as public. - return clang::AS_public; } -auto ConvertCppAccess(clang::AccessSpecifier lookup_access, - clang::AccessSpecifier lexical_access) - -> SemIR::AccessKind { - switch (CalculateEffectiveAccess(lookup_access, lexical_access)) { +auto ConvertCppAccess(clang::DeclAccessPair access_pair) -> SemIR::AccessKind { + switch (CalculateEffectiveAccess(access_pair)) { case clang::AS_public: return SemIR::AccessKind::Public; case clang::AS_protected: @@ -37,7 +33,7 @@ auto ConvertCppAccess(clang::AccessSpecifier lookup_access, case clang::AS_private: return SemIR::AccessKind::Private; case clang::AS_none: - CARBON_FATAL("Couldn't deduce access"); + CARBON_FATAL("Couldn't convert access"); } } diff --git a/toolchain/check/cpp/access.h b/toolchain/check/cpp/access.h index 32b00eedc96f8..5fee7a89e5327 100644 --- a/toolchain/check/cpp/access.h +++ b/toolchain/check/cpp/access.h @@ -9,11 +9,9 @@ namespace Carbon::Check { -// Calculates the effective access kind from the given lookup and lexical access -// specifiers. -auto ConvertCppAccess(clang::AccessSpecifier lookup_access, - clang::AccessSpecifier lexical_access) - -> SemIR::AccessKind; +// Calculates the effective access kind from the given (declaration, lookup +// access) pair. +auto ConvertCppAccess(clang::DeclAccessPair access_pair) -> SemIR::AccessKind; } // namespace Carbon::Check diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index c48f8d353d864..fbb4255ce2465 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2019,7 +2019,8 @@ auto ImportCppFunctionDecl(Context& context, SemIR::LocId loc_id, // Calculates the access given `UnresolvedSetIterator`. static auto MapAccess(clang::UnresolvedSetIterator iterator) -> SemIR::AccessKind { - return ConvertCppAccess(iterator.getAccess(), iterator->getAccess()); + return ConvertCppAccess( + clang::DeclAccessPair::make(*iterator, iterator.getAccess())); } // Imports a Clang declaration into Carbon and adds that name into the diff --git a/toolchain/check/cpp/overload_resolution.cpp b/toolchain/check/cpp/overload_resolution.cpp index b08217eff8076..8e4ab190495ae 100644 --- a/toolchain/check/cpp/overload_resolution.cpp +++ b/toolchain/check/cpp/overload_resolution.cpp @@ -89,8 +89,7 @@ static auto CheckOverloadAccess(Context& context, SemIR::LocId loc_id, const SemIR::CppOverloadSet& overload_set, clang::DeclAccessPair overload, SemIR::InstId overload_inst_id) -> void { - SemIR::AccessKind member_access_kind = - ConvertCppAccess(overload.getAccess(), overload->getAccess()); + SemIR::AccessKind member_access_kind = ConvertCppAccess(overload); if (member_access_kind == SemIR::AccessKind::Public) { return; } diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index bf761b1d96c78..55e2ff5ea0af0 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -727,6 +727,113 @@ class Derived { } } +// --- fail_layered_inheritance.carbon + +library "[[@TEST_NAME]]"; + +import Cpp inline ''' +class Base { + public: + static auto PublicStatic() -> void; + auto PublicInstance() -> void; + protected: + static auto ProtectedStatic() -> void; + auto ProtectedInstance() -> void; + private: + static auto PrivateStatic() -> void; + auto PrivateInstance() -> void; +}; + +class PrivateDerived : private Base {}; + +class PublicPrivateDerived : public PrivateDerived {}; +'''; + +class Derived { + extend base: Cpp.PublicPrivateDerived; + + fn CallStatic() { + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.PublicStatic(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.ProtectedStatic(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.PrivateStatic(); + } + + fn CallInstance[self: Self]() { + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: self.PublicInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + self.PublicInstance(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: self.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + self.ProtectedInstance(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: self.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + self.PrivateInstance(); + } + + fn Call(instance: Derived) { + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PublicStatic(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.ProtectedStatic(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PrivateStatic(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PublicInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PublicInstance(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.ProtectedInstance(); + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); + } +} + // ============================================================================ // Base class // ============================================================================ From 018dca847df858872fc6fe0e419e5f20cbfc7e7f Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 13:40:46 +0200 Subject: [PATCH 04/20] Merge tests --- .../testdata/interop/cpp/class/access.carbon | 198 +++++++++--------- 1 file changed, 96 insertions(+), 102 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 55e2ff5ea0af0..07b956baa24b3 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -727,11 +727,12 @@ class Derived { } } -// --- fail_layered_inheritance.carbon +// ============================================================================ +// Base class +// ============================================================================ -library "[[@TEST_NAME]]"; +// --- base_class.h -import Cpp inline ''' class Base { public: static auto PublicStatic() -> void; @@ -744,28 +745,92 @@ class Base { auto PrivateInstance() -> void; }; -class PrivateDerived : private Base {}; +class Public : public Base {}; +class Protected : protected Base {}; +class Private : private Base {}; + +class PublicPrivate : public Private {}; + +// --- import_base_class_public.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "base_class.h"; + +fn F() { + //@dump-sem-ir-begin + Cpp.Public.PublicStatic(); + //@dump-sem-ir-end +} + +// --- fail_import_base_class_protected.carbon + +library "[[@TEST_NAME]]"; -class PublicPrivateDerived : public PrivateDerived {}; -'''; +import Cpp library "base_class.h"; + +fn F() { + // CHECK:STDERR: fail_import_base_class_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_base_class_protected.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Protected.PublicStatic(); +} + +// --- use_base_class_protected_from_derived.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "base_class.h"; + +class Derived { + extend base: Cpp.Protected; + + fn F() { + // OK, we can access a protected member of our base class. + Cpp.Protected.PublicStatic(); + } +} + +// --- fail_import_base_class_private.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "base_class.h"; + +fn F() { + // CHECK:STDERR: fail_import_base_class_private.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_base_class_private.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Private.PublicStatic(); +} + +// --- fail_layered_inheritance.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "base_class.h"; class Derived { - extend base: Cpp.PublicPrivateDerived; + extend base: Cpp.PublicPrivate; fn CallStatic() { - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PublicStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.ProtectedStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] @@ -774,19 +839,19 @@ class Derived { } fn CallInstance[self: Self]() { - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: self.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: self.PublicInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: self.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: self.ProtectedInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: self.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] @@ -795,37 +860,37 @@ class Derived { } fn Call(instance: Derived) { - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PublicStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.ProtectedStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PrivateStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] @@ -834,77 +899,6 @@ class Derived { } } -// ============================================================================ -// Base class -// ============================================================================ - -// --- base_class.h - -struct Base { - static auto foo() -> void; -}; - -class DerivedPublic : public Base {}; -class DerivedProtected : protected Base {}; -class DerivedPrivate : private Base {}; - -// --- import_base_class_public.carbon - -library "[[@TEST_NAME]]"; - -import Cpp library "base_class.h"; - -fn F() { - //@dump-sem-ir-begin - Cpp.DerivedPublic.foo(); - //@dump-sem-ir-end -} - -// --- fail_import_base_class_protected.carbon - -library "[[@TEST_NAME]]"; - -import Cpp library "base_class.h"; - -fn F() { - // CHECK:STDERR: fail_import_base_class_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.DerivedProtected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.DerivedProtected.foo(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_import_base_class_protected.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - Cpp.DerivedProtected.foo(); -} - -// --- use_base_class_protected_from_derived.carbon - -library "[[@TEST_NAME]]"; - -import Cpp library "base_class.h"; - -class Derived { - extend base: Cpp.DerivedProtected; - - fn F() { - // OK, we can access a protected member of our base class. - Cpp.DerivedProtected.foo(); - } -} - -// --- fail_import_base_class_private.carbon - -library "[[@TEST_NAME]]"; - -import Cpp library "base_class.h"; - -fn F() { - // CHECK:STDERR: fail_import_base_class_private.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.DerivedPrivate` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.DerivedPrivate.foo(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_import_base_class_private.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - Cpp.DerivedPrivate.foo(); -} - // CHECK:STDOUT: --- import_non_function_member_public.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { @@ -1454,29 +1448,29 @@ fn F() { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %DerivedPublic: type = class_type @DerivedPublic [concrete] -// CHECK:STDOUT: %DerivedPublic.foo.cpp_overload_set.type: type = cpp_overload_set_type @DerivedPublic.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %DerivedPublic.foo.cpp_overload_set.value: %DerivedPublic.foo.cpp_overload_set.type = cpp_overload_set_value @DerivedPublic.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %Base.foo.type: type = fn_type @Base.foo [concrete] -// CHECK:STDOUT: %Base.foo: %Base.foo.type = struct_value () [concrete] +// CHECK:STDOUT: %Public: type = class_type @Public [concrete] +// CHECK:STDOUT: %Public.PublicStatic.cpp_overload_set.type: type = cpp_overload_set_type @Public.PublicStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.PublicStatic.cpp_overload_set.value: %Public.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @Public.PublicStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.PublicStatic.type: type = fn_type @Base.PublicStatic [concrete] +// CHECK:STDOUT: %Base.PublicStatic: %Base.PublicStatic.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { -// CHECK:STDOUT: .DerivedPublic = %DerivedPublic.decl +// CHECK:STDOUT: .Public = %Public.decl // CHECK:STDOUT: import Cpp//... // CHECK:STDOUT: } -// CHECK:STDOUT: %DerivedPublic.decl: type = class_decl @DerivedPublic [concrete = constants.%DerivedPublic] {} {} -// CHECK:STDOUT: %DerivedPublic.foo.cpp_overload_set.value: %DerivedPublic.foo.cpp_overload_set.type = cpp_overload_set_value @DerivedPublic.foo.cpp_overload_set [concrete = constants.%DerivedPublic.foo.cpp_overload_set.value] -// CHECK:STDOUT: %Base.foo.decl: %Base.foo.type = fn_decl @Base.foo [concrete = constants.%Base.foo] {} {} +// CHECK:STDOUT: %Public.decl: type = class_decl @Public [concrete = constants.%Public] {} {} +// CHECK:STDOUT: %Public.PublicStatic.cpp_overload_set.value: %Public.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @Public.PublicStatic.cpp_overload_set [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.decl: %Base.PublicStatic.type = fn_decl @Base.PublicStatic [concrete = constants.%Base.PublicStatic] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] -// CHECK:STDOUT: %DerivedPublic.ref: type = name_ref DerivedPublic, imports.%DerivedPublic.decl [concrete = constants.%DerivedPublic] -// CHECK:STDOUT: %foo.ref: %DerivedPublic.foo.cpp_overload_set.type = name_ref foo, imports.%DerivedPublic.foo.cpp_overload_set.value [concrete = constants.%DerivedPublic.foo.cpp_overload_set.value] -// CHECK:STDOUT: %Base.foo.call: init %empty_tuple.type = call imports.%Base.foo.decl() +// CHECK:STDOUT: %Public.ref: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] +// CHECK:STDOUT: %PublicStatic.ref: %Public.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Public.PublicStatic.cpp_overload_set.value [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: From 7bd83dc9efa0c149c3dce6517896187fa6098bb4 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 13:55:38 +0200 Subject: [PATCH 05/20] Move coverage for public base class. --- .../testdata/interop/cpp/class/access.carbon | 264 +++++++++++++++++- 1 file changed, 255 insertions(+), 9 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 07b956baa24b3..794cd6c1891f4 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -751,18 +751,124 @@ class Private : private Base {}; class PublicPrivate : public Private {}; -// --- import_base_class_public.carbon +// --- base_class_public_access_allowed.carbon library "[[@TEST_NAME]]"; import Cpp library "base_class.h"; -fn F() { +class Derived { + extend base: Cpp.Public; + + fn CallStatic() { + //@dump-sem-ir-begin + // OK, we can access a public member of our base class. + Cpp.Public.PublicStatic(); + Self.PublicStatic(); + + // OK, we can access a protected member of our base class. + Cpp.Public.ProtectedStatic(); + Self.ProtectedStatic(); + //@dump-sem-ir-end + } + + fn CallInstance(var instance: Cpp.Public) { + //@dump-sem-ir-begin + // OK, we can access a public member of our base class. + instance.PublicInstance(); + // OK, we can access a protected member of our base class. + instance.ProtectedInstance(); + //@dump-sem-ir-end + } +} + +fn Call(var instance: Cpp.Public) { //@dump-sem-ir-begin Cpp.Public.PublicStatic(); + Derived.PublicStatic(); + + instance.PublicInstance(); + instance.PublicInstance(); //@dump-sem-ir-end } +// --- fail_base_class_public_access_disallowed.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "base_class.h"; + +class Derived { + extend base: Cpp.Public; + + fn CallStatic() { + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Public.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Public.PrivateStatic(); + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.PrivateStatic(); + } + + fn CallInstance(var instance: Cpp.Public) { + //@dump-sem-ir-begin + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); + //@dump-sem-ir-end + } +} + +fn Call(var instance: Cpp.Public) { + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Public.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Public.ProtectedStatic(); + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.ProtectedStatic(); + + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Public.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Public.PrivateStatic(); + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PrivateStatic(); + + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.ProtectedInstance(); + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); +} + // --- fail_import_base_class_protected.carbon library "[[@TEST_NAME]]"; @@ -1444,15 +1550,31 @@ class Derived { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: --- import_base_class_public.carbon +// CHECK:STDOUT: --- base_class_public_access_allowed.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %Public: type = class_type @Public [concrete] +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Public.PublicStatic.cpp_overload_set.type: type = cpp_overload_set_type @Public.PublicStatic.cpp_overload_set [concrete] // CHECK:STDOUT: %Public.PublicStatic.cpp_overload_set.value: %Public.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @Public.PublicStatic.cpp_overload_set [concrete] // CHECK:STDOUT: %Base.PublicStatic.type: type = fn_type @Base.PublicStatic [concrete] // CHECK:STDOUT: %Base.PublicStatic: %Base.PublicStatic.type = struct_value () [concrete] +// CHECK:STDOUT: %Public.ProtectedStatic.cpp_overload_set.type: type = cpp_overload_set_type @Public.ProtectedStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.ProtectedStatic.cpp_overload_set.value: %Public.ProtectedStatic.cpp_overload_set.type = cpp_overload_set_value @Public.ProtectedStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.ProtectedStatic.type: type = fn_type @Base.ProtectedStatic [concrete] +// CHECK:STDOUT: %Base.ProtectedStatic: %Base.ProtectedStatic.type = struct_value () [concrete] +// CHECK:STDOUT: %Public.PublicInstance.cpp_overload_set.type: type = cpp_overload_set_type @Public.PublicInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.PublicInstance.cpp_overload_set.value: %Public.PublicInstance.cpp_overload_set.type = cpp_overload_set_value @Public.PublicInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.fb2: type = ptr_type %Base [concrete] +// CHECK:STDOUT: %Base.PublicInstance.type: type = fn_type @Base.PublicInstance [concrete] +// CHECK:STDOUT: %Base.PublicInstance: %Base.PublicInstance.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.1e8: type = ptr_type %Public [concrete] +// CHECK:STDOUT: %Public.ProtectedInstance.cpp_overload_set.type: type = cpp_overload_set_type @Public.ProtectedInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.ProtectedInstance.cpp_overload_set.value: %Public.ProtectedInstance.cpp_overload_set.type = cpp_overload_set_value @Public.ProtectedInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.ProtectedInstance.type: type = fn_type @Base.ProtectedInstance [concrete] +// CHECK:STDOUT: %Base.ProtectedInstance: %Base.ProtectedInstance.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -1463,14 +1585,138 @@ class Derived { // CHECK:STDOUT: %Public.decl: type = class_decl @Public [concrete = constants.%Public] {} {} // CHECK:STDOUT: %Public.PublicStatic.cpp_overload_set.value: %Public.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @Public.PublicStatic.cpp_overload_set [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] // CHECK:STDOUT: %Base.PublicStatic.decl: %Base.PublicStatic.type = fn_decl @Base.PublicStatic [concrete = constants.%Base.PublicStatic] {} {} +// CHECK:STDOUT: %Public.ProtectedStatic.cpp_overload_set.value: %Public.ProtectedStatic.cpp_overload_set.type = cpp_overload_set_value @Public.ProtectedStatic.cpp_overload_set [concrete = constants.%Public.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.decl: %Base.ProtectedStatic.type = fn_decl @Base.ProtectedStatic [concrete = constants.%Base.ProtectedStatic] {} {} +// CHECK:STDOUT: %Public.PublicInstance.cpp_overload_set.value: %Public.PublicInstance.cpp_overload_set.type = cpp_overload_set_value @Public.PublicInstance.cpp_overload_set [concrete = constants.%Public.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicInstance.decl: %Base.PublicInstance.type = fn_decl @Base.PublicInstance [concrete = constants.%Base.PublicInstance] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Public.ProtectedInstance.cpp_overload_set.value: %Public.ProtectedInstance.cpp_overload_set.type = cpp_overload_set_value @Public.ProtectedInstance.cpp_overload_set [concrete = constants.%Public.ProtectedInstance.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedInstance.decl: %Base.ProtectedInstance.type = fn_decl @Base.ProtectedInstance [concrete = constants.%Base.ProtectedInstance] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: fn @F() { +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Cpp = +// CHECK:STDOUT: .base = %.loc7 +// CHECK:STDOUT: .CallStatic = %Derived.CallStatic.decl +// CHECK:STDOUT: .CallInstance = %Derived.CallInstance.decl +// CHECK:STDOUT: .PublicStatic = +// CHECK:STDOUT: .ProtectedStatic = +// CHECK:STDOUT: extend %Public.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.CallStatic() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] -// CHECK:STDOUT: %Public.ref: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] -// CHECK:STDOUT: %PublicStatic.ref: %Public.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Public.PublicStatic.cpp_overload_set.value [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] -// CHECK:STDOUT: %Base.PublicStatic.call: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Cpp.ref.loc12: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Public.ref.loc12: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] +// CHECK:STDOUT: %PublicStatic.ref.loc12: %Public.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Public.PublicStatic.cpp_overload_set.value [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc12: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Self.ref.loc13: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] +// CHECK:STDOUT: %PublicStatic.ref.loc13: %Public.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Public.PublicStatic.cpp_overload_set.value [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc13: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Cpp.ref.loc16: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Public.ref.loc16: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] +// CHECK:STDOUT: %ProtectedStatic.ref.loc16: %Public.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%Public.ProtectedStatic.cpp_overload_set.value [concrete = constants.%Public.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.call.loc16: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() +// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] +// CHECK:STDOUT: %ProtectedStatic.ref.loc17: %Public.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%Public.ProtectedStatic.cpp_overload_set.value [concrete = constants.%Public.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.call.loc17: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.CallInstance(%instance.param: %Public) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %instance.ref.loc24: ref %Public = name_ref instance, %instance +// CHECK:STDOUT: %PublicInstance.ref: %Public.PublicInstance.cpp_overload_set.type = name_ref PublicInstance, imports.%Public.PublicInstance.cpp_overload_set.value [concrete = constants.%Public.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc24: = bound_method %instance.ref.loc24, %PublicInstance.ref +// CHECK:STDOUT: %addr.loc24_5.1: %ptr.1e8 = addr_of %instance.ref.loc24 +// CHECK:STDOUT: %.loc24_5.1: ref %Public = deref %addr.loc24_5.1 +// CHECK:STDOUT: %.loc24_5.2: ref %Base = class_element_access %.loc24_5.1, element0 +// CHECK:STDOUT: %addr.loc24_5.2: %ptr.fb2 = addr_of %.loc24_5.2 +// CHECK:STDOUT: %.loc24_5.3: %ptr.fb2 = converted %addr.loc24_5.1, %addr.loc24_5.2 +// CHECK:STDOUT: %Base.PublicInstance.call: init %empty_tuple.type = call imports.%Base.PublicInstance.decl(%.loc24_5.3) +// CHECK:STDOUT: %instance.ref.loc26: ref %Public = name_ref instance, %instance +// CHECK:STDOUT: %ProtectedInstance.ref: %Public.ProtectedInstance.cpp_overload_set.type = name_ref ProtectedInstance, imports.%Public.ProtectedInstance.cpp_overload_set.value [concrete = constants.%Public.ProtectedInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc26: = bound_method %instance.ref.loc26, %ProtectedInstance.ref +// CHECK:STDOUT: %addr.loc26_5.1: %ptr.1e8 = addr_of %instance.ref.loc26 +// CHECK:STDOUT: %.loc26_5.1: ref %Public = deref %addr.loc26_5.1 +// CHECK:STDOUT: %.loc26_5.2: ref %Base = class_element_access %.loc26_5.1, element0 +// CHECK:STDOUT: %addr.loc26_5.2: %ptr.fb2 = addr_of %.loc26_5.2 +// CHECK:STDOUT: %.loc26_5.3: %ptr.fb2 = converted %addr.loc26_5.1, %addr.loc26_5.2 +// CHECK:STDOUT: %Base.ProtectedInstance.call: init %empty_tuple.type = call imports.%Base.ProtectedInstance.decl(%.loc26_5.3) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Call(%instance.param: %Public) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Cpp.ref.loc33: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Public.ref.loc33: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] +// CHECK:STDOUT: %PublicStatic.ref.loc33: %Public.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Public.PublicStatic.cpp_overload_set.value [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc33: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Derived.ref: type = name_ref Derived, file.%Derived.decl [concrete = constants.%Derived] +// CHECK:STDOUT: %PublicStatic.ref.loc34: %Public.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Public.PublicStatic.cpp_overload_set.value [concrete = constants.%Public.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc34: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %instance.ref.loc36: ref %Public = name_ref instance, %instance +// CHECK:STDOUT: %PublicInstance.ref.loc36: %Public.PublicInstance.cpp_overload_set.type = name_ref PublicInstance, imports.%Public.PublicInstance.cpp_overload_set.value [concrete = constants.%Public.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc36: = bound_method %instance.ref.loc36, %PublicInstance.ref.loc36 +// CHECK:STDOUT: %addr.loc36_3.1: %ptr.1e8 = addr_of %instance.ref.loc36 +// CHECK:STDOUT: %.loc36_3.1: ref %Public = deref %addr.loc36_3.1 +// CHECK:STDOUT: %.loc36_3.2: ref %Base = class_element_access %.loc36_3.1, element0 +// CHECK:STDOUT: %addr.loc36_3.2: %ptr.fb2 = addr_of %.loc36_3.2 +// CHECK:STDOUT: %.loc36_3.3: %ptr.fb2 = converted %addr.loc36_3.1, %addr.loc36_3.2 +// CHECK:STDOUT: %Base.PublicInstance.call.loc36: init %empty_tuple.type = call imports.%Base.PublicInstance.decl(%.loc36_3.3) +// CHECK:STDOUT: %instance.ref.loc37: ref %Public = name_ref instance, %instance +// CHECK:STDOUT: %PublicInstance.ref.loc37: %Public.PublicInstance.cpp_overload_set.type = name_ref PublicInstance, imports.%Public.PublicInstance.cpp_overload_set.value [concrete = constants.%Public.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc37: = bound_method %instance.ref.loc37, %PublicInstance.ref.loc37 +// CHECK:STDOUT: %addr.loc37_3.1: %ptr.1e8 = addr_of %instance.ref.loc37 +// CHECK:STDOUT: %.loc37_3.1: ref %Public = deref %addr.loc37_3.1 +// CHECK:STDOUT: %.loc37_3.2: ref %Base = class_element_access %.loc37_3.1, element0 +// CHECK:STDOUT: %addr.loc37_3.2: %ptr.fb2 = addr_of %.loc37_3.2 +// CHECK:STDOUT: %.loc37_3.3: %ptr.fb2 = converted %addr.loc37_3.1, %addr.loc37_3.2 +// CHECK:STDOUT: %Base.PublicInstance.call.loc37: init %empty_tuple.type = call imports.%Base.PublicInstance.decl(%.loc37_3.3) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_base_class_public_access_disallowed.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Public: type = class_type @Public [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Cpp = +// CHECK:STDOUT: .base = %.loc7 +// CHECK:STDOUT: .CallStatic = %Derived.CallStatic.decl +// CHECK:STDOUT: .CallInstance = %Derived.CallInstance.decl +// CHECK:STDOUT: .PrivateStatic = +// CHECK:STDOUT: .ProtectedStatic = +// CHECK:STDOUT: extend %Public.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.CallInstance(%instance.param: %Public) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %instance.ref: ref %Public = name_ref instance, %instance +// CHECK:STDOUT: %PrivateInstance.ref: = name_ref PrivateInstance, [concrete = ] // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: From 311a45c8d105ee9987bfac41414f39f0cb859305 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:01:59 +0200 Subject: [PATCH 06/20] Move coverage for protected base class. --- .../testdata/interop/cpp/class/access.carbon | 227 +++++++++++++++++- 1 file changed, 215 insertions(+), 12 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 794cd6c1891f4..c42b6d72b05e8 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -869,22 +869,38 @@ fn Call(var instance: Cpp.Public) { instance.PrivateInstance(); } -// --- fail_import_base_class_protected.carbon +// --- base_class_protected_access_allowed.carbon library "[[@TEST_NAME]]"; import Cpp library "base_class.h"; -fn F() { - // CHECK:STDERR: fail_import_base_class_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Protected.PublicStatic(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_import_base_class_protected.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - Cpp.Protected.PublicStatic(); +class Derived { + extend base: Cpp.Protected; + + fn CallStatic() { + //@dump-sem-ir-begin + // OK, we can access a public member of our base class. + Cpp.Protected.PublicStatic(); + Self.PublicStatic(); + + // OK, we can access a protected member of our base class. + Cpp.Protected.ProtectedStatic(); + Self.ProtectedStatic(); + //@dump-sem-ir-end + } + + fn CallInstance(var instance: Cpp.Protected) { + //@dump-sem-ir-begin + // OK, we can access a public member of our base class. + instance.PublicInstance(); + // OK, we can access a protected member of our base class. + instance.ProtectedInstance(); + //@dump-sem-ir-end + } } -// --- use_base_class_protected_from_derived.carbon +// --- fail_base_class_protected_access_disallowed.carbon library "[[@TEST_NAME]]"; @@ -893,10 +909,89 @@ import Cpp library "base_class.h"; class Derived { extend base: Cpp.Protected; - fn F() { - // OK, we can access a protected member of our base class. - Cpp.Protected.PublicStatic(); + fn CallStatic() { + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Protected.PrivateStatic(); + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.PrivateStatic(); } + + fn CallInstance(var instance: Cpp.Protected) { + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); + } +} + +fn Call(var instance: Cpp.Protected) { + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Protected.PublicStatic(); + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PublicStatic(); + + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Protected.ProtectedStatic(); + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.ProtectedStatic(); + + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Protected.PrivateStatic(); + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PrivateStatic(); + + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PublicInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PublicInstance(); + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.ProtectedInstance(); + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); } // --- fail_import_base_class_private.carbon @@ -1720,3 +1815,111 @@ class Derived { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: --- base_class_protected_access_allowed.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Protected: type = class_type @Protected [concrete] +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %Protected.PublicStatic.cpp_overload_set.type: type = cpp_overload_set_type @Protected.PublicStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Protected.PublicStatic.cpp_overload_set.value: %Protected.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @Protected.PublicStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.PublicStatic.type: type = fn_type @Base.PublicStatic [concrete] +// CHECK:STDOUT: %Base.PublicStatic: %Base.PublicStatic.type = struct_value () [concrete] +// CHECK:STDOUT: %Protected.ProtectedStatic.cpp_overload_set.type: type = cpp_overload_set_type @Protected.ProtectedStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Protected.ProtectedStatic.cpp_overload_set.value: %Protected.ProtectedStatic.cpp_overload_set.type = cpp_overload_set_value @Protected.ProtectedStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.ProtectedStatic.type: type = fn_type @Base.ProtectedStatic [concrete] +// CHECK:STDOUT: %Base.ProtectedStatic: %Base.ProtectedStatic.type = struct_value () [concrete] +// CHECK:STDOUT: %Protected.PublicInstance.cpp_overload_set.type: type = cpp_overload_set_type @Protected.PublicInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %Protected.PublicInstance.cpp_overload_set.value: %Protected.PublicInstance.cpp_overload_set.type = cpp_overload_set_value @Protected.PublicInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.fb2: type = ptr_type %Base [concrete] +// CHECK:STDOUT: %Base.PublicInstance.type: type = fn_type @Base.PublicInstance [concrete] +// CHECK:STDOUT: %Base.PublicInstance: %Base.PublicInstance.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.f97: type = ptr_type %Protected [concrete] +// CHECK:STDOUT: %Protected.ProtectedInstance.cpp_overload_set.type: type = cpp_overload_set_type @Protected.ProtectedInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %Protected.ProtectedInstance.cpp_overload_set.value: %Protected.ProtectedInstance.cpp_overload_set.type = cpp_overload_set_value @Protected.ProtectedInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.ProtectedInstance.type: type = fn_type @Base.ProtectedInstance [concrete] +// CHECK:STDOUT: %Base.ProtectedInstance: %Base.ProtectedInstance.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { +// CHECK:STDOUT: .Protected = %Protected.decl +// CHECK:STDOUT: import Cpp//... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Protected.decl: type = class_decl @Protected [concrete = constants.%Protected] {} {} +// CHECK:STDOUT: %Protected.PublicStatic.cpp_overload_set.value: %Protected.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @Protected.PublicStatic.cpp_overload_set [concrete = constants.%Protected.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.decl: %Base.PublicStatic.type = fn_decl @Base.PublicStatic [concrete = constants.%Base.PublicStatic] {} {} +// CHECK:STDOUT: %Protected.ProtectedStatic.cpp_overload_set.value: %Protected.ProtectedStatic.cpp_overload_set.type = cpp_overload_set_value @Protected.ProtectedStatic.cpp_overload_set [concrete = constants.%Protected.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.decl: %Base.ProtectedStatic.type = fn_decl @Base.ProtectedStatic [concrete = constants.%Base.ProtectedStatic] {} {} +// CHECK:STDOUT: %Protected.PublicInstance.cpp_overload_set.value: %Protected.PublicInstance.cpp_overload_set.type = cpp_overload_set_value @Protected.PublicInstance.cpp_overload_set [concrete = constants.%Protected.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicInstance.decl: %Base.PublicInstance.type = fn_decl @Base.PublicInstance [concrete = constants.%Base.PublicInstance] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Protected.ProtectedInstance.cpp_overload_set.value: %Protected.ProtectedInstance.cpp_overload_set.type = cpp_overload_set_value @Protected.ProtectedInstance.cpp_overload_set [concrete = constants.%Protected.ProtectedInstance.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedInstance.decl: %Base.ProtectedInstance.type = fn_decl @Base.ProtectedInstance [concrete = constants.%Base.ProtectedInstance] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Cpp = +// CHECK:STDOUT: .base = %.loc7 +// CHECK:STDOUT: .CallStatic = %Derived.CallStatic.decl +// CHECK:STDOUT: .CallInstance = %Derived.CallInstance.decl +// CHECK:STDOUT: .PublicStatic = +// CHECK:STDOUT: .ProtectedStatic = +// CHECK:STDOUT: extend %Protected.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.CallStatic() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Cpp.ref.loc12: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Protected.ref.loc12: type = name_ref Protected, imports.%Protected.decl [concrete = constants.%Protected] +// CHECK:STDOUT: %PublicStatic.ref.loc12: %Protected.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Protected.PublicStatic.cpp_overload_set.value [concrete = constants.%Protected.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc12: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Self.ref.loc13: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] +// CHECK:STDOUT: %PublicStatic.ref.loc13: %Protected.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%Protected.PublicStatic.cpp_overload_set.value [concrete = constants.%Protected.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc13: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Cpp.ref.loc16: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Protected.ref.loc16: type = name_ref Protected, imports.%Protected.decl [concrete = constants.%Protected] +// CHECK:STDOUT: %ProtectedStatic.ref.loc16: %Protected.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%Protected.ProtectedStatic.cpp_overload_set.value [concrete = constants.%Protected.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.call.loc16: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() +// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] +// CHECK:STDOUT: %ProtectedStatic.ref.loc17: %Protected.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%Protected.ProtectedStatic.cpp_overload_set.value [concrete = constants.%Protected.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.call.loc17: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.CallInstance(%instance.param: %Protected) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %instance.ref.loc24: ref %Protected = name_ref instance, %instance +// CHECK:STDOUT: %PublicInstance.ref: %Protected.PublicInstance.cpp_overload_set.type = name_ref PublicInstance, imports.%Protected.PublicInstance.cpp_overload_set.value [concrete = constants.%Protected.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc24: = bound_method %instance.ref.loc24, %PublicInstance.ref +// CHECK:STDOUT: %addr.loc24_5.1: %ptr.f97 = addr_of %instance.ref.loc24 +// CHECK:STDOUT: %.loc24_5.1: ref %Protected = deref %addr.loc24_5.1 +// CHECK:STDOUT: %.loc24_5.2: ref %Base = class_element_access %.loc24_5.1, element0 +// CHECK:STDOUT: %addr.loc24_5.2: %ptr.fb2 = addr_of %.loc24_5.2 +// CHECK:STDOUT: %.loc24_5.3: %ptr.fb2 = converted %addr.loc24_5.1, %addr.loc24_5.2 +// CHECK:STDOUT: %Base.PublicInstance.call: init %empty_tuple.type = call imports.%Base.PublicInstance.decl(%.loc24_5.3) +// CHECK:STDOUT: %instance.ref.loc26: ref %Protected = name_ref instance, %instance +// CHECK:STDOUT: %ProtectedInstance.ref: %Protected.ProtectedInstance.cpp_overload_set.type = name_ref ProtectedInstance, imports.%Protected.ProtectedInstance.cpp_overload_set.value [concrete = constants.%Protected.ProtectedInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc26: = bound_method %instance.ref.loc26, %ProtectedInstance.ref +// CHECK:STDOUT: %addr.loc26_5.1: %ptr.f97 = addr_of %instance.ref.loc26 +// CHECK:STDOUT: %.loc26_5.1: ref %Protected = deref %addr.loc26_5.1 +// CHECK:STDOUT: %.loc26_5.2: ref %Base = class_element_access %.loc26_5.1, element0 +// CHECK:STDOUT: %addr.loc26_5.2: %ptr.fb2 = addr_of %.loc26_5.2 +// CHECK:STDOUT: %.loc26_5.3: %ptr.fb2 = converted %addr.loc26_5.1, %addr.loc26_5.2 +// CHECK:STDOUT: %Base.ProtectedInstance.call: init %empty_tuple.type = call imports.%Base.ProtectedInstance.decl(%.loc26_5.3) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: From 6fc59fba25860664f376d2d60f10c0344c5fa511 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:07:54 +0200 Subject: [PATCH 07/20] Move coverage for private base class. --- .../testdata/interop/cpp/class/access.carbon | 127 +++++++++++++++++- 1 file changed, 123 insertions(+), 4 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index c42b6d72b05e8..0022a97332027 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -994,19 +994,138 @@ fn Call(var instance: Cpp.Protected) { instance.PrivateInstance(); } -// --- fail_import_base_class_private.carbon +// --- fail_base_class_private_access_disallowed.carbon library "[[@TEST_NAME]]"; import Cpp library "base_class.h"; -fn F() { - // CHECK:STDERR: fail_import_base_class_private.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] +class Derived { + extend base: Cpp.Private; + + fn CallStatic() { + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Private.PublicStatic(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.PublicStatic(); + + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Private.ProtectedStatic(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.ProtectedStatic(); + + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Private.PrivateStatic(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.PrivateStatic(); + } + + fn CallInstance(var instance: Cpp.Private) { + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PublicInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PublicInstance(); + + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.ProtectedInstance(); + + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); + } +} + +fn Call(var instance: Cpp.Private) { + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Private.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_import_base_class_private.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Private.PublicStatic(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PublicStatic(); + + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Private.ProtectedStatic(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.ProtectedStatic(); + + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.Private.PrivateStatic(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PrivateStatic(); + + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PublicInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PublicInstance(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.ProtectedInstance(); + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); } // --- fail_layered_inheritance.carbon From db3e0f16cf4b7cb3c11eb4e8447dd7abb13042e7 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:10:17 +0200 Subject: [PATCH 08/20] Move coverage for public base class of a private base class. --- .../testdata/interop/cpp/class/access.carbon | 149 +++++++++++------- 1 file changed, 96 insertions(+), 53 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 0022a97332027..fca3554b2604d 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -1128,7 +1128,7 @@ fn Call(var instance: Cpp.Private) { instance.PrivateInstance(); } -// --- fail_layered_inheritance.carbon +// --- fail_base_class_public_private_access_disallowed.carbon library "[[@TEST_NAME]]"; @@ -1138,87 +1138,130 @@ class Derived { extend base: Cpp.PublicPrivate; fn CallStatic() { - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicPrivate.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicPrivate.PublicStatic(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PublicStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicPrivate.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicPrivate.ProtectedStatic(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.ProtectedStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicPrivate.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicPrivate.PrivateStatic(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PrivateStatic(); } - fn CallInstance[self: Self]() { - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] - // CHECK:STDERR: self.PublicInstance(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - self.PublicInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] - // CHECK:STDERR: self.ProtectedInstance(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - self.ProtectedInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] - // CHECK:STDERR: self.PrivateInstance(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - self.PrivateInstance(); - } - - fn Call(instance: Derived) { - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] - // CHECK:STDERR: Derived.PublicStatic(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - Derived.PublicStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] - // CHECK:STDERR: Derived.ProtectedStatic(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - Derived.ProtectedStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] - // CHECK:STDERR: Derived.PrivateStatic(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] - // CHECK:STDERR: - Derived.PrivateStatic(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + fn CallInstance(var instance: Cpp.PublicPrivate) { + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_layered_inheritance.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_layered_inheritance.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } } +fn Call(var instance: Cpp.PublicPrivate) { + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicPrivate.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicPrivate.PublicStatic(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PublicStatic(); + + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicPrivate.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicPrivate.ProtectedStatic(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.ProtectedStatic(); + + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicPrivate.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicPrivate.PrivateStatic(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PrivateStatic(); + + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PublicInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PublicInstance(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.ProtectedInstance(); + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); +} + // CHECK:STDOUT: --- import_non_function_member_public.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { From 15318cb656934e32f9d39ad14215048c7ea11e4b Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:17:06 +0200 Subject: [PATCH 09/20] Coverage for public base class of a protected base class. --- .../testdata/interop/cpp/class/access.carbon | 237 ++++++++++++++++++ 1 file changed, 237 insertions(+) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index fca3554b2604d..964cf83a8ba2b 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -749,6 +749,7 @@ class Public : public Base {}; class Protected : protected Base {}; class Private : private Base {}; +class PublicProtected : public Protected {}; class PublicPrivate : public Private {}; // --- base_class_public_access_allowed.carbon @@ -1128,6 +1129,131 @@ fn Call(var instance: Cpp.Private) { instance.PrivateInstance(); } +// --- base_class_public_protected_access_allowed.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "base_class.h"; + +class Derived { + extend base: Cpp.PublicProtected; + + fn CallStatic() { + //@dump-sem-ir-begin + // OK, we can access a public member of our base class. + Cpp.PublicProtected.PublicStatic(); + Self.PublicStatic(); + + // OK, we can access a protected member of our base class. + Cpp.PublicProtected.ProtectedStatic(); + Self.ProtectedStatic(); + //@dump-sem-ir-end + } + + fn CallInstance(var instance: Cpp.PublicProtected) { + //@dump-sem-ir-begin + // OK, we can access a public member of our base class. + instance.PublicInstance(); + // OK, we can access a protected member of our base class. + instance.ProtectedInstance(); + //@dump-sem-ir-end + } +} + +// --- fail_base_class_public_protected_access_disallowed.carbon + +library "[[@TEST_NAME]]"; + +import Cpp library "base_class.h"; + +class Derived { + extend base: Cpp.PublicProtected; + + fn CallStatic() { + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicProtected.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicProtected.PrivateStatic(); + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Self.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Self.PrivateStatic(); + } + + fn CallInstance(var instance: Cpp.PublicProtected) { + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); + } +} + +fn Call(var instance: Cpp.PublicProtected) { + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicProtected.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicProtected.PublicStatic(); + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PublicStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PublicStatic(); + + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicProtected.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicProtected.ProtectedStatic(); + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.ProtectedStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.ProtectedStatic(); + + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.PublicProtected.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Cpp.PublicProtected.PrivateStatic(); + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Derived.PrivateStatic(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + Derived.PrivateStatic(); + + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PublicInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PublicInstance(); + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.ProtectedInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.ProtectedInstance(); + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: instance.PrivateInstance(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: + instance.PrivateInstance(); +} + // --- fail_base_class_public_private_access_disallowed.carbon library "[[@TEST_NAME]]"; @@ -2085,3 +2211,114 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: +// CHECK:STDOUT: --- base_class_public_protected_access_allowed.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %PublicProtected: type = class_type @PublicProtected [concrete] +// CHECK:STDOUT: %Protected: type = class_type @Protected [concrete] +// CHECK:STDOUT: %Base: type = class_type @Base [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %PublicProtected.PublicStatic.cpp_overload_set.type: type = cpp_overload_set_type @PublicProtected.PublicStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicProtected.PublicStatic.cpp_overload_set.value: %PublicProtected.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.PublicStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.PublicStatic.type: type = fn_type @Base.PublicStatic [concrete] +// CHECK:STDOUT: %Base.PublicStatic: %Base.PublicStatic.type = struct_value () [concrete] +// CHECK:STDOUT: %PublicProtected.ProtectedStatic.cpp_overload_set.type: type = cpp_overload_set_type @PublicProtected.ProtectedStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicProtected.ProtectedStatic.cpp_overload_set.value: %PublicProtected.ProtectedStatic.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.ProtectedStatic.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.ProtectedStatic.type: type = fn_type @Base.ProtectedStatic [concrete] +// CHECK:STDOUT: %Base.ProtectedStatic: %Base.ProtectedStatic.type = struct_value () [concrete] +// CHECK:STDOUT: %PublicProtected.PublicInstance.cpp_overload_set.type: type = cpp_overload_set_type @PublicProtected.PublicInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicProtected.PublicInstance.cpp_overload_set.value: %PublicProtected.PublicInstance.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.PublicInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.fb2: type = ptr_type %Base [concrete] +// CHECK:STDOUT: %Base.PublicInstance.type: type = fn_type @Base.PublicInstance [concrete] +// CHECK:STDOUT: %Base.PublicInstance: %Base.PublicInstance.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.dc4: type = ptr_type %PublicProtected [concrete] +// CHECK:STDOUT: %PublicProtected.ProtectedInstance.cpp_overload_set.type: type = cpp_overload_set_type @PublicProtected.ProtectedInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicProtected.ProtectedInstance.cpp_overload_set.value: %PublicProtected.ProtectedInstance.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.ProtectedInstance.cpp_overload_set [concrete] +// CHECK:STDOUT: %Base.ProtectedInstance.type: type = fn_type @Base.ProtectedInstance [concrete] +// CHECK:STDOUT: %Base.ProtectedInstance: %Base.ProtectedInstance.type = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { +// CHECK:STDOUT: .PublicProtected = %PublicProtected.decl +// CHECK:STDOUT: import Cpp//... +// CHECK:STDOUT: } +// CHECK:STDOUT: %PublicProtected.decl: type = class_decl @PublicProtected [concrete = constants.%PublicProtected] {} {} +// CHECK:STDOUT: %PublicProtected.PublicStatic.cpp_overload_set.value: %PublicProtected.PublicStatic.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.PublicStatic.cpp_overload_set [concrete = constants.%PublicProtected.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.decl: %Base.PublicStatic.type = fn_decl @Base.PublicStatic [concrete = constants.%Base.PublicStatic] {} {} +// CHECK:STDOUT: %PublicProtected.ProtectedStatic.cpp_overload_set.value: %PublicProtected.ProtectedStatic.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.ProtectedStatic.cpp_overload_set [concrete = constants.%PublicProtected.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.decl: %Base.ProtectedStatic.type = fn_decl @Base.ProtectedStatic [concrete = constants.%Base.ProtectedStatic] {} {} +// CHECK:STDOUT: %PublicProtected.PublicInstance.cpp_overload_set.value: %PublicProtected.PublicInstance.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.PublicInstance.cpp_overload_set [concrete = constants.%PublicProtected.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicInstance.decl: %Base.PublicInstance.type = fn_decl @Base.PublicInstance [concrete = constants.%Base.PublicInstance] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %PublicProtected.ProtectedInstance.cpp_overload_set.value: %PublicProtected.ProtectedInstance.cpp_overload_set.type = cpp_overload_set_value @PublicProtected.ProtectedInstance.cpp_overload_set [concrete = constants.%PublicProtected.ProtectedInstance.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedInstance.decl: %Base.ProtectedInstance.type = fn_decl @Base.ProtectedInstance [concrete = constants.%Base.ProtectedInstance] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @Derived { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%Derived +// CHECK:STDOUT: .Cpp = +// CHECK:STDOUT: .base = %.loc7 +// CHECK:STDOUT: .CallStatic = %Derived.CallStatic.decl +// CHECK:STDOUT: .CallInstance = %Derived.CallInstance.decl +// CHECK:STDOUT: .PublicStatic = +// CHECK:STDOUT: .ProtectedStatic = +// CHECK:STDOUT: extend %PublicProtected.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.CallStatic() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Cpp.ref.loc12: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicProtected.ref.loc12: type = name_ref PublicProtected, imports.%PublicProtected.decl [concrete = constants.%PublicProtected] +// CHECK:STDOUT: %PublicStatic.ref.loc12: %PublicProtected.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%PublicProtected.PublicStatic.cpp_overload_set.value [concrete = constants.%PublicProtected.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc12: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Self.ref.loc13: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] +// CHECK:STDOUT: %PublicStatic.ref.loc13: %PublicProtected.PublicStatic.cpp_overload_set.type = name_ref PublicStatic, imports.%PublicProtected.PublicStatic.cpp_overload_set.value [concrete = constants.%PublicProtected.PublicStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.PublicStatic.call.loc13: init %empty_tuple.type = call imports.%Base.PublicStatic.decl() +// CHECK:STDOUT: %Cpp.ref.loc16: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicProtected.ref.loc16: type = name_ref PublicProtected, imports.%PublicProtected.decl [concrete = constants.%PublicProtected] +// CHECK:STDOUT: %ProtectedStatic.ref.loc16: %PublicProtected.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%PublicProtected.ProtectedStatic.cpp_overload_set.value [concrete = constants.%PublicProtected.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.call.loc16: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() +// CHECK:STDOUT: %Self.ref.loc17: type = name_ref Self, constants.%Derived [concrete = constants.%Derived] +// CHECK:STDOUT: %ProtectedStatic.ref.loc17: %PublicProtected.ProtectedStatic.cpp_overload_set.type = name_ref ProtectedStatic, imports.%PublicProtected.ProtectedStatic.cpp_overload_set.value [concrete = constants.%PublicProtected.ProtectedStatic.cpp_overload_set.value] +// CHECK:STDOUT: %Base.ProtectedStatic.call.loc17: init %empty_tuple.type = call imports.%Base.ProtectedStatic.decl() +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @Derived.CallInstance(%instance.param: %PublicProtected) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %instance.ref.loc24: ref %PublicProtected = name_ref instance, %instance +// CHECK:STDOUT: %PublicInstance.ref: %PublicProtected.PublicInstance.cpp_overload_set.type = name_ref PublicInstance, imports.%PublicProtected.PublicInstance.cpp_overload_set.value [concrete = constants.%PublicProtected.PublicInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc24: = bound_method %instance.ref.loc24, %PublicInstance.ref +// CHECK:STDOUT: %addr.loc24_5.1: %ptr.dc4 = addr_of %instance.ref.loc24 +// CHECK:STDOUT: %.loc24_5.1: ref %PublicProtected = deref %addr.loc24_5.1 +// CHECK:STDOUT: %.loc24_5.2: ref %Protected = class_element_access %.loc24_5.1, element0 +// CHECK:STDOUT: %.loc24_5.3: ref %Base = class_element_access %.loc24_5.2, element0 +// CHECK:STDOUT: %addr.loc24_5.2: %ptr.fb2 = addr_of %.loc24_5.3 +// CHECK:STDOUT: %.loc24_5.4: %ptr.fb2 = converted %addr.loc24_5.1, %addr.loc24_5.2 +// CHECK:STDOUT: %Base.PublicInstance.call: init %empty_tuple.type = call imports.%Base.PublicInstance.decl(%.loc24_5.4) +// CHECK:STDOUT: %instance.ref.loc26: ref %PublicProtected = name_ref instance, %instance +// CHECK:STDOUT: %ProtectedInstance.ref: %PublicProtected.ProtectedInstance.cpp_overload_set.type = name_ref ProtectedInstance, imports.%PublicProtected.ProtectedInstance.cpp_overload_set.value [concrete = constants.%PublicProtected.ProtectedInstance.cpp_overload_set.value] +// CHECK:STDOUT: %bound_method.loc26: = bound_method %instance.ref.loc26, %ProtectedInstance.ref +// CHECK:STDOUT: %addr.loc26_5.1: %ptr.dc4 = addr_of %instance.ref.loc26 +// CHECK:STDOUT: %.loc26_5.1: ref %PublicProtected = deref %addr.loc26_5.1 +// CHECK:STDOUT: %.loc26_5.2: ref %Protected = class_element_access %.loc26_5.1, element0 +// CHECK:STDOUT: %.loc26_5.3: ref %Base = class_element_access %.loc26_5.2, element0 +// CHECK:STDOUT: %addr.loc26_5.2: %ptr.fb2 = addr_of %.loc26_5.3 +// CHECK:STDOUT: %.loc26_5.4: %ptr.fb2 = converted %addr.loc26_5.1, %addr.loc26_5.2 +// CHECK:STDOUT: %Base.ProtectedInstance.call: init %empty_tuple.type = call imports.%Base.ProtectedInstance.decl(%.loc26_5.4) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: From 9dad5ab93c1c0fa8e6d2064d89aa0c610f325050 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:21:28 +0200 Subject: [PATCH 10/20] Use `UnresolvedSetIterator::getPair()`. --- toolchain/check/cpp/import.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index fbb4255ce2465..af5fba36a15d5 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2019,8 +2019,7 @@ auto ImportCppFunctionDecl(Context& context, SemIR::LocId loc_id, // Calculates the access given `UnresolvedSetIterator`. static auto MapAccess(clang::UnresolvedSetIterator iterator) -> SemIR::AccessKind { - return ConvertCppAccess( - clang::DeclAccessPair::make(*iterator, iterator.getAccess())); + return ConvertCppAccess(iterator.getPair()); } // Imports a Clang declaration into Carbon and adds that name into the From 6bdde04c0de4419974aa6f66293cda7a02e382c0 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:25:19 +0200 Subject: [PATCH 11/20] Simplify iterating over overload set to calculate access. --- toolchain/check/cpp/import.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index af5fba36a15d5..057becaede85e 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2123,8 +2123,8 @@ auto ImportCppOverloadSet( // after overload resolution. static auto GetOverloadSetAccess(const clang::UnresolvedSet<4>& overload_set) -> SemIR::AccessKind { - SemIR::AccessKind access_kind = MapAccess(overload_set.begin()); - for (auto it = overload_set.begin() + 1; + SemIR::AccessKind access_kind = SemIR::AccessKind::Private; + for (auto it = overload_set.begin(); it != overload_set.end() && access_kind != SemIR::AccessKind::Public; ++it) { access_kind = std::min(access_kind, MapAccess(it)); From 37ee14b0221cfa07c10d525b40ecc5c62d2b69bb Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:26:49 +0200 Subject: [PATCH 12/20] Move the public shortcut when iterating over overload set to a separte condition with a break. --- toolchain/check/cpp/import.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index 057becaede85e..d732b36d6ef02 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2124,10 +2124,11 @@ auto ImportCppOverloadSet( static auto GetOverloadSetAccess(const clang::UnresolvedSet<4>& overload_set) -> SemIR::AccessKind { SemIR::AccessKind access_kind = SemIR::AccessKind::Private; - for (auto it = overload_set.begin(); - it != overload_set.end() && access_kind != SemIR::AccessKind::Public; - ++it) { + for (auto it = overload_set.begin(); it != overload_set.end(); ++it) { access_kind = std::min(access_kind, MapAccess(it)); + if (access_kind == SemIR::AccessKind::Public) { + break; + } } return access_kind; } From 3bd78275c150048df3bd7dde503a7c66739f437c Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:33:39 +0200 Subject: [PATCH 13/20] Iterate over `DeclAccessPair` and remove `MapAccess`. --- toolchain/check/cpp/import.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index d732b36d6ef02..b78ccdb3c1f5d 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2016,12 +2016,6 @@ auto ImportCppFunctionDecl(Context& context, SemIR::LocId loc_id, SemIR::ClangDeclKey::ForFunctionDecl(clang_decl, num_params)); } -// Calculates the access given `UnresolvedSetIterator`. -static auto MapAccess(clang::UnresolvedSetIterator iterator) - -> SemIR::AccessKind { - return ConvertCppAccess(iterator.getPair()); -} - // Imports a Clang declaration into Carbon and adds that name into the // `NameScope`. static auto ImportNameDeclIntoScope(Context& context, SemIR::LocId loc_id, @@ -2124,8 +2118,8 @@ auto ImportCppOverloadSet( static auto GetOverloadSetAccess(const clang::UnresolvedSet<4>& overload_set) -> SemIR::AccessKind { SemIR::AccessKind access_kind = SemIR::AccessKind::Private; - for (auto it = overload_set.begin(); it != overload_set.end(); ++it) { - access_kind = std::min(access_kind, MapAccess(it)); + for (clang::DeclAccessPair overload : overload_set.pairs()) { + access_kind = std::min(access_kind, ConvertCppAccess(overload)); if (access_kind == SemIR::AccessKind::Public) { break; } @@ -2251,7 +2245,7 @@ auto ImportNameFromCpp(Context& context, SemIR::LocId loc_id, } auto key = SemIR::ClangDeclKey::ForNonFunctionDecl(lookup->getFoundDecl()); return ImportNameDeclIntoScope(context, loc_id, scope_id, name_id, key, - MapAccess(lookup->begin())); + ConvertCppAccess(lookup->begin().getPair())); } auto ImportClassDefinitionForClangDecl(Context& context, SemIR::LocId loc_id, From 62d4dcba1aab78f8f17860c300d898c1e61d527d Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:47:05 +0200 Subject: [PATCH 14/20] Add a comment on why we use `.getAccess()` and not `->getAccess()`. --- toolchain/check/cpp/access.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/toolchain/check/cpp/access.cpp b/toolchain/check/cpp/access.cpp index 9cdce92fc571b..cf1e398c8492d 100644 --- a/toolchain/check/cpp/access.cpp +++ b/toolchain/check/cpp/access.cpp @@ -8,6 +8,9 @@ namespace Carbon::Check { static auto CalculateEffectiveAccess(clang::DeclAccessPair access_pair) -> clang::AccessSpecifier { + // Note that we use `.getAccess()` here, not `->getAccess()`, which is + // equivalent to `.getDecl()->getAccess()`, because we want to consider the + // lookup access and not the lexical access. switch (access_pair.getAccess()) { // Lookup access takes precedence. case clang::AS_public: From a2a464fb635095a36b933e78b43c817b284c9f99 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:48:28 +0200 Subject: [PATCH 15/20] Remove `Derived` suffix from class names to be consistent and concise like other tests. --- .../testdata/interop/cpp/class/access.carbon | 132 +++++++++--------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 964cf83a8ba2b..04e265603137e 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -533,9 +533,9 @@ class D { #include "overload_set.h" -class PublicDerived : public C {}; -class ProtectedDerived : protected C {}; -class PrivateDerived : private C {}; +class Public : public C {}; +class Protected : protected C {}; +class Private : private C {}; // --- import_overload_set_public_base_class_call_public.carbon @@ -545,7 +545,7 @@ import Cpp library "overload_set_base_class.h"; fn F() { //@dump-sem-ir-begin - Cpp.PublicDerived.foo(); + Cpp.Public.foo(); //@dump-sem-ir-end } @@ -556,18 +556,18 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; fn F() { - // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.PublicDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.PublicDerived.foo(1); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Public.foo(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.PublicDerived.foo(1); - // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PublicDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.PublicDerived.foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + Cpp.Public.foo(1); + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Public.foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.PublicDerived.foo(1, 2); + Cpp.Public.foo(1, 2); } // --- import_overload_set_public_base_class_derived_call_non_private.carbon @@ -577,7 +577,7 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; class Derived { - extend base: Cpp.PublicDerived; + extend base: Cpp.Public; fn F() { //@dump-sem-ir-begin @@ -594,10 +594,10 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; class Derived { - extend base: Cpp.PublicDerived; + extend base: Cpp.Public; fn F() { - // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PublicDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: foo(1, 2); // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] @@ -613,24 +613,24 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; fn F() { - // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.ProtectedDerived.foo(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.foo(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.ProtectedDerived.foo(); - // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.ProtectedDerived.foo(1); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + Cpp.Protected.foo(); + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.foo(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.ProtectedDerived.foo(1); - // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.ProtectedDerived.foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + Cpp.Protected.foo(1); + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.ProtectedDerived.foo(1, 2); + Cpp.Protected.foo(1, 2); } // --- import_overload_set_protected_base_class_derived_call_non_private.carbon @@ -640,7 +640,7 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; class Derived { - extend base: Cpp.ProtectedDerived; + extend base: Cpp.Protected; fn F() { //@dump-sem-ir-begin @@ -657,10 +657,10 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; class Derived { - extend base: Cpp.ProtectedDerived; + extend base: Cpp.Protected; fn F() { - // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.ProtectedDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: foo(1, 2); // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] @@ -676,24 +676,24 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; fn F() { - // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.PrivateDerived.foo(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.foo(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.PrivateDerived.foo(); - // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.PrivateDerived.foo(1); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + Cpp.Private.foo(); + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.foo(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.PrivateDerived.foo(1); - // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.PrivateDerived.foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + Cpp.Private.foo(1); + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.foo(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.PrivateDerived.foo(1, 2); + Cpp.Private.foo(1, 2); } // --- fail_import_overload_set_private_base_class_derived.carbon @@ -703,22 +703,22 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; class Derived { - extend base: Cpp.PrivateDerived; + extend base: Cpp.Private; fn F() { - // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: foo(); // CHECK:STDERR: ^~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: foo(); - // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: foo(1); // CHECK:STDERR: ^~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: foo(1); - // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.PrivateDerived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: foo(1, 2); // CHECK:STDERR: ^~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] @@ -1763,28 +1763,28 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %PublicDerived: type = class_type @PublicDerived [concrete] -// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.type: type = cpp_overload_set_type @PublicDerived.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public: type = class_type @Public [concrete] +// CHECK:STDOUT: %Public.foo.cpp_overload_set.type: type = cpp_overload_set_type @Public.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete] // CHECK:STDOUT: %C.foo.type: type = fn_type @C.foo [concrete] // CHECK:STDOUT: %C.foo: %C.foo.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { -// CHECK:STDOUT: .PublicDerived = %PublicDerived.decl +// CHECK:STDOUT: .Public = %Public.decl // CHECK:STDOUT: import Cpp//... // CHECK:STDOUT: } -// CHECK:STDOUT: %PublicDerived.decl: type = class_decl @PublicDerived [concrete = constants.%PublicDerived] {} {} -// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %Public.decl: type = class_decl @Public [concrete = constants.%Public] {} {} +// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete = constants.%Public.foo.cpp_overload_set.value] // CHECK:STDOUT: %C.foo.decl: %C.foo.type = fn_decl @C.foo [concrete = constants.%C.foo] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] -// CHECK:STDOUT: %PublicDerived.ref: type = name_ref PublicDerived, imports.%PublicDerived.decl [concrete = constants.%PublicDerived] -// CHECK:STDOUT: %foo.ref: %PublicDerived.foo.cpp_overload_set.type = name_ref foo, imports.%PublicDerived.foo.cpp_overload_set.value [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %Public.ref: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] +// CHECK:STDOUT: %foo.ref: %Public.foo.cpp_overload_set.type = name_ref foo, imports.%Public.foo.cpp_overload_set.value [concrete = constants.%Public.foo.cpp_overload_set.value] // CHECK:STDOUT: %C.foo.call: init %empty_tuple.type = call imports.%C.foo.decl() // CHECK:STDOUT: // CHECK:STDOUT: } @@ -1794,8 +1794,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.type: type = cpp_overload_set_type @PublicDerived.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.foo.cpp_overload_set.type: type = cpp_overload_set_type @Public.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete] // CHECK:STDOUT: %C.foo.type.54cd32.1: type = fn_type @C.foo.1 [concrete] // CHECK:STDOUT: %C.foo.25ba20.1: %C.foo.type.54cd32.1 = struct_value () [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] @@ -1820,7 +1820,7 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %PublicDerived.foo.cpp_overload_set.value: %PublicDerived.foo.cpp_overload_set.type = cpp_overload_set_value @PublicDerived.foo.cpp_overload_set [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete = constants.%Public.foo.cpp_overload_set.value] // CHECK:STDOUT: %C.foo.decl.10458f.1: %C.foo.type.54cd32.1 = fn_decl @C.foo.1 [concrete = constants.%C.foo.25ba20.1] {} {} // CHECK:STDOUT: %C.foo.decl.10458f.2: %C.foo.type.54cd32.2 = fn_decl @C.foo.2 [concrete = constants.%C.foo.25ba20.2] { // CHECK:STDOUT: @@ -1841,14 +1841,14 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: .base = %.loc7 // CHECK:STDOUT: .F = %Derived.F.decl // CHECK:STDOUT: .foo = -// CHECK:STDOUT: extend %PublicDerived.ref +// CHECK:STDOUT: extend %Public.ref // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.F() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %foo.ref.loc11: %PublicDerived.foo.cpp_overload_set.type = name_ref foo, imports.%PublicDerived.foo.cpp_overload_set.value [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %foo.ref.loc11: %Public.foo.cpp_overload_set.type = name_ref foo, imports.%Public.foo.cpp_overload_set.value [concrete = constants.%Public.foo.cpp_overload_set.value] // CHECK:STDOUT: %C.foo.call.loc11: init %empty_tuple.type = call imports.%C.foo.decl.10458f.1() -// CHECK:STDOUT: %foo.ref.loc12: %PublicDerived.foo.cpp_overload_set.type = name_ref foo, imports.%PublicDerived.foo.cpp_overload_set.value [concrete = constants.%PublicDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %foo.ref.loc12: %Public.foo.cpp_overload_set.type = name_ref foo, imports.%Public.foo.cpp_overload_set.value [concrete = constants.%Public.foo.cpp_overload_set.value] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] // CHECK:STDOUT: %bound_method.loc12_9.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] @@ -1866,8 +1866,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %ProtectedDerived.foo.cpp_overload_set.type: type = cpp_overload_set_type @ProtectedDerived.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %ProtectedDerived.foo.cpp_overload_set.value: %ProtectedDerived.foo.cpp_overload_set.type = cpp_overload_set_value @ProtectedDerived.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %Protected.foo.cpp_overload_set.type: type = cpp_overload_set_type @Protected.foo.cpp_overload_set [concrete] +// CHECK:STDOUT: %Protected.foo.cpp_overload_set.value: %Protected.foo.cpp_overload_set.type = cpp_overload_set_value @Protected.foo.cpp_overload_set [concrete] // CHECK:STDOUT: %C.foo.type.54cd32.1: type = fn_type @C.foo.1 [concrete] // CHECK:STDOUT: %C.foo.25ba20.1: %C.foo.type.54cd32.1 = struct_value () [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] @@ -1892,7 +1892,7 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %ProtectedDerived.foo.cpp_overload_set.value: %ProtectedDerived.foo.cpp_overload_set.type = cpp_overload_set_value @ProtectedDerived.foo.cpp_overload_set [concrete = constants.%ProtectedDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %Protected.foo.cpp_overload_set.value: %Protected.foo.cpp_overload_set.type = cpp_overload_set_value @Protected.foo.cpp_overload_set [concrete = constants.%Protected.foo.cpp_overload_set.value] // CHECK:STDOUT: %C.foo.decl.10458f.1: %C.foo.type.54cd32.1 = fn_decl @C.foo.1 [concrete = constants.%C.foo.25ba20.1] {} {} // CHECK:STDOUT: %C.foo.decl.10458f.2: %C.foo.type.54cd32.2 = fn_decl @C.foo.2 [concrete = constants.%C.foo.25ba20.2] { // CHECK:STDOUT: @@ -1913,14 +1913,14 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: .base = %.loc7 // CHECK:STDOUT: .F = %Derived.F.decl // CHECK:STDOUT: .foo = -// CHECK:STDOUT: extend %ProtectedDerived.ref +// CHECK:STDOUT: extend %Protected.ref // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.F() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %foo.ref.loc11: %ProtectedDerived.foo.cpp_overload_set.type = name_ref foo, imports.%ProtectedDerived.foo.cpp_overload_set.value [concrete = constants.%ProtectedDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %foo.ref.loc11: %Protected.foo.cpp_overload_set.type = name_ref foo, imports.%Protected.foo.cpp_overload_set.value [concrete = constants.%Protected.foo.cpp_overload_set.value] // CHECK:STDOUT: %C.foo.call.loc11: init %empty_tuple.type = call imports.%C.foo.decl.10458f.1() -// CHECK:STDOUT: %foo.ref.loc12: %ProtectedDerived.foo.cpp_overload_set.type = name_ref foo, imports.%ProtectedDerived.foo.cpp_overload_set.value [concrete = constants.%ProtectedDerived.foo.cpp_overload_set.value] +// CHECK:STDOUT: %foo.ref.loc12: %Protected.foo.cpp_overload_set.type = name_ref foo, imports.%Protected.foo.cpp_overload_set.value [concrete = constants.%Protected.foo.cpp_overload_set.value] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] // CHECK:STDOUT: %bound_method.loc12_9.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] From 7593a35f2dfbb744a6c29b30842398c182428c82 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:50:04 +0200 Subject: [PATCH 16/20] Rename `foo()` to `Overload()`. --- .../testdata/interop/cpp/class/access.carbon | 258 +++++++++--------- 1 file changed, 129 insertions(+), 129 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 04e265603137e..8094ebadf7009 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -409,13 +409,13 @@ fn F(c: Cpp.C*) { class C { public: C(); - static auto foo() -> void; + static auto Overload() -> void; protected: C(int); - static auto foo(int a) -> void; + static auto Overload(int a) -> void; private: C(int, int); - static auto foo(int a, int b) -> void; + static auto Overload(int a, int b) -> void; }; // --- import_overload_set_public.carbon @@ -427,7 +427,7 @@ import Cpp library "overload_set.h"; fn F() { //@dump-sem-ir-begin Cpp.C.C(); - Cpp.C.foo(); + Cpp.C.Overload(); //@dump-sem-ir-end } @@ -445,12 +445,12 @@ fn F() { // CHECK:STDERR: Cpp.C.C(1 as i32); - // CHECK:STDERR: fail_import_overload_set_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.C.foo(1 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.C` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.C.Overload(1 as i32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.C.foo(1 as i32); + Cpp.C.Overload(1 as i32); } // --- import_overload_set_protected_base.carbon @@ -471,11 +471,11 @@ class D { } fn CallPublic() { - foo(); + Overload(); } fn CallProtected() { - foo(1 as i32); + Overload(1 as i32); } } @@ -493,12 +493,12 @@ fn F() { // CHECK:STDERR: Cpp.C.C(1 as i32, 2 as i32); - // CHECK:STDERR: fail_import_overload_set_private.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.C.foo(1 as i32, 2 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.C` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.C.Overload(1 as i32, 2 as i32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.C.foo(1 as i32, 2 as i32); + Cpp.C.Overload(1 as i32, 2 as i32); } // --- fail_import_overload_set_private_base.carbon @@ -520,12 +520,12 @@ class D { } fn CallPrivate() { - // CHECK:STDERR: fail_import_overload_set_private_base.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: foo(1 as i32, 2 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.C` [ClassInvalidMemberAccess] + // CHECK:STDERR: Overload(1 as i32, 2 as i32); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - foo(1 as i32, 2 as i32); + Overload(1 as i32, 2 as i32); } } @@ -545,7 +545,7 @@ import Cpp library "overload_set_base_class.h"; fn F() { //@dump-sem-ir-begin - Cpp.Public.foo(); + Cpp.Public.Overload(); //@dump-sem-ir-end } @@ -556,18 +556,18 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; fn F() { - // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Public` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Public.foo(1); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Public.Overload(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Public.foo(1); - // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Public` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Public.foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ + Cpp.Public.Overload(1); + // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Public.Overload(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Public.foo(1, 2); + Cpp.Public.Overload(1, 2); } // --- import_overload_set_public_base_class_derived_call_non_private.carbon @@ -581,8 +581,8 @@ class Derived { fn F() { //@dump-sem-ir-begin - foo(); - foo(1); + Overload(); + Overload(1); //@dump-sem-ir-end } } @@ -597,12 +597,12 @@ class Derived { extend base: Cpp.Public; fn F() { - // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Public` [ClassInvalidMemberAccess] - // CHECK:STDERR: foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: Overload(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - foo(1, 2); + Overload(1, 2); } } @@ -613,24 +613,24 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; fn F() { - // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Protected.foo(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.Overload(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Protected.foo(); - // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Protected.foo(1); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + Cpp.Protected.Overload(); + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.Overload(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Protected.foo(1); - // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Protected.foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + Cpp.Protected.Overload(1); + // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Protected.Overload(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Protected.foo(1, 2); + Cpp.Protected.Overload(1, 2); } // --- import_overload_set_protected_base_class_derived_call_non_private.carbon @@ -644,8 +644,8 @@ class Derived { fn F() { //@dump-sem-ir-begin - foo(); - foo(1); + Overload(); + Overload(1); //@dump-sem-ir-end } } @@ -660,12 +660,12 @@ class Derived { extend base: Cpp.Protected; fn F() { - // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: Overload(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - foo(1, 2); + Overload(1, 2); } } @@ -676,24 +676,24 @@ library "[[@TEST_NAME]]"; import Cpp library "overload_set_base_class.h"; fn F() { - // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Private.foo(); - // CHECK:STDERR: ^~~~~~~~~~~~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.Overload(); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Private.foo(); - // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Private.foo(1); - // CHECK:STDERR: ^~~~~~~~~~~~~~~ + Cpp.Private.Overload(); + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.Overload(1); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Private.foo(1); - // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Private.foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~~ + Cpp.Private.Overload(1); + // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Cpp.Private.Overload(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Private.foo(1, 2); + Cpp.Private.Overload(1, 2); } // --- fail_import_overload_set_private_base_class_derived.carbon @@ -706,24 +706,24 @@ class Derived { extend base: Cpp.Private; fn F() { - // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: foo(); - // CHECK:STDERR: ^~~~~ + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Overload(); + // CHECK:STDERR: ^~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - foo(); - // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: foo(1); - // CHECK:STDERR: ^~~~~~ + Overload(); + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Overload(1); + // CHECK:STDERR: ^~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - foo(1); - // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `foo` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: foo(1, 2); - // CHECK:STDERR: ^~~~~~~~~ + Overload(1); + // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: Overload(1, 2); + // CHECK:STDERR: ^~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - foo(1, 2); + Overload(1, 2); } } @@ -1711,10 +1711,10 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %ptr.d9e: type = ptr_type %C [concrete] // CHECK:STDOUT: %C__carbon_thunk.type: type = fn_type @C__carbon_thunk [concrete] // CHECK:STDOUT: %C__carbon_thunk: %C__carbon_thunk.type = struct_value () [concrete] -// CHECK:STDOUT: %C.foo.cpp_overload_set.type: type = cpp_overload_set_type @C.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.foo.cpp_overload_set.value: %C.foo.cpp_overload_set.type = cpp_overload_set_value @C.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.foo.type: type = fn_type @C.foo [concrete] -// CHECK:STDOUT: %C.foo: %C.foo.type = struct_value () [concrete] +// CHECK:STDOUT: %C.Overload.cpp_overload_set.type: type = cpp_overload_set_type @C.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.Overload.cpp_overload_set.value: %C.Overload.cpp_overload_set.type = cpp_overload_set_value @C.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.Overload.type: type = fn_type @C.Overload [concrete] +// CHECK:STDOUT: %C.Overload: %C.Overload.type = struct_value () [concrete] // CHECK:STDOUT: %type_where: type = facet_type > [concrete] // CHECK:STDOUT: %facet_value: %type_where = facet_value %C, () [concrete] // CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b92: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [concrete] @@ -1733,8 +1733,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } -// CHECK:STDOUT: %C.foo.cpp_overload_set.value: %C.foo.cpp_overload_set.type = cpp_overload_set_value @C.foo.cpp_overload_set [concrete = constants.%C.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.decl: %C.foo.type = fn_decl @C.foo [concrete = constants.%C.foo] {} {} +// CHECK:STDOUT: %C.Overload.cpp_overload_set.value: %C.Overload.cpp_overload_set.type = cpp_overload_set_value @C.Overload.cpp_overload_set [concrete = constants.%C.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.decl: %C.Overload.type = fn_decl @C.Overload [concrete = constants.%C.Overload] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { @@ -1749,8 +1749,8 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %.loc8_11.3: ref %C = temporary %.loc8_11.1, %.loc8_11.2 // CHECK:STDOUT: %Cpp.ref.loc9: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %C.ref.loc9: type = name_ref C, imports.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %foo.ref: %C.foo.cpp_overload_set.type = name_ref foo, imports.%C.foo.cpp_overload_set.value [concrete = constants.%C.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.call: init %empty_tuple.type = call imports.%C.foo.decl() +// CHECK:STDOUT: %Overload.ref: %C.Overload.cpp_overload_set.type = name_ref Overload, imports.%C.Overload.cpp_overload_set.value [concrete = constants.%C.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.call: init %empty_tuple.type = call imports.%C.Overload.decl() // CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: = bound_method %.loc8_11.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.841 // CHECK:STDOUT: // CHECK:STDOUT: %bound_method: = bound_method %.loc8_11.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn @@ -1764,10 +1764,10 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Public: type = class_type @Public [concrete] -// CHECK:STDOUT: %Public.foo.cpp_overload_set.type: type = cpp_overload_set_type @Public.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.foo.type: type = fn_type @C.foo [concrete] -// CHECK:STDOUT: %C.foo: %C.foo.type = struct_value () [concrete] +// CHECK:STDOUT: %Public.Overload.cpp_overload_set.type: type = cpp_overload_set_type @Public.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.Overload.type: type = fn_type @C.Overload [concrete] +// CHECK:STDOUT: %C.Overload: %C.Overload.type = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { @@ -1776,16 +1776,16 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: import Cpp//... // CHECK:STDOUT: } // CHECK:STDOUT: %Public.decl: type = class_decl @Public [concrete = constants.%Public] {} {} -// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete = constants.%Public.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.decl: %C.foo.type = fn_decl @C.foo [concrete = constants.%C.foo] {} {} +// CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete = constants.%Public.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.decl: %C.Overload.type = fn_decl @C.Overload [concrete = constants.%C.Overload] {} {} // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %Public.ref: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] -// CHECK:STDOUT: %foo.ref: %Public.foo.cpp_overload_set.type = name_ref foo, imports.%Public.foo.cpp_overload_set.value [concrete = constants.%Public.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.call: init %empty_tuple.type = call imports.%C.foo.decl() +// CHECK:STDOUT: %Overload.ref: %Public.Overload.cpp_overload_set.type = name_ref Overload, imports.%Public.Overload.cpp_overload_set.value [concrete = constants.%Public.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.call: init %empty_tuple.type = call imports.%C.Overload.decl() // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1794,15 +1794,15 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Public.foo.cpp_overload_set.type: type = cpp_overload_set_type @Public.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.foo.type.54cd32.1: type = fn_type @C.foo.1 [concrete] -// CHECK:STDOUT: %C.foo.25ba20.1: %C.foo.type.54cd32.1 = struct_value () [concrete] +// CHECK:STDOUT: %Public.Overload.cpp_overload_set.type: type = cpp_overload_set_type @Public.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.Overload.type.fd2af6.1: type = fn_type @C.Overload.1 [concrete] +// CHECK:STDOUT: %C.Overload.5043eb.1: %C.Overload.type.fd2af6.1 = struct_value () [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %C.foo.type.54cd32.2: type = fn_type @C.foo.2 [concrete] -// CHECK:STDOUT: %C.foo.25ba20.2: %C.foo.type.54cd32.2 = struct_value () [concrete] +// CHECK:STDOUT: %C.Overload.type.fd2af6.2: type = fn_type @C.Overload.2 [concrete] +// CHECK:STDOUT: %C.Overload.5043eb.2: %C.Overload.type.fd2af6.2 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.d14: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] // CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] // CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] @@ -1820,9 +1820,9 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Public.foo.cpp_overload_set.value: %Public.foo.cpp_overload_set.type = cpp_overload_set_value @Public.foo.cpp_overload_set [concrete = constants.%Public.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.decl.10458f.1: %C.foo.type.54cd32.1 = fn_decl @C.foo.1 [concrete = constants.%C.foo.25ba20.1] {} {} -// CHECK:STDOUT: %C.foo.decl.10458f.2: %C.foo.type.54cd32.2 = fn_decl @C.foo.2 [concrete = constants.%C.foo.25ba20.2] { +// CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete = constants.%Public.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.decl.b29afa.1: %C.Overload.type.fd2af6.1 = fn_decl @C.Overload.1 [concrete = constants.%C.Overload.5043eb.1] {} {} +// CHECK:STDOUT: %C.Overload.decl.b29afa.2: %C.Overload.type.fd2af6.2 = fn_decl @C.Overload.2 [concrete = constants.%C.Overload.5043eb.2] { // CHECK:STDOUT: // CHECK:STDOUT: } { // CHECK:STDOUT: @@ -1840,24 +1840,24 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: .Cpp = // CHECK:STDOUT: .base = %.loc7 // CHECK:STDOUT: .F = %Derived.F.decl -// CHECK:STDOUT: .foo = +// CHECK:STDOUT: .Overload = // CHECK:STDOUT: extend %Public.ref // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.F() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %foo.ref.loc11: %Public.foo.cpp_overload_set.type = name_ref foo, imports.%Public.foo.cpp_overload_set.value [concrete = constants.%Public.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.call.loc11: init %empty_tuple.type = call imports.%C.foo.decl.10458f.1() -// CHECK:STDOUT: %foo.ref.loc12: %Public.foo.cpp_overload_set.type = name_ref foo, imports.%Public.foo.cpp_overload_set.value [concrete = constants.%Public.foo.cpp_overload_set.value] +// CHECK:STDOUT: %Overload.ref.loc11: %Public.Overload.cpp_overload_set.type = name_ref Overload, imports.%Public.Overload.cpp_overload_set.value [concrete = constants.%Public.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.call.loc11: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.1() +// CHECK:STDOUT: %Overload.ref.loc12: %Public.Overload.cpp_overload_set.type = name_ref Overload, imports.%Public.Overload.cpp_overload_set.value [concrete = constants.%Public.Overload.cpp_overload_set.value] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] -// CHECK:STDOUT: %bound_method.loc12_9.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %bound_method.loc12_14.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc12_9.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_9.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_9.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_9.2: %i32 = converted %int_1, %.loc12_9.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %C.foo.call.loc12: init %empty_tuple.type = call imports.%C.foo.decl.10458f.2(%.loc12_9.2) +// CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_14.2(%int_1) [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_14.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_14.2: %i32 = converted %int_1, %.loc12_14.1 [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %C.Overload.call.loc12: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.2(%.loc12_14.2) // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1866,15 +1866,15 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Protected.foo.cpp_overload_set.type: type = cpp_overload_set_type @Protected.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %Protected.foo.cpp_overload_set.value: %Protected.foo.cpp_overload_set.type = cpp_overload_set_value @Protected.foo.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.foo.type.54cd32.1: type = fn_type @C.foo.1 [concrete] -// CHECK:STDOUT: %C.foo.25ba20.1: %C.foo.type.54cd32.1 = struct_value () [concrete] +// CHECK:STDOUT: %Protected.Overload.cpp_overload_set.type: type = cpp_overload_set_type @Protected.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %Protected.Overload.cpp_overload_set.value: %Protected.Overload.cpp_overload_set.type = cpp_overload_set_value @Protected.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.Overload.type.fd2af6.1: type = fn_type @C.Overload.1 [concrete] +// CHECK:STDOUT: %C.Overload.5043eb.1: %C.Overload.type.fd2af6.1 = struct_value () [concrete] // CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %C.foo.type.54cd32.2: type = fn_type @C.foo.2 [concrete] -// CHECK:STDOUT: %C.foo.25ba20.2: %C.foo.type.54cd32.2 = struct_value () [concrete] +// CHECK:STDOUT: %C.Overload.type.fd2af6.2: type = fn_type @C.Overload.2 [concrete] +// CHECK:STDOUT: %C.Overload.5043eb.2: %C.Overload.type.fd2af6.2 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.d14: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] // CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] // CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] @@ -1892,9 +1892,9 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { -// CHECK:STDOUT: %Protected.foo.cpp_overload_set.value: %Protected.foo.cpp_overload_set.type = cpp_overload_set_value @Protected.foo.cpp_overload_set [concrete = constants.%Protected.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.decl.10458f.1: %C.foo.type.54cd32.1 = fn_decl @C.foo.1 [concrete = constants.%C.foo.25ba20.1] {} {} -// CHECK:STDOUT: %C.foo.decl.10458f.2: %C.foo.type.54cd32.2 = fn_decl @C.foo.2 [concrete = constants.%C.foo.25ba20.2] { +// CHECK:STDOUT: %Protected.Overload.cpp_overload_set.value: %Protected.Overload.cpp_overload_set.type = cpp_overload_set_value @Protected.Overload.cpp_overload_set [concrete = constants.%Protected.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.decl.b29afa.1: %C.Overload.type.fd2af6.1 = fn_decl @C.Overload.1 [concrete = constants.%C.Overload.5043eb.1] {} {} +// CHECK:STDOUT: %C.Overload.decl.b29afa.2: %C.Overload.type.fd2af6.2 = fn_decl @C.Overload.2 [concrete = constants.%C.Overload.5043eb.2] { // CHECK:STDOUT: // CHECK:STDOUT: } { // CHECK:STDOUT: @@ -1912,24 +1912,24 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: .Cpp = // CHECK:STDOUT: .base = %.loc7 // CHECK:STDOUT: .F = %Derived.F.decl -// CHECK:STDOUT: .foo = +// CHECK:STDOUT: .Overload = // CHECK:STDOUT: extend %Protected.ref // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @Derived.F() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %foo.ref.loc11: %Protected.foo.cpp_overload_set.type = name_ref foo, imports.%Protected.foo.cpp_overload_set.value [concrete = constants.%Protected.foo.cpp_overload_set.value] -// CHECK:STDOUT: %C.foo.call.loc11: init %empty_tuple.type = call imports.%C.foo.decl.10458f.1() -// CHECK:STDOUT: %foo.ref.loc12: %Protected.foo.cpp_overload_set.type = name_ref foo, imports.%Protected.foo.cpp_overload_set.value [concrete = constants.%Protected.foo.cpp_overload_set.value] +// CHECK:STDOUT: %Overload.ref.loc11: %Protected.Overload.cpp_overload_set.type = name_ref Overload, imports.%Protected.Overload.cpp_overload_set.value [concrete = constants.%Protected.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %C.Overload.call.loc11: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.1() +// CHECK:STDOUT: %Overload.ref.loc12: %Protected.Overload.cpp_overload_set.type = name_ref Overload, imports.%Protected.Overload.cpp_overload_set.value [concrete = constants.%Protected.Overload.cpp_overload_set.value] // CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] // CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] -// CHECK:STDOUT: %bound_method.loc12_9.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] +// CHECK:STDOUT: %bound_method.loc12_14.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] // CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc12_9.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_9.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_9.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_9.2: %i32 = converted %int_1, %.loc12_9.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %C.foo.call.loc12: init %empty_tuple.type = call imports.%C.foo.decl.10458f.2(%.loc12_9.2) +// CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] +// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_14.2(%int_1) [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_14.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %.loc12_14.2: %i32 = converted %int_1, %.loc12_14.1 [concrete = constants.%int_1.5d2] +// CHECK:STDOUT: %C.Overload.call.loc12: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.2(%.loc12_14.2) // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: From 531527d24dcb8914a89b24ac502cddfea652266a Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 14:59:13 +0200 Subject: [PATCH 17/20] Use explicit parameter types to distinguish between the `public`, `protected` and `private` overloads. --- .../testdata/interop/cpp/class/access.carbon | 732 ++++++++++++++---- 1 file changed, 572 insertions(+), 160 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 8094ebadf7009..5752ebc9708b4 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -406,16 +406,20 @@ fn F(c: Cpp.C*) { // --- overload_set.h +struct PublicCall {}; +struct ProtectedCall {}; +struct PrivateCall {}; + class C { public: - C(); - static auto Overload() -> void; + C(PublicCall x); + static auto Overload(PublicCall x) -> void; protected: - C(int); - static auto Overload(int a) -> void; + C(ProtectedCall x); + static auto Overload(ProtectedCall x) -> void; private: - C(int, int); - static auto Overload(int a, int b) -> void; + C(PrivateCall x); + static auto Overload(PrivateCall x) -> void; }; // --- import_overload_set_public.carbon @@ -426,8 +430,8 @@ import Cpp library "overload_set.h"; fn F() { //@dump-sem-ir-begin - Cpp.C.C(); - Cpp.C.Overload(); + Cpp.C.C(Cpp.PublicCall.PublicCall()); + Cpp.C.Overload(Cpp.PublicCall.PublicCall()); //@dump-sem-ir-end } @@ -439,18 +443,18 @@ import Cpp library "overload_set.h"; fn F() { // CHECK:STDERR: fail_import_overload_set_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `C` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.C.C(1 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ + // CHECK:STDERR: Cpp.C.C(Cpp.ProtectedCall.ProtectedCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.C.C(1 as i32); + Cpp.C.C(Cpp.ProtectedCall.ProtectedCall()); // CHECK:STDERR: fail_import_overload_set_protected.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.C.Overload(1 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: Cpp.C.Overload(Cpp.ProtectedCall.ProtectedCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.C.Overload(1 as i32); + Cpp.C.Overload(Cpp.ProtectedCall.ProtectedCall()); } // --- import_overload_set_protected_base.carbon @@ -463,19 +467,27 @@ class D { extend base: Cpp.C; fn MakePublic() -> D { - return {.base = C()}; + //@dump-sem-ir-begin + return {.base = C(Cpp.PublicCall.PublicCall())}; + //@dump-sem-ir-end } fn MakeProtected() -> D { - return {.base = C(1 as i32)}; + //@dump-sem-ir-begin + return {.base = C(Cpp.ProtectedCall.ProtectedCall())}; + //@dump-sem-ir-end } fn CallPublic() { - Overload(); + //@dump-sem-ir-begin + Overload(Cpp.PublicCall.PublicCall()); + //@dump-sem-ir-end } fn CallProtected() { - Overload(1 as i32); + //@dump-sem-ir-begin + Overload(Cpp.ProtectedCall.ProtectedCall()); + //@dump-sem-ir-end } } @@ -487,18 +499,18 @@ import Cpp library "overload_set.h"; fn F() { // CHECK:STDERR: fail_import_overload_set_private.carbon:[[@LINE+5]]:3: error: cannot access private member `C` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.C.C(1 as i32, 2 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: Cpp.C.C(Cpp.PrivateCall.PrivateCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.C.C(1 as i32, 2 as i32); + Cpp.C.C(Cpp.PrivateCall.PrivateCall()); // CHECK:STDERR: fail_import_overload_set_private.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.C.Overload(1 as i32, 2 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: Cpp.C.Overload(Cpp.PrivateCall.PrivateCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.C.Overload(1 as i32, 2 as i32); + Cpp.C.Overload(Cpp.PrivateCall.PrivateCall()); } // --- fail_import_overload_set_private_base.carbon @@ -512,20 +524,20 @@ class D { fn MakePrivate() -> D { // CHECK:STDERR: fail_import_overload_set_private_base.carbon:[[@LINE+5]]:21: error: cannot access private member `C` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: return {.base = C(1 as i32, 2 as i32)}; - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: return {.base = C(Cpp.PrivateCall.PrivateCall())}; + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - return {.base = C(1 as i32, 2 as i32)}; + return {.base = C(Cpp.PrivateCall.PrivateCall())}; } fn CallPrivate() { // CHECK:STDERR: fail_import_overload_set_private_base.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.C` [ClassInvalidMemberAccess] - // CHECK:STDERR: Overload(1 as i32, 2 as i32); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: Overload(Cpp.PrivateCall.PrivateCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Overload(1 as i32, 2 as i32); + Overload(Cpp.PrivateCall.PrivateCall()); } } @@ -545,7 +557,7 @@ import Cpp library "overload_set_base_class.h"; fn F() { //@dump-sem-ir-begin - Cpp.Public.Overload(); + Cpp.Public.Overload(Cpp.PublicCall.PublicCall()); //@dump-sem-ir-end } @@ -557,17 +569,17 @@ import Cpp library "overload_set_base_class.h"; fn F() { // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Public` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Public.Overload(1); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: Cpp.Public.Overload(Cpp.ProtectedCall.ProtectedCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Public.Overload(1); + Cpp.Public.Overload(Cpp.ProtectedCall.ProtectedCall()); // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Public` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Public.Overload(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ + // CHECK:STDERR: Cpp.Public.Overload(Cpp.PrivateCall.PrivateCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_call_non_public.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Public.Overload(1, 2); + Cpp.Public.Overload(Cpp.PrivateCall.PrivateCall()); } // --- import_overload_set_public_base_class_derived_call_non_private.carbon @@ -581,8 +593,8 @@ class Derived { fn F() { //@dump-sem-ir-begin - Overload(); - Overload(1); + Overload(Cpp.PublicCall.PublicCall()); + Overload(Cpp.ProtectedCall.ProtectedCall()); //@dump-sem-ir-end } } @@ -598,11 +610,11 @@ class Derived { fn F() { // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Public` [ClassInvalidMemberAccess] - // CHECK:STDERR: Overload(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~ + // CHECK:STDERR: Overload(Cpp.PrivateCall.PrivateCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_public_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Overload(1, 2); + Overload(Cpp.PrivateCall.PrivateCall()); } } @@ -614,23 +626,23 @@ import Cpp library "overload_set_base_class.h"; fn F() { // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Protected.Overload(); + // CHECK:STDERR: Cpp.Protected.Overload(Cpp.PublicCall.PublicCall()); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Protected.Overload(); + Cpp.Protected.Overload(Cpp.PublicCall.PublicCall()); // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Protected.Overload(1); + // CHECK:STDERR: Cpp.Protected.Overload(Cpp.ProtectedCall.ProtectedCall()); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Protected.Overload(1); + Cpp.Protected.Overload(Cpp.ProtectedCall.ProtectedCall()); // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon:[[@LINE+5]]:3: error: cannot access protected member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Protected.Overload(1, 2); + // CHECK:STDERR: Cpp.Protected.Overload(Cpp.PrivateCall.PrivateCall()); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Protected.Overload(1, 2); + Cpp.Protected.Overload(Cpp.PrivateCall.PrivateCall()); } // --- import_overload_set_protected_base_class_derived_call_non_private.carbon @@ -644,8 +656,8 @@ class Derived { fn F() { //@dump-sem-ir-begin - Overload(); - Overload(1); + Overload(Cpp.PublicCall.PublicCall()); + Overload(Cpp.ProtectedCall.ProtectedCall()); //@dump-sem-ir-end } } @@ -661,11 +673,11 @@ class Derived { fn F() { // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Protected` [ClassInvalidMemberAccess] - // CHECK:STDERR: Overload(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~ + // CHECK:STDERR: Overload(Cpp.PrivateCall.PrivateCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_protected_base_class_derived_call_private.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Overload(1, 2); + Overload(Cpp.PrivateCall.PrivateCall()); } } @@ -677,23 +689,23 @@ import Cpp library "overload_set_base_class.h"; fn F() { // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Private.Overload(); + // CHECK:STDERR: Cpp.Private.Overload(Cpp.PublicCall.PublicCall()); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Private.Overload(); + Cpp.Private.Overload(Cpp.PublicCall.PublicCall()); // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Private.Overload(1); + // CHECK:STDERR: Cpp.Private.Overload(Cpp.ProtectedCall.ProtectedCall()); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Private.Overload(1); + Cpp.Private.Overload(Cpp.ProtectedCall.ProtectedCall()); // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon:[[@LINE+5]]:3: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Cpp.Private.Overload(1, 2); + // CHECK:STDERR: Cpp.Private.Overload(Cpp.PrivateCall.PrivateCall()); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Cpp.Private.Overload(1, 2); + Cpp.Private.Overload(Cpp.PrivateCall.PrivateCall()); } // --- fail_import_overload_set_private_base_class_derived.carbon @@ -707,23 +719,23 @@ class Derived { fn F() { // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Overload(); - // CHECK:STDERR: ^~~~~~~~~~ + // CHECK:STDERR: Overload(Cpp.PublicCall.PublicCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Overload(); + Overload(Cpp.PublicCall.PublicCall()); // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Overload(1); - // CHECK:STDERR: ^~~~~~~~~~~ + // CHECK:STDERR: Overload(Cpp.ProtectedCall.ProtectedCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Overload(1); + Overload(Cpp.ProtectedCall.ProtectedCall()); // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon:[[@LINE+5]]:5: error: cannot access private member `Overload` of type `Cpp.Private` [ClassInvalidMemberAccess] - // CHECK:STDERR: Overload(1, 2); - // CHECK:STDERR: ^~~~~~~~~~~~~~ + // CHECK:STDERR: Overload(Cpp.PrivateCall.PrivateCall()); + // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // CHECK:STDERR: fail_import_overload_set_private_base_class_derived.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: - Overload(1, 2); + Overload(Cpp.PrivateCall.PrivateCall()); } } @@ -1708,54 +1720,316 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %C: type = class_type @C [concrete] // CHECK:STDOUT: %C.C.cpp_overload_set.type: type = cpp_overload_set_type @C.C.cpp_overload_set [concrete] // CHECK:STDOUT: %C.C.cpp_overload_set.value: %C.C.cpp_overload_set.type = cpp_overload_set_value @C.C.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicCall: type = class_type @PublicCall [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.type: type = cpp_overload_set_type @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.dfa: type = ptr_type %PublicCall [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk.type: type = fn_type @PublicCall__carbon_thunk [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk: %PublicCall__carbon_thunk.type = struct_value () [concrete] // CHECK:STDOUT: %ptr.d9e: type = ptr_type %C [concrete] // CHECK:STDOUT: %C__carbon_thunk.type: type = fn_type @C__carbon_thunk [concrete] // CHECK:STDOUT: %C__carbon_thunk: %C__carbon_thunk.type = struct_value () [concrete] // CHECK:STDOUT: %C.Overload.cpp_overload_set.type: type = cpp_overload_set_type @C.Overload.cpp_overload_set [concrete] // CHECK:STDOUT: %C.Overload.cpp_overload_set.value: %C.Overload.cpp_overload_set.type = cpp_overload_set_value @C.Overload.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.Overload.type: type = fn_type @C.Overload [concrete] -// CHECK:STDOUT: %C.Overload: %C.Overload.type = struct_value () [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type: type = fn_type @Overload__carbon_thunk [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk: %Overload__carbon_thunk.type = struct_value () [concrete] // CHECK:STDOUT: %type_where: type = facet_type > [concrete] -// CHECK:STDOUT: %facet_value: %type_where = facet_value %C, () [concrete] -// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b92: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [concrete] +// CHECK:STDOUT: %facet_value.136: %type_where = facet_value %PublicCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.136) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.3ff: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06 = struct_value () [concrete] +// CHECK:STDOUT: %facet_value.b21: %type_where = facet_value %C, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b92: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.b21) [concrete] // CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.841: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b92 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { // CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .PublicCall = %PublicCall.decl // CHECK:STDOUT: import Cpp//... // CHECK:STDOUT: } // CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} // CHECK:STDOUT: %C.C.cpp_overload_set.value: %C.C.cpp_overload_set.type = cpp_overload_set_value @C.C.cpp_overload_set [concrete = constants.%C.C.cpp_overload_set.value] +// CHECK:STDOUT: %PublicCall.decl: type = class_decl @PublicCall [concrete = constants.%PublicCall] {} {} +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %PublicCall__carbon_thunk.decl: %PublicCall__carbon_thunk.type = fn_decl @PublicCall__carbon_thunk [concrete = constants.%PublicCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } // CHECK:STDOUT: %C__carbon_thunk.decl: %C__carbon_thunk.type = fn_decl @C__carbon_thunk [concrete = constants.%C__carbon_thunk] { // CHECK:STDOUT: // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: %C.Overload.cpp_overload_set.value: %C.Overload.cpp_overload_set.type = cpp_overload_set_value @C.Overload.cpp_overload_set [concrete = constants.%C.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.decl: %C.Overload.type = fn_decl @C.Overload [concrete = constants.%C.Overload] {} {} +// CHECK:STDOUT: %Overload__carbon_thunk.decl: %Overload__carbon_thunk.type = fn_decl @Overload__carbon_thunk [concrete = constants.%Overload__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Cpp.ref.loc8: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Cpp.ref.loc8_3: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %C.ref.loc8_6: type = name_ref C, imports.%C.decl [concrete = constants.%C] // CHECK:STDOUT: %C.ref.loc8_8: %C.C.cpp_overload_set.type = name_ref C, imports.%C.C.cpp_overload_set.value [concrete = constants.%C.C.cpp_overload_set.value] -// CHECK:STDOUT: %.loc8_11.1: ref %C = temporary_storage -// CHECK:STDOUT: %addr.loc8_11.1: %ptr.d9e = addr_of %.loc8_11.1 -// CHECK:STDOUT: %C__carbon_thunk.call: init %empty_tuple.type = call imports.%C__carbon_thunk.decl(%addr.loc8_11.1) -// CHECK:STDOUT: %.loc8_11.2: init %C = in_place_init %C__carbon_thunk.call, %.loc8_11.1 -// CHECK:STDOUT: %.loc8_11.3: ref %C = temporary %.loc8_11.1, %.loc8_11.2 -// CHECK:STDOUT: %Cpp.ref.loc9: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Cpp.ref.loc8_11: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicCall.ref.loc8_14: type = name_ref PublicCall, imports.%PublicCall.decl [concrete = constants.%PublicCall] +// CHECK:STDOUT: %PublicCall.ref.loc8_25: %PublicCall.PublicCall.cpp_overload_set.type = name_ref PublicCall, imports.%PublicCall.PublicCall.cpp_overload_set.value [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc8_37.1: ref %PublicCall = temporary_storage +// CHECK:STDOUT: %addr.loc8_37.1: %ptr.dfa = addr_of %.loc8_37.1 +// CHECK:STDOUT: %PublicCall__carbon_thunk.call.loc8: init %empty_tuple.type = call imports.%PublicCall__carbon_thunk.decl(%addr.loc8_37.1) +// CHECK:STDOUT: %.loc8_37.2: init %PublicCall = in_place_init %PublicCall__carbon_thunk.call.loc8, %.loc8_37.1 +// CHECK:STDOUT: %.loc8_38.1: ref %C = temporary_storage +// CHECK:STDOUT: %.loc8_37.3: ref %PublicCall = temporary %.loc8_37.1, %.loc8_37.2 +// CHECK:STDOUT: %.loc8_37.4: %PublicCall = bind_value %.loc8_37.3 +// CHECK:STDOUT: %.loc8_37.5: ref %PublicCall = value_as_ref %.loc8_37.4 +// CHECK:STDOUT: %addr.loc8_38.1: %ptr.dfa = addr_of %.loc8_37.5 +// CHECK:STDOUT: %addr.loc8_38.2: %ptr.d9e = addr_of %.loc8_38.1 +// CHECK:STDOUT: %C__carbon_thunk.call: init %empty_tuple.type = call imports.%C__carbon_thunk.decl(%addr.loc8_38.1, %addr.loc8_38.2) +// CHECK:STDOUT: %.loc8_38.2: init %C = in_place_init %C__carbon_thunk.call, %.loc8_38.1 +// CHECK:STDOUT: %.loc8_38.3: ref %C = temporary %.loc8_38.1, %.loc8_38.2 +// CHECK:STDOUT: %Cpp.ref.loc9_3: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %C.ref.loc9: type = name_ref C, imports.%C.decl [concrete = constants.%C] // CHECK:STDOUT: %Overload.ref: %C.Overload.cpp_overload_set.type = name_ref Overload, imports.%C.Overload.cpp_overload_set.value [concrete = constants.%C.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.call: init %empty_tuple.type = call imports.%C.Overload.decl() -// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: = bound_method %.loc8_11.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.841 +// CHECK:STDOUT: %Cpp.ref.loc9_18: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicCall.ref.loc9_21: type = name_ref PublicCall, imports.%PublicCall.decl [concrete = constants.%PublicCall] +// CHECK:STDOUT: %PublicCall.ref.loc9_32: %PublicCall.PublicCall.cpp_overload_set.type = name_ref PublicCall, imports.%PublicCall.PublicCall.cpp_overload_set.value [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc9_44.1: ref %PublicCall = temporary_storage +// CHECK:STDOUT: %addr.loc9_44.1: %ptr.dfa = addr_of %.loc9_44.1 +// CHECK:STDOUT: %PublicCall__carbon_thunk.call.loc9: init %empty_tuple.type = call imports.%PublicCall__carbon_thunk.decl(%addr.loc9_44.1) +// CHECK:STDOUT: %.loc9_44.2: init %PublicCall = in_place_init %PublicCall__carbon_thunk.call.loc9, %.loc9_44.1 +// CHECK:STDOUT: %.loc9_44.3: ref %PublicCall = temporary %.loc9_44.1, %.loc9_44.2 +// CHECK:STDOUT: %.loc9_44.4: %PublicCall = bind_value %.loc9_44.3 +// CHECK:STDOUT: %.loc9_44.5: ref %PublicCall = value_as_ref %.loc9_44.4 +// CHECK:STDOUT: %addr.loc9_45: %ptr.dfa = addr_of %.loc9_44.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl(%addr.loc9_45) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc9: = bound_method %.loc9_44.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3ff // CHECK:STDOUT: -// CHECK:STDOUT: %bound_method: = bound_method %.loc8_11.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn -// CHECK:STDOUT: %addr.loc8_11.2: %ptr.d9e = addr_of %.loc8_11.3 -// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr.loc8_11.2) +// CHECK:STDOUT: %bound_method.loc9: = bound_method %.loc9_44.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.1 +// CHECK:STDOUT: %addr.loc9_44.2: %ptr.dfa = addr_of %.loc9_44.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc9: init %empty_tuple.type = call %bound_method.loc9(%addr.loc9_44.2) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc8_38: = bound_method %.loc8_38.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.841 +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method.loc8_38: = bound_method %.loc8_38.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.2 +// CHECK:STDOUT: %addr.loc8_38.3: %ptr.d9e = addr_of %.loc8_38.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc8_38: init %empty_tuple.type = call %bound_method.loc8_38(%addr.loc8_38.3) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc8_37: = bound_method %.loc8_37.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3ff +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method.loc8_37: = bound_method %.loc8_37.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.3 +// CHECK:STDOUT: %addr.loc8_37.2: %ptr.dfa = addr_of %.loc8_37.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc8_37: init %empty_tuple.type = call %bound_method.loc8_37(%addr.loc8_37.2) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: --- import_overload_set_protected_base.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %D: type = class_type @D [concrete] +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] +// CHECK:STDOUT: %struct_type.base.7c3: type = struct_type {.base: %C} [concrete] +// CHECK:STDOUT: %C.C.cpp_overload_set.type: type = cpp_overload_set_type @C.C.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.C.cpp_overload_set.value: %C.C.cpp_overload_set.type = cpp_overload_set_value @C.C.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicCall: type = class_type @PublicCall [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.type: type = cpp_overload_set_type @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.dfa: type = ptr_type %PublicCall [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk.type: type = fn_type @PublicCall__carbon_thunk [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk: %PublicCall__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %ptr.d9e: type = ptr_type %C [concrete] +// CHECK:STDOUT: %C__carbon_thunk.type.65f120.1: type = fn_type @C__carbon_thunk.1 [concrete] +// CHECK:STDOUT: %C__carbon_thunk.d98342.1: %C__carbon_thunk.type.65f120.1 = struct_value () [concrete] +// CHECK:STDOUT: %type_where: type = facet_type > [concrete] +// CHECK:STDOUT: %facet_value.136: %type_where = facet_value %PublicCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.136) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.3ff: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06 = struct_value () [concrete] +// CHECK:STDOUT: %ProtectedCall: type = class_type @ProtectedCall [concrete] +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.type: type = cpp_overload_set_type @ProtectedCall.ProtectedCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.value: %ProtectedCall.ProtectedCall.cpp_overload_set.type = cpp_overload_set_value @ProtectedCall.ProtectedCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.8e6: type = ptr_type %ProtectedCall [concrete] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.type: type = fn_type @ProtectedCall__carbon_thunk [concrete] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk: %ProtectedCall__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %C__carbon_thunk.type.65f120.2: type = fn_type @C__carbon_thunk.2 [concrete] +// CHECK:STDOUT: %C__carbon_thunk.d98342.2: %C__carbon_thunk.type.65f120.2 = struct_value () [concrete] +// CHECK:STDOUT: %facet_value.c53: %type_where = facet_value %ProtectedCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b70: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.c53) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.a5b: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b70 = struct_value () [concrete] +// CHECK:STDOUT: %C.Overload.cpp_overload_set.type: type = cpp_overload_set_type @C.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %C.Overload.cpp_overload_set.value: %C.Overload.cpp_overload_set.type = cpp_overload_set_value @C.Overload.cpp_overload_set [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type.9a101f.1: type = fn_type @Overload__carbon_thunk.1 [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.794c5b.1: %Overload__carbon_thunk.type.9a101f.1 = struct_value () [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type.9a101f.2: type = fn_type @Overload__carbon_thunk.2 [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.794c5b.2: %Overload__carbon_thunk.type.9a101f.2 = struct_value () [concrete] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: imports { +// CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .PublicCall = %PublicCall.decl +// CHECK:STDOUT: .ProtectedCall = %ProtectedCall.decl +// CHECK:STDOUT: import Cpp//... +// CHECK:STDOUT: } +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: %C.C.cpp_overload_set.value: %C.C.cpp_overload_set.type = cpp_overload_set_value @C.C.cpp_overload_set [concrete = constants.%C.C.cpp_overload_set.value] +// CHECK:STDOUT: %PublicCall.decl: type = class_decl @PublicCall [concrete = constants.%PublicCall] {} {} +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %PublicCall__carbon_thunk.decl: %PublicCall__carbon_thunk.type = fn_decl @PublicCall__carbon_thunk [concrete = constants.%PublicCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %C__carbon_thunk.decl.8acdfe.1: %C__carbon_thunk.type.65f120.1 = fn_decl @C__carbon_thunk.1 [concrete = constants.%C__carbon_thunk.d98342.1] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %ProtectedCall.decl: type = class_decl @ProtectedCall [concrete = constants.%ProtectedCall] {} {} +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.value: %ProtectedCall.ProtectedCall.cpp_overload_set.type = cpp_overload_set_value @ProtectedCall.ProtectedCall.cpp_overload_set [concrete = constants.%ProtectedCall.ProtectedCall.cpp_overload_set.value] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.decl: %ProtectedCall__carbon_thunk.type = fn_decl @ProtectedCall__carbon_thunk [concrete = constants.%ProtectedCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %C__carbon_thunk.decl.8acdfe.2: %C__carbon_thunk.type.65f120.2 = fn_decl @C__carbon_thunk.2 [concrete = constants.%C__carbon_thunk.d98342.2] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %C.Overload.cpp_overload_set.value: %C.Overload.cpp_overload_set.type = cpp_overload_set_value @C.Overload.cpp_overload_set [concrete = constants.%C.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %Overload__carbon_thunk.decl.85994f.1: %Overload__carbon_thunk.type.9a101f.1 = fn_decl @Overload__carbon_thunk.1 [concrete = constants.%Overload__carbon_thunk.794c5b.1] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Overload__carbon_thunk.decl.85994f.2: %Overload__carbon_thunk.type.9a101f.2 = fn_decl @Overload__carbon_thunk.2 [concrete = constants.%Overload__carbon_thunk.794c5b.2] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @D { +// CHECK:STDOUT: +// CHECK:STDOUT: complete_type_witness = %complete_type +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = constants.%D +// CHECK:STDOUT: .Cpp = +// CHECK:STDOUT: .base = %.loc7 +// CHECK:STDOUT: .D = +// CHECK:STDOUT: .MakePublic = %D.MakePublic.decl +// CHECK:STDOUT: .MakeProtected = %D.MakeProtected.decl +// CHECK:STDOUT: .CallPublic = %D.CallPublic.decl +// CHECK:STDOUT: .CallProtected = %D.CallProtected.decl +// CHECK:STDOUT: .C = +// CHECK:STDOUT: .Overload = +// CHECK:STDOUT: extend %C.ref +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @D.MakePublic() -> %return.param: %D { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %C.ref: %C.C.cpp_overload_set.type = name_ref C, imports.%C.C.cpp_overload_set.value [concrete = constants.%C.C.cpp_overload_set.value] +// CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicCall.ref.loc11_26: type = name_ref PublicCall, imports.%PublicCall.decl [concrete = constants.%PublicCall] +// CHECK:STDOUT: %PublicCall.ref.loc11_37: %PublicCall.PublicCall.cpp_overload_set.type = name_ref PublicCall, imports.%PublicCall.PublicCall.cpp_overload_set.value [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc11_49.1: ref %PublicCall = temporary_storage +// CHECK:STDOUT: %addr.loc11_49.1: %ptr.dfa = addr_of %.loc11_49.1 +// CHECK:STDOUT: %PublicCall__carbon_thunk.call: init %empty_tuple.type = call imports.%PublicCall__carbon_thunk.decl(%addr.loc11_49.1) +// CHECK:STDOUT: %.loc11_49.2: init %PublicCall = in_place_init %PublicCall__carbon_thunk.call, %.loc11_49.1 +// CHECK:STDOUT: %.loc11_51.1: ref %C = class_element_access %return, element0 +// CHECK:STDOUT: %.loc11_49.3: ref %PublicCall = temporary %.loc11_49.1, %.loc11_49.2 +// CHECK:STDOUT: %.loc11_49.4: %PublicCall = bind_value %.loc11_49.3 +// CHECK:STDOUT: %.loc11_49.5: ref %PublicCall = value_as_ref %.loc11_49.4 +// CHECK:STDOUT: %addr.loc11_50.1: %ptr.dfa = addr_of %.loc11_49.5 +// CHECK:STDOUT: %addr.loc11_50.2: %ptr.d9e = addr_of %.loc11_51.1 +// CHECK:STDOUT: %C__carbon_thunk.call: init %empty_tuple.type = call imports.%C__carbon_thunk.decl.8acdfe.1(%addr.loc11_50.1, %addr.loc11_50.2) +// CHECK:STDOUT: %.loc11_50: init %C = in_place_init %C__carbon_thunk.call, %.loc11_51.1 +// CHECK:STDOUT: %.loc11_51.2: %struct_type.base.7c3 = struct_literal (%.loc11_50) +// CHECK:STDOUT: %.loc11_51.3: init %D = class_init (%.loc11_50), %return +// CHECK:STDOUT: %.loc11_52: init %D = converted %.loc11_51.2, %.loc11_51.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: = bound_method %.loc11_49.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3ff +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method: = bound_method %.loc11_49.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %addr.loc11_49.2: %ptr.dfa = addr_of %.loc11_49.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr.loc11_49.2) +// CHECK:STDOUT: return %.loc11_52 to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @D.MakeProtected() -> %return.param: %D { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %C.ref: %C.C.cpp_overload_set.type = name_ref C, imports.%C.C.cpp_overload_set.value [concrete = constants.%C.C.cpp_overload_set.value] +// CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %ProtectedCall.ref.loc17_26: type = name_ref ProtectedCall, imports.%ProtectedCall.decl [concrete = constants.%ProtectedCall] +// CHECK:STDOUT: %ProtectedCall.ref.loc17_40: %ProtectedCall.ProtectedCall.cpp_overload_set.type = name_ref ProtectedCall, imports.%ProtectedCall.ProtectedCall.cpp_overload_set.value [concrete = constants.%ProtectedCall.ProtectedCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc17_55.1: ref %ProtectedCall = temporary_storage +// CHECK:STDOUT: %addr.loc17_55.1: %ptr.8e6 = addr_of %.loc17_55.1 +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.call: init %empty_tuple.type = call imports.%ProtectedCall__carbon_thunk.decl(%addr.loc17_55.1) +// CHECK:STDOUT: %.loc17_55.2: init %ProtectedCall = in_place_init %ProtectedCall__carbon_thunk.call, %.loc17_55.1 +// CHECK:STDOUT: %.loc17_57.1: ref %C = class_element_access %return, element0 +// CHECK:STDOUT: %.loc17_55.3: ref %ProtectedCall = temporary %.loc17_55.1, %.loc17_55.2 +// CHECK:STDOUT: %.loc17_55.4: %ProtectedCall = bind_value %.loc17_55.3 +// CHECK:STDOUT: %.loc17_55.5: ref %ProtectedCall = value_as_ref %.loc17_55.4 +// CHECK:STDOUT: %addr.loc17_56.1: %ptr.8e6 = addr_of %.loc17_55.5 +// CHECK:STDOUT: %addr.loc17_56.2: %ptr.d9e = addr_of %.loc17_57.1 +// CHECK:STDOUT: %C__carbon_thunk.call: init %empty_tuple.type = call imports.%C__carbon_thunk.decl.8acdfe.2(%addr.loc17_56.1, %addr.loc17_56.2) +// CHECK:STDOUT: %.loc17_56: init %C = in_place_init %C__carbon_thunk.call, %.loc17_57.1 +// CHECK:STDOUT: %.loc17_57.2: %struct_type.base.7c3 = struct_literal (%.loc17_56) +// CHECK:STDOUT: %.loc17_57.3: init %D = class_init (%.loc17_56), %return +// CHECK:STDOUT: %.loc17_58: init %D = converted %.loc17_57.2, %.loc17_57.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: = bound_method %.loc17_55.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a5b +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method: = bound_method %.loc17_55.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %addr.loc17_55.2: %ptr.8e6 = addr_of %.loc17_55.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr.loc17_55.2) +// CHECK:STDOUT: return %.loc17_58 to %return +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @D.CallPublic() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Overload.ref: %C.Overload.cpp_overload_set.type = name_ref Overload, imports.%C.Overload.cpp_overload_set.value [concrete = constants.%C.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicCall.ref.loc23_17: type = name_ref PublicCall, imports.%PublicCall.decl [concrete = constants.%PublicCall] +// CHECK:STDOUT: %PublicCall.ref.loc23_28: %PublicCall.PublicCall.cpp_overload_set.type = name_ref PublicCall, imports.%PublicCall.PublicCall.cpp_overload_set.value [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc23_40.1: ref %PublicCall = temporary_storage +// CHECK:STDOUT: %addr.loc23_40.1: %ptr.dfa = addr_of %.loc23_40.1 +// CHECK:STDOUT: %PublicCall__carbon_thunk.call: init %empty_tuple.type = call imports.%PublicCall__carbon_thunk.decl(%addr.loc23_40.1) +// CHECK:STDOUT: %.loc23_40.2: init %PublicCall = in_place_init %PublicCall__carbon_thunk.call, %.loc23_40.1 +// CHECK:STDOUT: %.loc23_40.3: ref %PublicCall = temporary %.loc23_40.1, %.loc23_40.2 +// CHECK:STDOUT: %.loc23_40.4: %PublicCall = bind_value %.loc23_40.3 +// CHECK:STDOUT: %.loc23_40.5: ref %PublicCall = value_as_ref %.loc23_40.4 +// CHECK:STDOUT: %addr.loc23_41: %ptr.dfa = addr_of %.loc23_40.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl.85994f.1(%addr.loc23_41) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: = bound_method %.loc23_40.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3ff +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method: = bound_method %.loc23_40.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %addr.loc23_40.2: %ptr.dfa = addr_of %.loc23_40.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr.loc23_40.2) +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: fn @D.CallProtected() { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %Overload.ref: %C.Overload.cpp_overload_set.type = name_ref Overload, imports.%C.Overload.cpp_overload_set.value [concrete = constants.%C.Overload.cpp_overload_set.value] +// CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %ProtectedCall.ref.loc29_17: type = name_ref ProtectedCall, imports.%ProtectedCall.decl [concrete = constants.%ProtectedCall] +// CHECK:STDOUT: %ProtectedCall.ref.loc29_31: %ProtectedCall.ProtectedCall.cpp_overload_set.type = name_ref ProtectedCall, imports.%ProtectedCall.ProtectedCall.cpp_overload_set.value [concrete = constants.%ProtectedCall.ProtectedCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc29_46.1: ref %ProtectedCall = temporary_storage +// CHECK:STDOUT: %addr.loc29_46.1: %ptr.8e6 = addr_of %.loc29_46.1 +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.call: init %empty_tuple.type = call imports.%ProtectedCall__carbon_thunk.decl(%addr.loc29_46.1) +// CHECK:STDOUT: %.loc29_46.2: init %ProtectedCall = in_place_init %ProtectedCall__carbon_thunk.call, %.loc29_46.1 +// CHECK:STDOUT: %.loc29_46.3: ref %ProtectedCall = temporary %.loc29_46.1, %.loc29_46.2 +// CHECK:STDOUT: %.loc29_46.4: %ProtectedCall = bind_value %.loc29_46.3 +// CHECK:STDOUT: %.loc29_46.5: ref %ProtectedCall = value_as_ref %.loc29_46.4 +// CHECK:STDOUT: %addr.loc29_47: %ptr.8e6 = addr_of %.loc29_46.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl.85994f.2(%addr.loc29_47) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: = bound_method %.loc29_46.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a5b +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method: = bound_method %.loc29_46.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %addr.loc29_46.2: %ptr.8e6 = addr_of %.loc29_46.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr.loc29_46.2) // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1766,26 +2040,64 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: %Public: type = class_type @Public [concrete] // CHECK:STDOUT: %Public.Overload.cpp_overload_set.type: type = cpp_overload_set_type @Public.Overload.cpp_overload_set [concrete] // CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.Overload.type: type = fn_type @C.Overload [concrete] -// CHECK:STDOUT: %C.Overload: %C.Overload.type = struct_value () [concrete] +// CHECK:STDOUT: %PublicCall: type = class_type @PublicCall [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.type: type = cpp_overload_set_type @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.dfa: type = ptr_type %PublicCall [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk.type: type = fn_type @PublicCall__carbon_thunk [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk: %PublicCall__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type: type = fn_type @Overload__carbon_thunk [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk: %Overload__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %type_where: type = facet_type > [concrete] +// CHECK:STDOUT: %facet_value: %type_where = facet_value %PublicCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.3ff: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { // CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { // CHECK:STDOUT: .Public = %Public.decl +// CHECK:STDOUT: .PublicCall = %PublicCall.decl // CHECK:STDOUT: import Cpp//... // CHECK:STDOUT: } // CHECK:STDOUT: %Public.decl: type = class_decl @Public [concrete = constants.%Public] {} {} // CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete = constants.%Public.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.decl: %C.Overload.type = fn_decl @C.Overload [concrete = constants.%C.Overload] {} {} +// CHECK:STDOUT: %PublicCall.decl: type = class_decl @PublicCall [concrete = constants.%PublicCall] {} {} +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %PublicCall__carbon_thunk.decl: %PublicCall__carbon_thunk.type = fn_decl @PublicCall__carbon_thunk [concrete = constants.%PublicCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Overload__carbon_thunk.decl: %Overload__carbon_thunk.type = fn_decl @Overload__carbon_thunk [concrete = constants.%Overload__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: fn @F() { // CHECK:STDOUT: !entry: -// CHECK:STDOUT: %Cpp.ref: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %Cpp.ref.loc8_3: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] // CHECK:STDOUT: %Public.ref: type = name_ref Public, imports.%Public.decl [concrete = constants.%Public] // CHECK:STDOUT: %Overload.ref: %Public.Overload.cpp_overload_set.type = name_ref Overload, imports.%Public.Overload.cpp_overload_set.value [concrete = constants.%Public.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.call: init %empty_tuple.type = call imports.%C.Overload.decl() +// CHECK:STDOUT: %Cpp.ref.loc8_23: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicCall.ref.loc8_26: type = name_ref PublicCall, imports.%PublicCall.decl [concrete = constants.%PublicCall] +// CHECK:STDOUT: %PublicCall.ref.loc8_37: %PublicCall.PublicCall.cpp_overload_set.type = name_ref PublicCall, imports.%PublicCall.PublicCall.cpp_overload_set.value [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc8_49.1: ref %PublicCall = temporary_storage +// CHECK:STDOUT: %addr.loc8_49.1: %ptr.dfa = addr_of %.loc8_49.1 +// CHECK:STDOUT: %PublicCall__carbon_thunk.call: init %empty_tuple.type = call imports.%PublicCall__carbon_thunk.decl(%addr.loc8_49.1) +// CHECK:STDOUT: %.loc8_49.2: init %PublicCall = in_place_init %PublicCall__carbon_thunk.call, %.loc8_49.1 +// CHECK:STDOUT: %.loc8_49.3: ref %PublicCall = temporary %.loc8_49.1, %.loc8_49.2 +// CHECK:STDOUT: %.loc8_49.4: %PublicCall = bind_value %.loc8_49.3 +// CHECK:STDOUT: %.loc8_49.5: ref %PublicCall = value_as_ref %.loc8_49.4 +// CHECK:STDOUT: %addr.loc8_50: %ptr.dfa = addr_of %.loc8_49.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl(%addr.loc8_50) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound: = bound_method %.loc8_49.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3ff +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method: = bound_method %.loc8_49.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn +// CHECK:STDOUT: %addr.loc8_49.2: %ptr.dfa = addr_of %.loc8_49.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call: init %empty_tuple.type = call %bound_method(%addr.loc8_49.2) // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1793,42 +2105,68 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Public: type = class_type @Public [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Public.Overload.cpp_overload_set.type: type = cpp_overload_set_type @Public.Overload.cpp_overload_set [concrete] // CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.Overload.type.fd2af6.1: type = fn_type @C.Overload.1 [concrete] -// CHECK:STDOUT: %C.Overload.5043eb.1: %C.Overload.type.fd2af6.1 = struct_value () [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %C.Overload.type.fd2af6.2: type = fn_type @C.Overload.2 [concrete] -// CHECK:STDOUT: %C.Overload.5043eb.2: %C.Overload.type.fd2af6.2 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.d14: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.204: = impl_witness imports.%ImplicitAs.impl_witness_table.9e9, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.d14 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.204) [concrete] -// CHECK:STDOUT: %.1df: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0 [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] +// CHECK:STDOUT: %PublicCall: type = class_type @PublicCall [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.type: type = cpp_overload_set_type @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.dfa: type = ptr_type %PublicCall [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk.type: type = fn_type @PublicCall__carbon_thunk [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk: %PublicCall__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type.9a101f.1: type = fn_type @Overload__carbon_thunk.1 [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.794c5b.1: %Overload__carbon_thunk.type.9a101f.1 = struct_value () [concrete] +// CHECK:STDOUT: %ProtectedCall: type = class_type @ProtectedCall [concrete] +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.type: type = cpp_overload_set_type @ProtectedCall.ProtectedCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.value: %ProtectedCall.ProtectedCall.cpp_overload_set.type = cpp_overload_set_value @ProtectedCall.ProtectedCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.8e6: type = ptr_type %ProtectedCall [concrete] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.type: type = fn_type @ProtectedCall__carbon_thunk [concrete] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk: %ProtectedCall__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type.9a101f.2: type = fn_type @Overload__carbon_thunk.2 [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.794c5b.2: %Overload__carbon_thunk.type.9a101f.2 = struct_value () [concrete] +// CHECK:STDOUT: %type_where: type = facet_type > [concrete] +// CHECK:STDOUT: %facet_value.c53: %type_where = facet_value %ProtectedCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b70: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.c53) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.a5b: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b70 = struct_value () [concrete] +// CHECK:STDOUT: %facet_value.136: %type_where = facet_value %PublicCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.136) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.3ff: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { +// CHECK:STDOUT: .Public = %Public.decl +// CHECK:STDOUT: .PublicCall = %PublicCall.decl +// CHECK:STDOUT: .ProtectedCall = %ProtectedCall.decl +// CHECK:STDOUT: import Cpp//... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Public.decl: type = class_decl @Public [concrete = constants.%Public] {} {} // CHECK:STDOUT: %Public.Overload.cpp_overload_set.value: %Public.Overload.cpp_overload_set.type = cpp_overload_set_value @Public.Overload.cpp_overload_set [concrete = constants.%Public.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.decl.b29afa.1: %C.Overload.type.fd2af6.1 = fn_decl @C.Overload.1 [concrete = constants.%C.Overload.5043eb.1] {} {} -// CHECK:STDOUT: %C.Overload.decl.b29afa.2: %C.Overload.type.fd2af6.2 = fn_decl @C.Overload.2 [concrete = constants.%C.Overload.5043eb.2] { +// CHECK:STDOUT: %PublicCall.decl: type = class_decl @PublicCall [concrete = constants.%PublicCall] {} {} +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %PublicCall__carbon_thunk.decl: %PublicCall__carbon_thunk.type = fn_decl @PublicCall__carbon_thunk [concrete = constants.%PublicCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Overload__carbon_thunk.decl.85994f.1: %Overload__carbon_thunk.type.9a101f.1 = fn_decl @Overload__carbon_thunk.1 [concrete = constants.%Overload__carbon_thunk.794c5b.1] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %ProtectedCall.decl: type = class_decl @ProtectedCall [concrete = constants.%ProtectedCall] {} {} +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.value: %ProtectedCall.ProtectedCall.cpp_overload_set.type = cpp_overload_set_value @ProtectedCall.ProtectedCall.cpp_overload_set [concrete = constants.%ProtectedCall.ProtectedCall.cpp_overload_set.value] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.decl: %ProtectedCall__carbon_thunk.type = fn_decl @ProtectedCall__carbon_thunk [concrete = constants.%ProtectedCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Overload__carbon_thunk.decl.85994f.2: %Overload__carbon_thunk.type.9a101f.2 = fn_decl @Overload__carbon_thunk.2 [concrete = constants.%Overload__carbon_thunk.794c5b.2] { // CHECK:STDOUT: // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import_ref.ee7: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340) = import_ref Core//prelude/parts/int, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.9e9 = impl_witness_table (%Core.import_ref.ee7), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @Derived { @@ -1847,17 +2185,41 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: fn @Derived.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Overload.ref.loc11: %Public.Overload.cpp_overload_set.type = name_ref Overload, imports.%Public.Overload.cpp_overload_set.value [concrete = constants.%Public.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.call.loc11: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.1() +// CHECK:STDOUT: %Cpp.ref.loc11: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicCall.ref.loc11_17: type = name_ref PublicCall, imports.%PublicCall.decl [concrete = constants.%PublicCall] +// CHECK:STDOUT: %PublicCall.ref.loc11_28: %PublicCall.PublicCall.cpp_overload_set.type = name_ref PublicCall, imports.%PublicCall.PublicCall.cpp_overload_set.value [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc11_40.1: ref %PublicCall = temporary_storage +// CHECK:STDOUT: %addr.loc11_40.1: %ptr.dfa = addr_of %.loc11_40.1 +// CHECK:STDOUT: %PublicCall__carbon_thunk.call: init %empty_tuple.type = call imports.%PublicCall__carbon_thunk.decl(%addr.loc11_40.1) +// CHECK:STDOUT: %.loc11_40.2: init %PublicCall = in_place_init %PublicCall__carbon_thunk.call, %.loc11_40.1 +// CHECK:STDOUT: %.loc11_40.3: ref %PublicCall = temporary %.loc11_40.1, %.loc11_40.2 +// CHECK:STDOUT: %.loc11_40.4: %PublicCall = bind_value %.loc11_40.3 +// CHECK:STDOUT: %.loc11_40.5: ref %PublicCall = value_as_ref %.loc11_40.4 +// CHECK:STDOUT: %addr.loc11_41: %ptr.dfa = addr_of %.loc11_40.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call.loc11: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl.85994f.1(%addr.loc11_41) // CHECK:STDOUT: %Overload.ref.loc12: %Public.Overload.cpp_overload_set.type = name_ref Overload, imports.%Public.Overload.cpp_overload_set.value [concrete = constants.%Public.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] -// CHECK:STDOUT: %bound_method.loc12_14.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_14.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_14.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_14.2: %i32 = converted %int_1, %.loc12_14.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %C.Overload.call.loc12: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.2(%.loc12_14.2) +// CHECK:STDOUT: %Cpp.ref.loc12: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %ProtectedCall.ref.loc12_17: type = name_ref ProtectedCall, imports.%ProtectedCall.decl [concrete = constants.%ProtectedCall] +// CHECK:STDOUT: %ProtectedCall.ref.loc12_31: %ProtectedCall.ProtectedCall.cpp_overload_set.type = name_ref ProtectedCall, imports.%ProtectedCall.ProtectedCall.cpp_overload_set.value [concrete = constants.%ProtectedCall.ProtectedCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc12_46.1: ref %ProtectedCall = temporary_storage +// CHECK:STDOUT: %addr.loc12_46.1: %ptr.8e6 = addr_of %.loc12_46.1 +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.call: init %empty_tuple.type = call imports.%ProtectedCall__carbon_thunk.decl(%addr.loc12_46.1) +// CHECK:STDOUT: %.loc12_46.2: init %ProtectedCall = in_place_init %ProtectedCall__carbon_thunk.call, %.loc12_46.1 +// CHECK:STDOUT: %.loc12_46.3: ref %ProtectedCall = temporary %.loc12_46.1, %.loc12_46.2 +// CHECK:STDOUT: %.loc12_46.4: %ProtectedCall = bind_value %.loc12_46.3 +// CHECK:STDOUT: %.loc12_46.5: ref %ProtectedCall = value_as_ref %.loc12_46.4 +// CHECK:STDOUT: %addr.loc12_47: %ptr.8e6 = addr_of %.loc12_46.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call.loc12: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl.85994f.2(%addr.loc12_47) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc12: = bound_method %.loc12_46.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a5b +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method.loc12: = bound_method %.loc12_46.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.1 +// CHECK:STDOUT: %addr.loc12_46.2: %ptr.8e6 = addr_of %.loc12_46.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc12: init %empty_tuple.type = call %bound_method.loc12(%addr.loc12_46.2) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc11: = bound_method %.loc11_40.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3ff +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method.loc11: = bound_method %.loc11_40.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.2 +// CHECK:STDOUT: %addr.loc11_40.2: %ptr.dfa = addr_of %.loc11_40.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc11: init %empty_tuple.type = call %bound_method.loc11(%addr.loc11_40.2) // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: @@ -1865,42 +2227,68 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] +// CHECK:STDOUT: %Protected: type = class_type @Protected [concrete] // CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] // CHECK:STDOUT: %Protected.Overload.cpp_overload_set.type: type = cpp_overload_set_type @Protected.Overload.cpp_overload_set [concrete] // CHECK:STDOUT: %Protected.Overload.cpp_overload_set.value: %Protected.Overload.cpp_overload_set.type = cpp_overload_set_value @Protected.Overload.cpp_overload_set [concrete] -// CHECK:STDOUT: %C.Overload.type.fd2af6.1: type = fn_type @C.Overload.1 [concrete] -// CHECK:STDOUT: %C.Overload.5043eb.1: %C.Overload.type.fd2af6.1 = struct_value () [concrete] -// CHECK:STDOUT: %int_1.5b8: Core.IntLiteral = int_value 1 [concrete] -// CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] -// CHECK:STDOUT: %i32: type = class_type @Int, @Int(%int_32) [concrete] -// CHECK:STDOUT: %C.Overload.type.fd2af6.2: type = fn_type @C.Overload.2 [concrete] -// CHECK:STDOUT: %C.Overload.5043eb.2: %C.Overload.type.fd2af6.2 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.type.d14: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] -// CHECK:STDOUT: %ImplicitAs.Convert.type.1b6: type = fn_type @ImplicitAs.Convert, @ImplicitAs(%i32) [concrete] -// CHECK:STDOUT: %To: Core.IntLiteral = bind_symbolic_name To, 0 [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%To) [symbolic] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340 = struct_value () [symbolic] -// CHECK:STDOUT: %ImplicitAs.impl_witness.204: = impl_witness imports.%ImplicitAs.impl_witness_table.9e9, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584: type = fn_type @Core.IntLiteral.as.ImplicitAs.impl.Convert, @Core.IntLiteral.as.ImplicitAs.impl(%int_32) [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0: %Core.IntLiteral.as.ImplicitAs.impl.Convert.type.584 = struct_value () [concrete] -// CHECK:STDOUT: %ImplicitAs.facet: %ImplicitAs.type.d14 = facet_value Core.IntLiteral, (%ImplicitAs.impl_witness.204) [concrete] -// CHECK:STDOUT: %.1df: type = fn_type_with_self_type %ImplicitAs.Convert.type.1b6, %ImplicitAs.facet [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.bound: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0 [concrete] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn: = specific_function %Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(%int_32) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %int_1.5b8, %Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn [concrete] -// CHECK:STDOUT: %int_1.5d2: %i32 = int_value 1 [concrete] +// CHECK:STDOUT: %PublicCall: type = class_type @PublicCall [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.type: type = cpp_overload_set_type @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.dfa: type = ptr_type %PublicCall [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk.type: type = fn_type @PublicCall__carbon_thunk [concrete] +// CHECK:STDOUT: %PublicCall__carbon_thunk: %PublicCall__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type.9a101f.1: type = fn_type @Overload__carbon_thunk.1 [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.794c5b.1: %Overload__carbon_thunk.type.9a101f.1 = struct_value () [concrete] +// CHECK:STDOUT: %ProtectedCall: type = class_type @ProtectedCall [concrete] +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.type: type = cpp_overload_set_type @ProtectedCall.ProtectedCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.value: %ProtectedCall.ProtectedCall.cpp_overload_set.type = cpp_overload_set_value @ProtectedCall.ProtectedCall.cpp_overload_set [concrete] +// CHECK:STDOUT: %ptr.8e6: type = ptr_type %ProtectedCall [concrete] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.type: type = fn_type @ProtectedCall__carbon_thunk [concrete] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk: %ProtectedCall__carbon_thunk.type = struct_value () [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.type.9a101f.2: type = fn_type @Overload__carbon_thunk.2 [concrete] +// CHECK:STDOUT: %Overload__carbon_thunk.794c5b.2: %Overload__carbon_thunk.type.9a101f.2 = struct_value () [concrete] +// CHECK:STDOUT: %type_where: type = facet_type > [concrete] +// CHECK:STDOUT: %facet_value.c53: %type_where = facet_value %ProtectedCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b70: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.c53) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.a5b: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.b70 = struct_value () [concrete] +// CHECK:STDOUT: %facet_value.136: %type_where = facet_value %PublicCall, () [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06: type = fn_type @DestroyT.binding.as_type.as.Destroy.impl.Op, @DestroyT.binding.as_type.as.Destroy.impl(%facet_value.136) [concrete] +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.3ff: %DestroyT.binding.as_type.as.Destroy.impl.Op.type.f06 = struct_value () [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: imports { +// CHECK:STDOUT: %Cpp: = namespace file.%Cpp.import_cpp, [concrete] { +// CHECK:STDOUT: .Protected = %Protected.decl +// CHECK:STDOUT: .PublicCall = %PublicCall.decl +// CHECK:STDOUT: .ProtectedCall = %ProtectedCall.decl +// CHECK:STDOUT: import Cpp//... +// CHECK:STDOUT: } +// CHECK:STDOUT: %Protected.decl: type = class_decl @Protected [concrete = constants.%Protected] {} {} // CHECK:STDOUT: %Protected.Overload.cpp_overload_set.value: %Protected.Overload.cpp_overload_set.type = cpp_overload_set_value @Protected.Overload.cpp_overload_set [concrete = constants.%Protected.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.decl.b29afa.1: %C.Overload.type.fd2af6.1 = fn_decl @C.Overload.1 [concrete = constants.%C.Overload.5043eb.1] {} {} -// CHECK:STDOUT: %C.Overload.decl.b29afa.2: %C.Overload.type.fd2af6.2 = fn_decl @C.Overload.2 [concrete = constants.%C.Overload.5043eb.2] { +// CHECK:STDOUT: %PublicCall.decl: type = class_decl @PublicCall [concrete = constants.%PublicCall] {} {} +// CHECK:STDOUT: %PublicCall.PublicCall.cpp_overload_set.value: %PublicCall.PublicCall.cpp_overload_set.type = cpp_overload_set_value @PublicCall.PublicCall.cpp_overload_set [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %PublicCall__carbon_thunk.decl: %PublicCall__carbon_thunk.type = fn_decl @PublicCall__carbon_thunk [concrete = constants.%PublicCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Overload__carbon_thunk.decl.85994f.1: %Overload__carbon_thunk.type.9a101f.1 = fn_decl @Overload__carbon_thunk.1 [concrete = constants.%Overload__carbon_thunk.794c5b.1] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %ProtectedCall.decl: type = class_decl @ProtectedCall [concrete = constants.%ProtectedCall] {} {} +// CHECK:STDOUT: %ProtectedCall.ProtectedCall.cpp_overload_set.value: %ProtectedCall.ProtectedCall.cpp_overload_set.type = cpp_overload_set_value @ProtectedCall.ProtectedCall.cpp_overload_set [concrete = constants.%ProtectedCall.ProtectedCall.cpp_overload_set.value] +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.decl: %ProtectedCall__carbon_thunk.type = fn_decl @ProtectedCall__carbon_thunk [concrete = constants.%ProtectedCall__carbon_thunk] { +// CHECK:STDOUT: +// CHECK:STDOUT: } { +// CHECK:STDOUT: +// CHECK:STDOUT: } +// CHECK:STDOUT: %Overload__carbon_thunk.decl.85994f.2: %Overload__carbon_thunk.type.9a101f.2 = fn_decl @Overload__carbon_thunk.2 [concrete = constants.%Overload__carbon_thunk.794c5b.2] { // CHECK:STDOUT: // CHECK:STDOUT: } { // CHECK:STDOUT: // CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import_ref.ee7: @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert.type (%Core.IntLiteral.as.ImplicitAs.impl.Convert.type.340) = import_ref Core//prelude/parts/int, loc{{\d+_\d+}}, loaded [symbolic = @Core.IntLiteral.as.ImplicitAs.impl.%Core.IntLiteral.as.ImplicitAs.impl.Convert (constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.1c0)] -// CHECK:STDOUT: %ImplicitAs.impl_witness_table.9e9 = impl_witness_table (%Core.import_ref.ee7), @Core.IntLiteral.as.ImplicitAs.impl [concrete] // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @Derived { @@ -1919,17 +2307,41 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: fn @Derived.F() { // CHECK:STDOUT: !entry: // CHECK:STDOUT: %Overload.ref.loc11: %Protected.Overload.cpp_overload_set.type = name_ref Overload, imports.%Protected.Overload.cpp_overload_set.value [concrete = constants.%Protected.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %C.Overload.call.loc11: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.1() +// CHECK:STDOUT: %Cpp.ref.loc11: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %PublicCall.ref.loc11_17: type = name_ref PublicCall, imports.%PublicCall.decl [concrete = constants.%PublicCall] +// CHECK:STDOUT: %PublicCall.ref.loc11_28: %PublicCall.PublicCall.cpp_overload_set.type = name_ref PublicCall, imports.%PublicCall.PublicCall.cpp_overload_set.value [concrete = constants.%PublicCall.PublicCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc11_40.1: ref %PublicCall = temporary_storage +// CHECK:STDOUT: %addr.loc11_40.1: %ptr.dfa = addr_of %.loc11_40.1 +// CHECK:STDOUT: %PublicCall__carbon_thunk.call: init %empty_tuple.type = call imports.%PublicCall__carbon_thunk.decl(%addr.loc11_40.1) +// CHECK:STDOUT: %.loc11_40.2: init %PublicCall = in_place_init %PublicCall__carbon_thunk.call, %.loc11_40.1 +// CHECK:STDOUT: %.loc11_40.3: ref %PublicCall = temporary %.loc11_40.1, %.loc11_40.2 +// CHECK:STDOUT: %.loc11_40.4: %PublicCall = bind_value %.loc11_40.3 +// CHECK:STDOUT: %.loc11_40.5: ref %PublicCall = value_as_ref %.loc11_40.4 +// CHECK:STDOUT: %addr.loc11_41: %ptr.dfa = addr_of %.loc11_40.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call.loc11: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl.85994f.1(%addr.loc11_41) // CHECK:STDOUT: %Overload.ref.loc12: %Protected.Overload.cpp_overload_set.type = name_ref Overload, imports.%Protected.Overload.cpp_overload_set.value [concrete = constants.%Protected.Overload.cpp_overload_set.value] -// CHECK:STDOUT: %int_1: Core.IntLiteral = int_value 1 [concrete = constants.%int_1.5b8] -// CHECK:STDOUT: %impl.elem0: %.1df = impl_witness_access constants.%ImplicitAs.impl_witness.204, element0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.0f0] -// CHECK:STDOUT: %bound_method.loc12_14.1: = bound_method %int_1, %impl.elem0 [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Core.IntLiteral.as.ImplicitAs.impl.Convert(constants.%int_32) [concrete = constants.%Core.IntLiteral.as.ImplicitAs.impl.Convert.specific_fn] -// CHECK:STDOUT: %bound_method.loc12_14.2: = bound_method %int_1, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %Core.IntLiteral.as.ImplicitAs.impl.Convert.call: init %i32 = call %bound_method.loc12_14.2(%int_1) [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_14.1: %i32 = value_of_initializer %Core.IntLiteral.as.ImplicitAs.impl.Convert.call [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %.loc12_14.2: %i32 = converted %int_1, %.loc12_14.1 [concrete = constants.%int_1.5d2] -// CHECK:STDOUT: %C.Overload.call.loc12: init %empty_tuple.type = call imports.%C.Overload.decl.b29afa.2(%.loc12_14.2) +// CHECK:STDOUT: %Cpp.ref.loc12: = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp] +// CHECK:STDOUT: %ProtectedCall.ref.loc12_17: type = name_ref ProtectedCall, imports.%ProtectedCall.decl [concrete = constants.%ProtectedCall] +// CHECK:STDOUT: %ProtectedCall.ref.loc12_31: %ProtectedCall.ProtectedCall.cpp_overload_set.type = name_ref ProtectedCall, imports.%ProtectedCall.ProtectedCall.cpp_overload_set.value [concrete = constants.%ProtectedCall.ProtectedCall.cpp_overload_set.value] +// CHECK:STDOUT: %.loc12_46.1: ref %ProtectedCall = temporary_storage +// CHECK:STDOUT: %addr.loc12_46.1: %ptr.8e6 = addr_of %.loc12_46.1 +// CHECK:STDOUT: %ProtectedCall__carbon_thunk.call: init %empty_tuple.type = call imports.%ProtectedCall__carbon_thunk.decl(%addr.loc12_46.1) +// CHECK:STDOUT: %.loc12_46.2: init %ProtectedCall = in_place_init %ProtectedCall__carbon_thunk.call, %.loc12_46.1 +// CHECK:STDOUT: %.loc12_46.3: ref %ProtectedCall = temporary %.loc12_46.1, %.loc12_46.2 +// CHECK:STDOUT: %.loc12_46.4: %ProtectedCall = bind_value %.loc12_46.3 +// CHECK:STDOUT: %.loc12_46.5: ref %ProtectedCall = value_as_ref %.loc12_46.4 +// CHECK:STDOUT: %addr.loc12_47: %ptr.8e6 = addr_of %.loc12_46.5 +// CHECK:STDOUT: %Overload__carbon_thunk.call.loc12: init %empty_tuple.type = call imports.%Overload__carbon_thunk.decl.85994f.2(%addr.loc12_47) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc12: = bound_method %.loc12_46.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.a5b +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method.loc12: = bound_method %.loc12_46.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.1 +// CHECK:STDOUT: %addr.loc12_46.2: %ptr.8e6 = addr_of %.loc12_46.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc12: init %empty_tuple.type = call %bound_method.loc12(%addr.loc12_46.2) +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.bound.loc11: = bound_method %.loc11_40.3, constants.%DestroyT.binding.as_type.as.Destroy.impl.Op.3ff +// CHECK:STDOUT: +// CHECK:STDOUT: %bound_method.loc11: = bound_method %.loc11_40.3, %DestroyT.binding.as_type.as.Destroy.impl.Op.specific_fn.2 +// CHECK:STDOUT: %addr.loc11_40.2: %ptr.dfa = addr_of %.loc11_40.3 +// CHECK:STDOUT: %DestroyT.binding.as_type.as.Destroy.impl.Op.call.loc11: init %empty_tuple.type = call %bound_method.loc11(%addr.loc11_40.2) // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: From 41b374220fa1383307f9fe1cfa3ad83f759005c9 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Mon, 20 Oct 2025 15:02:03 +0200 Subject: [PATCH 18/20] Rename `disallowed` to `denied`. --- .../testdata/interop/cpp/class/access.carbon | 288 +++++++++--------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/toolchain/check/testdata/interop/cpp/class/access.carbon b/toolchain/check/testdata/interop/cpp/class/access.carbon index 5752ebc9708b4..271240b94905a 100644 --- a/toolchain/check/testdata/interop/cpp/class/access.carbon +++ b/toolchain/check/testdata/interop/cpp/class/access.carbon @@ -805,7 +805,7 @@ fn Call(var instance: Cpp.Public) { //@dump-sem-ir-end } -// --- fail_base_class_public_access_disallowed.carbon +// --- fail_base_class_public_access_denied.carbon library "[[@TEST_NAME]]"; @@ -815,26 +815,26 @@ class Derived { extend base: Cpp.Public; fn CallStatic() { - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Public.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Public.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PrivateStatic(); } fn CallInstance(var instance: Cpp.Public) { //@dump-sem-ir-begin - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); //@dump-sem-ir-end @@ -842,42 +842,42 @@ class Derived { } fn Call(var instance: Cpp.Public) { - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Public.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Public.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Public.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Public.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Public` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } @@ -913,7 +913,7 @@ class Derived { } } -// --- fail_base_class_protected_access_disallowed.carbon +// --- fail_base_class_protected_access_denied.carbon library "[[@TEST_NAME]]"; @@ -923,91 +923,91 @@ class Derived { extend base: Cpp.Protected; fn CallStatic() { - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Protected.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Protected.PrivateStatic(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PrivateStatic(); } fn CallInstance(var instance: Cpp.Protected) { - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } } fn Call(var instance: Cpp.Protected) { - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Protected.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Protected.PublicStatic(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Derived` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PublicStatic(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Protected.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Protected.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Protected.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Protected.PrivateStatic(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PrivateStatic(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Protected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } -// --- fail_base_class_private_access_disallowed.carbon +// --- fail_base_class_private_access_denied.carbon library "[[@TEST_NAME]]"; @@ -1017,126 +1017,126 @@ class Derived { extend base: Cpp.Private; fn CallStatic() { - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Private.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Private.PublicStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PublicStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Private.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Private.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Private.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Private.PrivateStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PrivateStatic(); } fn CallInstance(var instance: Cpp.Private) { - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } } fn Call(var instance: Cpp.Private) { - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Private.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Private.PublicStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PublicStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Private.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Private.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.Private.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.Private.PrivateStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PrivateStatic(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.Private` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } @@ -1172,7 +1172,7 @@ class Derived { } } -// --- fail_base_class_public_protected_access_disallowed.carbon +// --- fail_base_class_public_protected_access_denied.carbon library "[[@TEST_NAME]]"; @@ -1182,91 +1182,91 @@ class Derived { extend base: Cpp.PublicProtected; fn CallStatic() { - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicProtected.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicProtected.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PrivateStatic(); } fn CallInstance(var instance: Cpp.PublicProtected) { - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } } fn Call(var instance: Cpp.PublicProtected) { - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicProtected.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicProtected.PublicStatic(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicStatic` of type `Derived` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PublicStatic(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicProtected.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicProtected.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedStatic` of type `Derived` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicProtected.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicProtected.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `PublicInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access protected member `ProtectedInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.PublicProtected` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_protected_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_protected_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } -// --- fail_base_class_public_private_access_disallowed.carbon +// --- fail_base_class_public_private_access_denied.carbon library "[[@TEST_NAME]]"; @@ -1276,126 +1276,126 @@ class Derived { extend base: Cpp.PublicPrivate; fn CallStatic() { - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicPrivate.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicPrivate.PublicStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PublicStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicPrivate.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicPrivate.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicPrivate.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicPrivate.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Self.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Self.PrivateStatic(); } fn CallInstance(var instance: Cpp.PublicPrivate) { - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:5: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } } fn Call(var instance: Cpp.PublicPrivate) { - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicPrivate.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicPrivate.PublicStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PublicStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PublicStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicPrivate.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicPrivate.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.ProtectedStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.ProtectedStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Cpp.PublicPrivate.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Cpp.PublicPrivate.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateStatic` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: Derived.PrivateStatic(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: Derived.PrivateStatic(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PublicInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PublicInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PublicInstance(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `ProtectedInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.ProtectedInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.ProtectedInstance(); - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon:[[@LINE+5]]:3: error: cannot access private member `PrivateInstance` of type `Cpp.PublicPrivate` [ClassInvalidMemberAccess] // CHECK:STDERR: instance.PrivateInstance(); // CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~ - // CHECK:STDERR: fail_base_class_public_private_access_disallowed.carbon: note: declared here [ClassMemberDeclaration] + // CHECK:STDERR: fail_base_class_public_private_access_denied.carbon: note: declared here [ClassMemberDeclaration] // CHECK:STDERR: instance.PrivateInstance(); } @@ -2483,7 +2483,7 @@ fn Call(var instance: Cpp.PublicPrivate) { // CHECK:STDOUT: // CHECK:STDOUT: } // CHECK:STDOUT: -// CHECK:STDOUT: --- fail_base_class_public_access_disallowed.carbon +// CHECK:STDOUT: --- fail_base_class_public_access_denied.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %Derived: type = class_type @Derived [concrete] From d3b0cf67ba480122d0212899306f9d81af127c7f Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Tue, 21 Oct 2025 09:30:34 +0200 Subject: [PATCH 19/20] Rename `ConvertCppAccess()` to `MapCppAccess()`. --- toolchain/check/cpp/access.cpp | 2 +- toolchain/check/cpp/access.h | 2 +- toolchain/check/cpp/import.cpp | 4 ++-- toolchain/check/cpp/overload_resolution.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/toolchain/check/cpp/access.cpp b/toolchain/check/cpp/access.cpp index cf1e398c8492d..fbfca25126c59 100644 --- a/toolchain/check/cpp/access.cpp +++ b/toolchain/check/cpp/access.cpp @@ -27,7 +27,7 @@ static auto CalculateEffectiveAccess(clang::DeclAccessPair access_pair) } } -auto ConvertCppAccess(clang::DeclAccessPair access_pair) -> SemIR::AccessKind { +auto MapCppAccess(clang::DeclAccessPair access_pair) -> SemIR::AccessKind { switch (CalculateEffectiveAccess(access_pair)) { case clang::AS_public: return SemIR::AccessKind::Public; diff --git a/toolchain/check/cpp/access.h b/toolchain/check/cpp/access.h index 5fee7a89e5327..557defe74fa61 100644 --- a/toolchain/check/cpp/access.h +++ b/toolchain/check/cpp/access.h @@ -11,7 +11,7 @@ namespace Carbon::Check { // Calculates the effective access kind from the given (declaration, lookup // access) pair. -auto ConvertCppAccess(clang::DeclAccessPair access_pair) -> SemIR::AccessKind; +auto MapCppAccess(clang::DeclAccessPair access_pair) -> SemIR::AccessKind; } // namespace Carbon::Check diff --git a/toolchain/check/cpp/import.cpp b/toolchain/check/cpp/import.cpp index b78ccdb3c1f5d..2569817206640 100644 --- a/toolchain/check/cpp/import.cpp +++ b/toolchain/check/cpp/import.cpp @@ -2119,7 +2119,7 @@ static auto GetOverloadSetAccess(const clang::UnresolvedSet<4>& overload_set) -> SemIR::AccessKind { SemIR::AccessKind access_kind = SemIR::AccessKind::Private; for (clang::DeclAccessPair overload : overload_set.pairs()) { - access_kind = std::min(access_kind, ConvertCppAccess(overload)); + access_kind = std::min(access_kind, MapCppAccess(overload)); if (access_kind == SemIR::AccessKind::Public) { break; } @@ -2245,7 +2245,7 @@ auto ImportNameFromCpp(Context& context, SemIR::LocId loc_id, } auto key = SemIR::ClangDeclKey::ForNonFunctionDecl(lookup->getFoundDecl()); return ImportNameDeclIntoScope(context, loc_id, scope_id, name_id, key, - ConvertCppAccess(lookup->begin().getPair())); + MapCppAccess(lookup->begin().getPair())); } auto ImportClassDefinitionForClangDecl(Context& context, SemIR::LocId loc_id, diff --git a/toolchain/check/cpp/overload_resolution.cpp b/toolchain/check/cpp/overload_resolution.cpp index 8e4ab190495ae..12f90b8b3b190 100644 --- a/toolchain/check/cpp/overload_resolution.cpp +++ b/toolchain/check/cpp/overload_resolution.cpp @@ -89,7 +89,7 @@ static auto CheckOverloadAccess(Context& context, SemIR::LocId loc_id, const SemIR::CppOverloadSet& overload_set, clang::DeclAccessPair overload, SemIR::InstId overload_inst_id) -> void { - SemIR::AccessKind member_access_kind = ConvertCppAccess(overload); + SemIR::AccessKind member_access_kind = MapCppAccess(overload); if (member_access_kind == SemIR::AccessKind::Public) { return; } From cbe8304e04be6db0768dfff81ad17cb019fd2233 Mon Sep 17 00:00:00 2001 From: Boaz Brickner Date: Tue, 21 Oct 2025 09:35:57 +0200 Subject: [PATCH 20/20] Clarify that the difference between private and none for class members is irrelevant for now. --- toolchain/check/cpp/access.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/toolchain/check/cpp/access.cpp b/toolchain/check/cpp/access.cpp index fbfca25126c59..291577dffa499 100644 --- a/toolchain/check/cpp/access.cpp +++ b/toolchain/check/cpp/access.cpp @@ -18,10 +18,14 @@ static auto CalculateEffectiveAccess(clang::DeclAccessPair access_pair) case clang::AS_private: return access_pair.getAccess(); case clang::AS_none: - // No access specified meaning depends on the declaration. For class - // members it means we lost access along the inheritance path. Otherwise - // it means there's no access associated with this function so we treat it - // as public. + // No access specified meaning depends on the declaration. For non class + // members, it means there's no access associated with this function so we + // treat it as public. For class members it means we lost access along the + // inheritance path, and the difference between `none` and `private` only + // matters when the access check is performed within a friend or member of + // the naming class. Because the naming class is a C++ class, and we don't + // yet have a mechanism for a C++ class to befriend a Carbon class, we can + // safely map `none` to `private` for now. return access_pair->isCXXClassMember() ? clang::AS_private : clang::AS_public; }