clang 20.0.0git
ParsedTemplate.h
Go to the documentation of this file.
1//===--- ParsedTemplate.h - Template Parsing Data Types ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file provides data structures that store the parsed representation of
10// templates.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SEMA_PARSEDTEMPLATE_H
15#define LLVM_CLANG_SEMA_PARSEDTEMPLATE_H
16
20#include "clang/Sema/DeclSpec.h"
22#include "llvm/ADT/SmallVector.h"
23#include <cassert>
24#include <cstdlib>
25#include <new>
26
27namespace clang {
28 /// Represents the parsed form of a C++ template argument.
30 public:
31 /// Describes the kind of template argument that was parsed.
32 enum KindType {
33 /// A template type parameter, stored as a type.
35 /// A non-type template parameter, stored as an expression.
37 /// A template template argument, stored as a template name.
39 };
40
41 /// Build an empty template argument.
42 ///
43 /// This template argument is invalid.
44 ParsedTemplateArgument() : Kind(Type), Arg(nullptr) { }
45
46 /// Create a template type argument or non-type template argument.
47 ///
48 /// \param Arg the template type argument or non-type template argument.
49 /// \param Loc the location of the type.
51 : Kind(Kind), Arg(Arg), Loc(Loc) { }
52
53 /// Create a template template argument.
54 ///
55 /// \param SS the C++ scope specifier that precedes the template name, if
56 /// any.
57 ///
58 /// \param Template the template to which this template template
59 /// argument refers.
60 ///
61 /// \param TemplateLoc the location of the template name.
64 SourceLocation TemplateLoc)
66 Arg(Template.getAsOpaquePtr()), SS(SS), Loc(TemplateLoc) {}
67
68 /// Determine whether the given template argument is invalid.
69 bool isInvalid() const { return Arg == nullptr; }
70
71 /// Determine what kind of template argument we have.
72 KindType getKind() const { return Kind; }
73
74 /// Retrieve the template type argument's type.
76 assert(Kind == Type && "Not a template type argument");
78 }
79
80 /// Retrieve the non-type template argument's expression.
81 Expr *getAsExpr() const {
82 assert(Kind == NonType && "Not a non-type template argument");