summaryrefslogtreecommitdiffstats
path: root/include/clang/Sema/TemplateDeduction.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/Sema/TemplateDeduction.h')
-rw-r--r--include/clang/Sema/TemplateDeduction.h315
1 files changed, 0 insertions, 315 deletions
diff --git a/include/clang/Sema/TemplateDeduction.h b/include/clang/Sema/TemplateDeduction.h
deleted file mode 100644
index c22c703..0000000
--- a/include/clang/Sema/TemplateDeduction.h
+++ /dev/null
@@ -1,315 +0,0 @@
-//===- TemplateDeduction.h - C++ template argument deduction ----*- C++ -*-===/
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//===----------------------------------------------------------------------===/
-//
-// This file provides types used with Sema's template argument deduction
-// routines.
-//
-//===----------------------------------------------------------------------===/
-#ifndef LLVM_CLANG_SEMA_TEMPLATEDEDUCTION_H
-#define LLVM_CLANG_SEMA_TEMPLATEDEDUCTION_H
-
-#include "clang/AST/DeclTemplate.h"
-#include "clang/Basic/PartialDiagnostic.h"
-#include "llvm/ADT/SmallVector.h"
-
-namespace clang {
-
-struct DeducedPack;
-class TemplateArgumentList;
-class Sema;
-
-namespace sema {
-
-/// \brief Provides information about an attempted template argument
-/// deduction, whose success or failure was described by a
-/// TemplateDeductionResult value.
-class TemplateDeductionInfo {
- /// \brief The deduced template argument list.
- ///
- TemplateArgumentList *Deduced;
-
- /// \brief The source location at which template argument
- /// deduction is occurring.
- SourceLocation Loc;
-
- /// \brief Have we suppressed an error during deduction?
- bool HasSFINAEDiagnostic;
-
- /// \brief Warnings (and follow-on notes) that were suppressed due to
- /// SFINAE while performing template argument deduction.
- SmallVector<PartialDiagnosticAt, 4> SuppressedDiagnostics;
-
- TemplateDeductionInfo(const TemplateDeductionInfo &) = delete;
- void operator=(const TemplateDeductionInfo &) = delete;
-
-public:
- TemplateDeductionInfo(SourceLocation Loc)
- : Deduced(nullptr), Loc(Loc), HasSFINAEDiagnostic(false),
- Expression(nullptr) {}
-
- /// \brief Returns the location at which template argument is
- /// occurring.
- SourceLocation getLocation() const {
- return Loc;
- }
-
- /// \brief Take ownership of the deduced template argument list.
- TemplateArgumentList *take() {
- TemplateArgumentList *Result = Deduced;
- Deduced = nullptr;
- return Result;
- }
-
- /// \brief Take ownership of the SFINAE diagnostic.
- void takeSFINAEDiagnostic(PartialDiagnosticAt &PD) {
- assert(HasSFINAEDiagnostic);
- PD.first = SuppressedDiagnostics.front().first;
- PD.second.swap(SuppressedDiagnostics.front().second);
- SuppressedDiagnostics.clear();
- HasSFINAEDiagnostic = false;
- }
-
- /// \brief Provide a new template argument list that contains the
- /// results of template argument deduction.
- void reset(TemplateArgumentList *NewDeduced) {
- Deduced = NewDeduced;
- }
-
- /// \brief Is a SFINAE diagnostic available?
- bool hasSFINAEDiagnostic() const {
- return HasSFINAEDiagnostic;
- }
-
- /// \brief Set the diagnostic which caused the SFINAE failure.
- void addSFINAEDiagnostic(SourceLocation Loc, PartialDiagnostic PD) {
- // Only collect the first diagnostic.
- if (HasSFINAEDiagnostic)
- return;
- SuppressedDiagnostics.clear();
- SuppressedDiagnostics.emplace_back(Loc, std::move(PD));
- HasSFINAEDiagnostic = true;
- }
-
- /// \brief Add a new diagnostic to the set of diagnostics
- void addSuppressedDiagnostic(SourceLocation Loc,
- PartialDiagnostic PD) {
- if (HasSFINAEDiagnostic)
- return;
- SuppressedDiagnostics.emplace_back(Loc, std::move(PD));
- }
-
- /// \brief Iterator over the set of suppressed diagnostics.
- typedef SmallVectorImpl<PartialDiagnosticAt>::const_iterator
- diag_iterator;
-
- /// \brief Returns an iterator at the beginning of the sequence of suppressed
- /// diagnostics.
- diag_iterator diag_begin() const { return SuppressedDiagnostics.begin(); }
-
- /// \brief Returns an iterator at the end of the sequence of suppressed
- /// diagnostics.
- diag_iterator diag_end() const { return SuppressedDiagnostics.end(); }
-
- /// \brief The template parameter to which a template argument
- /// deduction failure refers.
- ///
- /// Depending on the result of template argument deduction, this
- /// template parameter may have different meanings:
- ///
- /// TDK_Incomplete: this is the first template parameter whose
- /// corresponding template argument was not deduced.
- ///
- /// TDK_Inconsistent: this is the template parameter for which
- /// two different template argument values were deduced.
- TemplateParameter Param;
-
- /// \brief The first template argument to which the template
- /// argument deduction failure refers.
- ///
- /// Depending on the result of the template argument deduction,
- /// this template argument may have different meanings:
- ///
- /// TDK_Inconsistent: this argument is the first value deduced
- /// for the corresponding template parameter.
- ///
- /// TDK_SubstitutionFailure: this argument is the template
- /// argument we were instantiating when we encountered an error.
- ///
- /// TDK_DeducedMismatch: this is the parameter type, after substituting
- /// deduced arguments.
- ///
- /// TDK_NonDeducedMismatch: this is the component of the 'parameter'
- /// of the deduction, directly provided in the source code.
- TemplateArgument FirstArg;
-
- /// \brief The second template argument to which the template
- /// argument deduction failure refers.
- ///
- /// TDK_Inconsistent: this argument is the second value deduced
- /// for the corresponding template parameter.
- ///
- /// TDK_DeducedMismatch: this is the (adjusted) call argument type.
- ///
- /// TDK_NonDeducedMismatch: this is the mismatching component of the
- /// 'argument' of the deduction, from which we are deducing arguments.
- ///
- /// FIXME: Finish documenting this.
- TemplateArgument SecondArg;
-
- union {
- /// \brief The expression which caused a deduction failure.
- ///
- /// TDK_FailedOverloadResolution: this argument is the reference to
- /// an overloaded function which could not be resolved to a specific
- /// function.
- Expr *Expression;
-
- /// \brief The index of the function argument that caused a deduction
- /// failure.
- ///
- /// TDK_DeducedMismatch: this is the index of the argument that had a
- /// different argument type from its substituted parameter type.
- unsigned CallArgIndex;
- };
-
- /// \brief Information on packs that we're currently expanding.
- ///
- /// FIXME: This should be kept internal to SemaTemplateDeduction.
- SmallVector<DeducedPack *, 8> PendingDeducedPacks;
-};
-
-} // end namespace sema
-
-/// A structure used to record information about a failed
-/// template argument deduction, for diagnosis.
-struct DeductionFailureInfo {
- /// A Sema::TemplateDeductionResult.
- unsigned Result : 8;
-
- /// \brief Indicates whether a diagnostic is stored in Diagnostic.
- unsigned HasDiagnostic : 1;
-
- /// \brief Opaque pointer containing additional data about
- /// this deduction failure.
- void *Data;
-
- /// \brief A diagnostic indicating why deduction failed.
- union {
- void *Align;
- char Diagnostic[sizeof(PartialDiagnosticAt)];
- };
-
- /// \brief Retrieve the diagnostic which caused this deduction failure,
- /// if any.
- PartialDiagnosticAt *getSFINAEDiagnostic();
-
- /// \brief Retrieve the template parameter this deduction failure
- /// refers to, if any.
- TemplateParameter getTemplateParameter();
-
- /// \brief Retrieve the template argument list associated with this
- /// deduction failure, if any.
- TemplateArgumentList *getTemplateArgumentList();
-
- /// \brief Return the first template argument this deduction failure
- /// refers to, if any.
- const TemplateArgument *getFirstArg();
-
- /// \brief Return the second template argument this deduction failure
- /// refers to, if any.
- const TemplateArgument *getSecondArg();
-
- /// \brief Return the expression this deduction failure refers to,
- /// if any.
- Expr *getExpr();
-
- /// \brief Return the index of the call argument that this deduction
- /// failure refers to, if any.
- llvm::Optional<unsigned> getCallArgIndex();
-
- /// \brief Free any memory associated with this deduction failure.
- void Destroy();
-};
-
-/// TemplateSpecCandidate - This is a generalization of OverloadCandidate
-/// which keeps track of template argument deduction failure info, when
-/// handling explicit specializations (and instantiations) of templates
-/// beyond function overloading.
-/// For now, assume that the candidates are non-matching specializations.
-/// TODO: In the future, we may need to unify/generalize this with
-/// OverloadCandidate.
-struct TemplateSpecCandidate {
- /// Specialization - The actual specialization that this candidate
- /// represents. When NULL, this may be a built-in candidate.
- Decl *Specialization;
-
- /// Template argument deduction info
- DeductionFailureInfo DeductionFailure;
-
- void set(Decl *Spec, DeductionFailureInfo Info) {
- Specialization = Spec;
- DeductionFailure = Info;
- }
-
- /// Diagnose a template argument deduction failure.
- void NoteDeductionFailure(Sema &S, bool ForTakingAddress);
-};
-
-/// TemplateSpecCandidateSet - A set of generalized overload candidates,
-/// used in template specializations.
-/// TODO: In the future, we may need to unify/generalize this with
-/// OverloadCandidateSet.
-class TemplateSpecCandidateSet {
- SmallVector<TemplateSpecCandidate, 16> Candidates;
- SourceLocation Loc;
- // Stores whether we're taking the address of these candidates. This helps us
- // produce better error messages when dealing with the pass_object_size
- // attribute on parameters.
- bool ForTakingAddress;
-
- TemplateSpecCandidateSet(
- const TemplateSpecCandidateSet &) = delete;
- void operator=(const TemplateSpecCandidateSet &) = delete;
-
- void destroyCandidates();
-
-public:
- TemplateSpecCandidateSet(SourceLocation Loc, bool ForTakingAddress = false)
- : Loc(Loc), ForTakingAddress(ForTakingAddress) {}
- ~TemplateSpecCandidateSet() { destroyCandidates(); }
-
- SourceLocation getLocation() const { return Loc; }
-
- /// \brief Clear out all of the candidates.
- /// TODO: This may be unnecessary.
- void clear();
-
- typedef SmallVector<TemplateSpecCandidate, 16>::iterator iterator;
- iterator begin() { return Candidates.begin(); }
- iterator end() { return Candidates.end(); }
-
- size_t size() const { return Candidates.size(); }
- bool empty() const { return Candidates.empty(); }
-
- /// \brief Add a new candidate with NumConversions conversion sequence slots
- /// to the overload set.
- TemplateSpecCandidate &addCandidate() {
- Candidates.emplace_back();
- return Candidates.back();
- }
-
- void NoteCandidates(Sema &S, SourceLocation Loc);
-
- void NoteCandidates(Sema &S, SourceLocation Loc) const {
- const_cast<TemplateSpecCandidateSet *>(this)->NoteCandidates(S, Loc);
- }
-};
-
-} // end namespace clang
-
-#endif
OpenPOWER on IntegriCloud