1 | //===-- TypeNodes.def - Metadata about Type AST nodes -----------*- 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 defines the AST type info database. Each type node is |
10 | // enumerated by providing its name (e.g., "Builtin" or "Enum") and |
11 | // base class (e.g., "Type" or "TagType"). Depending on where in the |
12 | // abstract syntax tree the type will show up, the enumeration uses |
13 | // one of five different macros: |
14 | // |
15 | // TYPE(Class, Base) - A type that can show up anywhere in the AST, |
16 | // and might be dependent, canonical, or non-canonical. All clients |
17 | // will need to understand these types. |
18 | // |
19 | // ABSTRACT_TYPE(Class, Base) - An abstract class that shows up in |
20 | // the type hierarchy but has no concrete instances. |
21 | // |
22 | // NON_CANONICAL_TYPE(Class, Base) - A type that can show up |
23 | // anywhere in the AST but will never be a part of a canonical |
24 | // type. Clients that only need to deal with canonical types |
25 | // (ignoring, e.g., typedefs and other type aliases used for |
26 | // pretty-printing) can ignore these types. |
27 | // |
28 | // DEPENDENT_TYPE(Class, Base) - A type that will only show up |
29 | // within a C++ template that has not been instantiated, e.g., a |
30 | // type that is always dependent. Clients that do not need to deal |
31 | // with uninstantiated C++ templates can ignore these types. |
32 | // |
33 | // NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) - A type that |
34 | // is non-canonical unless it is dependent. Defaults to TYPE because |
35 | // it is neither reliably dependent nor reliably non-canonical. |
36 | // |
37 | // There is a sixth macro, independent of the others. Most clients |
38 | // will not need to use it. |
39 | // |
40 | // LEAF_TYPE(Class) - A type that never has inner types. Clients |
41 | // which can operate on such types more efficiently may wish to do so. |
42 | // |
43 | //===----------------------------------------------------------------------===// |
44 | |
45 | #ifndef ABSTRACT_TYPE |
46 | # define ABSTRACT_TYPE(Class, Base) TYPE(Class, Base) |
47 | #endif |
48 | |
49 | #ifndef NON_CANONICAL_TYPE |
50 | # define NON_CANONICAL_TYPE(Class, Base) TYPE(Class, Base) |
51 | #endif |
52 | |
53 | #ifndef DEPENDENT_TYPE |
54 | # define DEPENDENT_TYPE(Class, Base) TYPE(Class, Base) |
55 | #endif |
56 | |
57 | #ifndef NON_CANONICAL_UNLESS_DEPENDENT_TYPE |
58 | # define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base) TYPE(Class, Base) |
59 | #endif |
60 | |
61 | TYPE(Builtin, Type) |
62 | TYPE(Complex, Type) |
63 | TYPE(Pointer, Type) |
64 | TYPE(BlockPointer, Type) |
65 | ABSTRACT_TYPE(Reference, Type) |
66 | TYPE(LValueReference, ReferenceType) |
67 | TYPE(RValueReference, ReferenceType) |
68 | TYPE(MemberPointer, Type) |
69 | ABSTRACT_TYPE(Array, Type) |
70 | TYPE(ConstantArray, ArrayType) |
71 | TYPE(IncompleteArray, ArrayType) |
72 | TYPE(VariableArray, ArrayType) |
73 | DEPENDENT_TYPE(DependentSizedArray, ArrayType) |
74 | DEPENDENT_TYPE(DependentSizedExtVector, Type) |
75 | DEPENDENT_TYPE(DependentAddressSpace, Type) |
76 | TYPE(Vector, Type) |
77 | DEPENDENT_TYPE(DependentVector, Type) |
78 | TYPE(ExtVector, VectorType) |
79 | ABSTRACT_TYPE(Function, Type) |
80 | TYPE(FunctionProto, FunctionType) |
81 | TYPE(FunctionNoProto, FunctionType) |
82 | DEPENDENT_TYPE(UnresolvedUsing, Type) |
83 | NON_CANONICAL_TYPE(Paren, Type) |
84 | NON_CANONICAL_TYPE(Typedef, Type) |
85 | NON_CANONICAL_TYPE(Adjusted, Type) |
86 | NON_CANONICAL_TYPE(Decayed, AdjustedType) |
87 | NON_CANONICAL_UNLESS_DEPENDENT_TYPE(TypeOfExpr, Type) |
88 | NON_CANONICAL_UNLESS_DEPENDENT_TYPE(TypeOf, Type) |
89 | NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Decltype, Type) |
90 | NON_CANONICAL_UNLESS_DEPENDENT_TYPE(UnaryTransform, Type) |
91 | ABSTRACT_TYPE(Tag, Type) |
92 | TYPE(Record, TagType) |
93 | TYPE(Enum, TagType) |
94 | NON_CANONICAL_TYPE(Elaborated, Type) |
95 | NON_CANONICAL_TYPE(Attributed, Type) |
96 | DEPENDENT_TYPE(TemplateTypeParm, Type) |
97 | NON_CANONICAL_TYPE(SubstTemplateTypeParm, Type) |
98 | DEPENDENT_TYPE(SubstTemplateTypeParmPack, Type) |
99 | NON_CANONICAL_UNLESS_DEPENDENT_TYPE(TemplateSpecialization, Type) |
100 | ABSTRACT_TYPE(Deduced, Type) |
101 | TYPE(Auto, DeducedType) |
102 | TYPE(DeducedTemplateSpecialization, DeducedType) |
103 | DEPENDENT_TYPE(InjectedClassName, Type) |
104 | DEPENDENT_TYPE(DependentName, Type) |
105 | DEPENDENT_TYPE(DependentTemplateSpecialization, Type) |
106 | NON_CANONICAL_UNLESS_DEPENDENT_TYPE(PackExpansion, Type) |
107 | NON_CANONICAL_TYPE(ObjCTypeParam, Type) |
108 | TYPE(ObjCObject, Type) |
109 | TYPE(ObjCInterface, ObjCObjectType) |
110 | TYPE(ObjCObjectPointer, Type) |
111 | TYPE(Pipe, Type) |
112 | TYPE(Atomic, Type) |
113 | |
114 | #ifdef LAST_TYPE |
115 | LAST_TYPE(Atomic) |
116 | #undef LAST_TYPE |
117 | #endif |
118 | |
119 | // These types are always leaves in the type hierarchy. |
120 | #ifdef LEAF_TYPE |
121 | LEAF_TYPE(Enum) |
122 | LEAF_TYPE(Builtin) |
123 | LEAF_TYPE(Record) |
124 | LEAF_TYPE(InjectedClassName) |
125 | LEAF_TYPE(ObjCInterface) |
126 | LEAF_TYPE(TemplateTypeParm) |
127 | #undef LEAF_TYPE |
128 | #endif |
129 | |
130 | #undef NON_CANONICAL_UNLESS_DEPENDENT_TYPE |
131 | #undef DEPENDENT_TYPE |
132 | #undef NON_CANONICAL_TYPE |
133 | #undef ABSTRACT_TYPE |
134 | #undef TYPE |
135 | |