//===- SemaTemplate.h - C++ Templates ---------------------------*- 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 provides types used in the semantic analysis of C++ templates. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_SEMA_TEMPLATE_H #define LLVM_CLANG_SEMA_TEMPLATE_H #include "clang/AST/DeclTemplate.h" #include "clang/AST/DeclVisitor.h" #include "clang/AST/TemplateBase.h" #include "clang/AST/Type.h" #include "clang/Basic/LLVM.h" #include "clang/Sema/Sema.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/SmallVector.h" #include <cassert> #include <optional> #include <utility> namespace clang { class ASTContext; class BindingDecl; class CXXMethodDecl; class Decl; class DeclaratorDecl; class DeclContext; class EnumDecl; class FunctionDecl; class NamedDecl; class ParmVarDecl; class TagDecl; class TypedefNameDecl; class TypeSourceInfo; class VarDecl; /// The kind of template substitution being performed. enum class TemplateSubstitutionKind : char { … }; /// Data structure that captures multiple levels of template argument /// lists for use in template instantiation. /// /// Multiple levels of template arguments occur when instantiating the /// definitions of member templates. For example: /// /// \code /// template<typename T> /// struct X { /// template<T Value> /// struct Y { /// void f(); /// }; /// }; /// \endcode /// /// When instantiating X<int>::Y<17>::f, the multi-level template argument /// list will contain a template argument list (int) at depth 0 and a /// template argument list (17) at depth 1. class MultiLevelTemplateArgumentList { … }; /// The context in which partial ordering of function templates occurs. enum TPOC { … }; // This is lame but unavoidable in a world without forward // declarations of enums. The alternatives are to either pollute // Sema.h (by including this file) or sacrifice type safety (by // making Sema.h declare things as enums). class TemplatePartialOrderingContext { … }; /// Captures a template argument whose value has been deduced /// via c++ template argument deduction. class DeducedTemplateArgument : public TemplateArgument { … }; /// A stack-allocated class that identifies which local /// variable declaration instantiations are present in this scope. /// /// A new instance of this class type will be created whenever we /// instantiate a new function declaration, which will have its own /// set of parameter declarations. class LocalInstantiationScope { … }; class TemplateDeclInstantiator : public DeclVisitor<TemplateDeclInstantiator, Decl *> { … }; } // namespace clang #endif // LLVM_CLANG_SEMA_TEMPLATE_H