mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
Don't attempt to defer overload resolution by creating a `CppOverloadSet`; this was incorrect as we weren't saving the complete clang::OverloadCandidateSet, resulting in template candidates not being found. Moreover, saving the overload candidate set would be expensive, as the representation is surprisingly large, and is unnecessary since we're about to build a call. In passing, improve the diagnostics for overload resolution failure to use Clang's operator overload resolution messages rather than its call overload resolution messages. This fixes calls to templated operator overloads, which is the final piece needed for us to successfully compile an iostream-based "Hello world" program. --------- Co-authored-by: Jon Ross-Perkins <jperkins@google.com>
40 lines
1.9 KiB
C++
40 lines
1.9 KiB
C++
// 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_OVERLOAD_RESOLUTION_H_
|
|
#define CARBON_TOOLCHAIN_CHECK_CPP_OVERLOAD_RESOLUTION_H_
|
|
|
|
#include "toolchain/check/context.h"
|
|
#include "toolchain/sem_ir/function.h"
|
|
#include "toolchain/sem_ir/ids.h"
|
|
|
|
namespace Carbon::Check {
|
|
|
|
// Checks whether a selected overload is accessible and diagnoses if not.
|
|
// `parent_scope_id`, if specified, describes the scope that was named to find
|
|
// the overload. If unspecified, we assume the overload was found in the class
|
|
// that it is a direct member of, rather than a derived class.
|
|
auto CheckCppOverloadAccess(
|
|
Context& context, SemIR::LocId loc_id, clang::DeclAccessPair overload,
|
|
SemIR::KnownInstId<SemIR::FunctionDecl> overload_inst_id,
|
|
SemIR::NameScopeId parent_scope_id = SemIR::NameScopeId::None) -> void;
|
|
|
|
// Resolves which function to call using Clang overloading resolution, or
|
|
// returns an error instruction if overload resolution failed.
|
|
//
|
|
// A set with a single non-templated function goes through the same rules for
|
|
// overloading resolution. This is to make sure that calls that have no viable
|
|
// implicit conversion sequence are rejected even when an implicit conversion is
|
|
// possible. Keeping the same behavior here for consistency and supporting
|
|
// migrations so that the migrated callers from C++ remain valid.
|
|
auto PerformCppOverloadResolution(Context& context, SemIR::LocId loc_id,
|
|
SemIR::CppOverloadSetId overload_set_id,
|
|
SemIR::InstId self_id,
|
|
llvm::ArrayRef<SemIR::InstId> arg_ids)
|
|
-> SemIR::InstId;
|
|
|
|
} // namespace Carbon::Check
|
|
|
|
#endif // CARBON_TOOLCHAIN_CHECK_CPP_OVERLOAD_RESOLUTION_H_
|