mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 22:02:23 +01:00
This allows to find the spaceship `operator<=>` when a comparison operator is not available, and `operator==` when `operator!=` is not available. Support added to both lookup and overload resolution, by adding `OperatorRewriteInfo` and propagating it in `CppOverloadSet`. In case overload resolution chooses to use an operator which requires rewriting, we emit a `TODO` since rewriting is not yet supported. Part of #6170.
47 lines
1.5 KiB
C++
47 lines
1.5 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_SEM_IR_CPP_OVERLOAD_SET_H_
|
|
#define CARBON_TOOLCHAIN_SEM_IR_CPP_OVERLOAD_SET_H_
|
|
|
|
#include "clang/AST/Decl.h"
|
|
#include "clang/AST/UnresolvedSet.h"
|
|
#include "clang/Sema/Overload.h"
|
|
#include "common/ostream.h"
|
|
#include "toolchain/base/value_store.h"
|
|
#include "toolchain/sem_ir/ids.h"
|
|
|
|
namespace Carbon::SemIR {
|
|
|
|
// An overloaded C++ function.
|
|
struct CppOverloadSet : public Printable<CppOverloadSet> {
|
|
// The function's name.
|
|
NameId name_id;
|
|
|
|
// The parent scope.
|
|
NameScopeId parent_scope_id;
|
|
|
|
// The naming class in the name lookup that found this overload set.
|
|
clang::CXXRecordDecl* naming_class;
|
|
|
|
// List of all named decls found at name lookup.
|
|
// TODO: Find a good small size for the UnresolvedSet<size> or rework how we
|
|
// store the candidates.
|
|
clang::UnresolvedSet<4> candidate_functions;
|
|
|
|
/// Information about operator rewrites to consider when adding operator
|
|
/// functions to a candidate set.
|
|
clang::OverloadCandidateSet::OperatorRewriteInfo operator_rewrite_info;
|
|
|
|
auto Print(llvm::raw_ostream& out) const -> void {
|
|
out << "name: " << name_id << ", parent_scope: " << parent_scope_id;
|
|
}
|
|
};
|
|
|
|
using CppOverloadSetStore = ValueStore<CppOverloadSetId, CppOverloadSet>;
|
|
|
|
} // namespace Carbon::SemIR
|
|
|
|
#endif // CARBON_TOOLCHAIN_SEM_IR_CPP_OVERLOAD_SET_H_
|