//===- Overload.h - C++ Overloading -----------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines the data structures and types used in C++ // overload resolution. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_SEMA_OVERLOAD_H #define LLVM_CLANG_SEMA_OVERLOAD_H #include "clang/AST/Decl.h" #include "clang/AST/DeclAccessPair.h" #include "clang/AST/DeclBase.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/Expr.h" #include "clang/AST/Type.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/SourceLocation.h" #include "clang/Sema/SemaFixItUtils.h" #include "clang/Sema/TemplateDeduction.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/AlignOf.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Casting.h" #include "llvm/Support/ErrorHandling.h" #include <cassert> #include <cstddef> #include <cstdint> #include <utility> namespace clang { class APValue; class ASTContext; class Sema; /// OverloadingResult - Capture the result of performing overload /// resolution. enum OverloadingResult { … }; enum OverloadCandidateDisplayKind { … }; /// The parameter ordering that will be used for the candidate. This is /// used to represent C++20 binary operator rewrites that reverse the order /// of the arguments. If the parameter ordering is Reversed, the Args list is /// reversed (but obviously the ParamDecls for the function are not). /// /// After forming an OverloadCandidate with reversed parameters, the list /// of conversions will (as always) be indexed by argument, so will be /// in reverse parameter order. enum class OverloadCandidateParamOrder : char { … }; /// The kinds of rewrite we perform on overload candidates. Note that the /// values here are chosen to serve as both bitflags and as a rank (lower /// values are preferred by overload resolution). enum OverloadCandidateRewriteKind : unsigned { … }; /// ImplicitConversionKind - The kind of implicit conversion used to /// convert an argument to a parameter's type. The enumerator values /// match with the table titled 'Conversions' in [over.ics.scs] and are listed /// such that better conversion kinds have smaller values. enum ImplicitConversionKind { … }; /// ImplicitConversionRank - The rank of an implicit conversion /// kind. The enumerator values match with Table 9 of (C++ /// 13.3.3.1.1) and are listed such that better conversion ranks /// have smaller values. enum ImplicitConversionRank { … }; ImplicitConversionRank GetConversionRank(ImplicitConversionKind Kind); ImplicitConversionRank GetDimensionConversionRank(ImplicitConversionRank Base, ImplicitConversionKind Dimension); /// NarrowingKind - The kind of narrowing conversion being performed by a /// standard conversion sequence according to C++11 [dcl.init.list]p7. enum NarrowingKind { … }; /// StandardConversionSequence - represents a standard conversion /// sequence (C++ 13.3.3.1.1). A standard conversion sequence /// contains between zero and three conversions. If a particular /// conversion is not needed, it will be set to the identity conversion /// (ICK_Identity). class StandardConversionSequence { … }; /// UserDefinedConversionSequence - Represents a user-defined /// conversion sequence (C++ 13.3.3.1.2). struct UserDefinedConversionSequence { … }; /// Represents an ambiguous user-defined conversion sequence. struct AmbiguousConversionSequence { … }; /// BadConversionSequence - Records information about an invalid /// conversion sequence. struct BadConversionSequence { … }; /// ImplicitConversionSequence - Represents an implicit conversion /// sequence, which may be a standard conversion sequence /// (C++ 13.3.3.1.1), user-defined conversion sequence (C++ 13.3.3.1.2), /// or an ellipsis conversion sequence (C++ 13.3.3.1.3). class ImplicitConversionSequence { … }; enum OverloadFailureKind { … }; /// A list of implicit conversion sequences for the arguments of an /// OverloadCandidate. ConversionSequenceList; /// OverloadCandidate - A single candidate in an overload set (C++ 13.3). struct OverloadCandidate { … }; /// OverloadCandidateSet - A set of overload candidates, used in C++ /// overload resolution (C++ 13.3). class OverloadCandidateSet { … }; bool isBetterOverloadCandidate(Sema &S, const OverloadCandidate &Cand1, const OverloadCandidate &Cand2, SourceLocation Loc, OverloadCandidateSet::CandidateSetKind Kind); struct ConstructorInfo { … }; // FIXME: Add an AddOverloadCandidate / AddTemplateOverloadCandidate overload // that takes one of these. inline ConstructorInfo getConstructorInfo(NamedDecl *ND) { … } // Returns false if signature help is relevant despite number of arguments // exceeding parameters. Specifically, it returns false when // PartialOverloading is true and one of the following: // * Function is variadic // * Function is template variadic // * Function is an instantiation of template variadic function // The last case may seem strange. The idea is that if we added one more // argument, we'd end up with a function similar to Function. Since, in the // context of signature help and/or code completion, we do not know what the // type of the next argument (that the user is typing) will be, this is as // good candidate as we can get, despite the fact that it takes one less // parameter. bool shouldEnforceArgLimit(bool PartialOverloading, FunctionDecl *Function); } // namespace clang #endif // LLVM_CLANG_SEMA_OVERLOAD_H