Files
carbon-lang/toolchain/check/cpp/call.h
T
Richard SmithandCarbon Infra Bot 15680ba101 Support calling functions with explicit template arguments. (#6814)
Treat the initial sequence ofarguments in a call to a C++ function up to
and including the last argument that is a type or template as being the
explicit template arguments for the call, rather than rejecting them
because they can't be converted to the parameter types.

Implements the current direction on leads issue #6768, except that no
syntax for explicitly annotating an argument as being a template
argument is provided.

---------

Co-authored-by: Carbon Infra Bot <carbon-external-infra@google.com>
2026-03-03 00:26:33 +00:00

60 lines
2.8 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_CALL_H_
#define CARBON_TOOLCHAIN_CHECK_CPP_CALL_H_
#include "toolchain/check/context.h"
#include "toolchain/sem_ir/ids.h"
namespace Carbon::Check {
// Converts a call argument list into a Clang template argument list for a given
// template. Returns true on success, or false if an error was diagnosed.
//
// If `diagnose` is false, errors will be suppressed.
auto ConvertArgsToTemplateArgs(Context& context,
clang::TemplateDecl* template_decl,
llvm::ArrayRef<SemIR::InstId> arg_ids,
clang::TemplateArgumentListInfo& arg_list,
bool diagnose = true) -> bool;
// Checks and builds SemIR for a call to a C++ function in the given overload
// set with self `self_id` and arguments `arg_ids`. `is_operator_syntax`
// indicates that this call was generated from an operator rather than from
// function call syntax, so arguments to `ref` parameters aren't required to
// have `ref` tags.
//
// Chooses the best viable C++ function by performing Clang overloading
// resolution over the overload set.
//
// Preserves the given self, if set. If not set, and the function is a C++
// member operator, self will be set to the first argument, which in turn will
// be removed from the given args.
//
// 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 PerformCallToCppFunction(Context& context, SemIR::LocId loc_id,
SemIR::CppOverloadSetId overload_set_id,
SemIR::InstId self_id,
llvm::ArrayRef<SemIR::InstId> arg_ids,
bool is_operator_syntax) -> SemIR::InstId;
// Checks and builds SemIR for a call to a C++ template name with arguments
// `arg_ids`.
//
// Converts the arguments to a C++ template argument list and attempts to
// instantiate a template specialization and import a declaration of it.
auto PerformCallToCppTemplateName(Context& context, SemIR::LocId loc_id,
SemIR::ClangDeclId template_decl_id,
llvm::ArrayRef<SemIR::InstId> arg_ids)
-> SemIR::InstId;
} // namespace Carbon::Check
#endif // CARBON_TOOLCHAIN_CHECK_CPP_CALL_H_