Bug Summary

File:tools/clang/lib/AST/ASTDiagnostic.cpp
Warning:line 307, column 28
Called C++ object pointer is null

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name ASTDiagnostic.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mthread-model posix -mframe-pointer=none -relaxed-aliasing -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu x86-64 -dwarf-column-info -debugger-tuning=gdb -ffunction-sections -fdata-sections -resource-dir /usr/lib/llvm-10/lib/clang/10.0.0 -D CLANG_VENDOR="Debian " -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/tools/clang/lib/AST -I /build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST -I /build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include -I /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/tools/clang/include -I /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/include -I /build/llvm-toolchain-snapshot-10~svn374877/include -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/x86_64-linux-gnu/c++/6.3.0 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/backward -internal-isystem /usr/local/include -internal-isystem /usr/lib/llvm-10/lib/clang/10.0.0/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir /build/llvm-toolchain-snapshot-10~svn374877/build-llvm/tools/clang/lib/AST -fdebug-prefix-map=/build/llvm-toolchain-snapshot-10~svn374877=. -ferror-limit 19 -fmessage-length 0 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fobjc-runtime=gcc -fno-common -fdiagnostics-show-option -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -o /tmp/scan-build-2019-10-15-233810-7101-1 -x c++ /build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp

/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp

1//===--- ASTDiagnostic.cpp - Diagnostic Printing Hooks for AST Nodes ------===//
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 implements a diagnostic formatting hook for AST elements.
10//
11//===----------------------------------------------------------------------===//
12
13#include "clang/AST/ASTDiagnostic.h"
14#include "clang/AST/ASTContext.h"
15#include "clang/AST/ASTLambda.h"
16#include "clang/AST/Attr.h"
17#include "clang/AST/DeclObjC.h"
18#include "clang/AST/DeclTemplate.h"
19#include "clang/AST/ExprCXX.h"
20#include "clang/AST/TemplateBase.h"
21#include "clang/AST/Type.h"
22#include "llvm/Support/raw_ostream.h"
23
24using namespace clang;
25
26// Returns a desugared version of the QualType, and marks ShouldAKA as true
27// whenever we remove significant sugar from the type.
28static QualType Desugar(ASTContext &Context, QualType QT, bool &ShouldAKA) {
29 QualifierCollector QC;
30
31 while (true) {
32 const Type *Ty = QC.strip(QT);
33
34 // Don't aka just because we saw an elaborated type...
35 if (const ElaboratedType *ET = dyn_cast<ElaboratedType>(Ty)) {
36 QT = ET->desugar();
37 continue;
38 }
39 // ... or a paren type ...
40 if (const ParenType *PT = dyn_cast<ParenType>(Ty)) {
41 QT = PT->desugar();
42 continue;
43 }
44 // ... or a macro defined type ...
45 if (const MacroQualifiedType *MDT = dyn_cast<MacroQualifiedType>(Ty)) {
46 QT = MDT->desugar();
47 continue;
48 }
49 // ...or a substituted template type parameter ...
50 if (const SubstTemplateTypeParmType *ST =
51 dyn_cast<SubstTemplateTypeParmType>(Ty)) {
52 QT = ST->desugar();
53 continue;
54 }
55 // ...or an attributed type...
56 if (const AttributedType *AT = dyn_cast<AttributedType>(Ty)) {
57 QT = AT->desugar();
58 continue;
59 }
60 // ...or an adjusted type...
61 if (const AdjustedType *AT = dyn_cast<AdjustedType>(Ty)) {
62 QT = AT->desugar();
63 continue;
64 }
65 // ... or an auto type.
66 if (const AutoType *AT = dyn_cast<AutoType>(Ty)) {
67 if (!AT->isSugared())
68 break;
69 QT = AT->desugar();
70 continue;
71 }
72
73 // Desugar FunctionType if return type or any parameter type should be
74 // desugared. Preserve nullability attribute on desugared types.
75 if (const FunctionType *FT = dyn_cast<FunctionType>(Ty)) {
76 bool DesugarReturn = false;
77 QualType SugarRT = FT->getReturnType();
78 QualType RT = Desugar(Context, SugarRT, DesugarReturn);
79 if (auto nullability = AttributedType::stripOuterNullability(SugarRT)) {
80 RT = Context.getAttributedType(
81 AttributedType::getNullabilityAttrKind(*nullability), RT, RT);
82 }
83
84 bool DesugarArgument = false;
85 SmallVector<QualType, 4> Args;
86 const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(FT);
87 if (FPT) {
88 for (QualType SugarPT : FPT->param_types()) {
89 QualType PT = Desugar(Context, SugarPT, DesugarArgument);
90 if (auto nullability =
91 AttributedType::stripOuterNullability(SugarPT)) {
92 PT = Context.getAttributedType(
93 AttributedType::getNullabilityAttrKind(*nullability), PT, PT);
94 }
95 Args.push_back(PT);
96 }
97 }
98
99 if (DesugarReturn || DesugarArgument) {
100 ShouldAKA = true;
101 QT = FPT ? Context.getFunctionType(RT, Args, FPT->getExtProtoInfo())
102 : Context.getFunctionNoProtoType(RT, FT->getExtInfo());
103 break;
104 }
105 }
106
107 // Desugar template specializations if any template argument should be
108 // desugared.
109 if (const TemplateSpecializationType *TST =
110 dyn_cast<TemplateSpecializationType>(Ty)) {
111 if (!TST->isTypeAlias()) {
112 bool DesugarArgument = false;
113 SmallVector<TemplateArgument, 4> Args;
114 for (unsigned I = 0, N = TST->getNumArgs(); I != N; ++I) {
115 const TemplateArgument &Arg = TST->getArg(I);
116 if (Arg.getKind() == TemplateArgument::Type)
117 Args.push_back(Desugar(Context, Arg.getAsType(), DesugarArgument));
118 else
119 Args.push_back(Arg);
120 }
121
122 if (DesugarArgument) {
123 ShouldAKA = true;
124 QT = Context.getTemplateSpecializationType(
125 TST->getTemplateName(), Args, QT);
126 }
127 break;
128 }
129 }
130
131 // Don't desugar magic Objective-C types.
132 if (QualType(Ty,0) == Context.getObjCIdType() ||
133 QualType(Ty,0) == Context.getObjCClassType() ||
134 QualType(Ty,0) == Context.getObjCSelType() ||
135 QualType(Ty,0) == Context.getObjCProtoType())
136 break;
137
138 // Don't desugar va_list.
139 if (QualType(Ty, 0) == Context.getBuiltinVaListType() ||
140 QualType(Ty, 0) == Context.getBuiltinMSVaListType())
141 break;
142
143 // Otherwise, do a single-step desugar.
144 QualType Underlying;
145 bool IsSugar = false;
146 switch (Ty->getTypeClass()) {
147#define ABSTRACT_TYPE(Class, Base)
148#define TYPE(Class, Base) \
149case Type::Class: { \
150const Class##Type *CTy = cast<Class##Type>(Ty); \
151if (CTy->isSugared()) { \
152IsSugar = true; \
153Underlying = CTy->desugar(); \
154} \
155break; \
156}
157#include "clang/AST/TypeNodes.inc"
158 }
159
160 // If it wasn't sugared, we're done.
161 if (!IsSugar)
162 break;
163
164 // If the desugared type is a vector type, we don't want to expand
165 // it, it will turn into an attribute mess. People want their "vec4".
166 if (isa<VectorType>(Underlying))
167 break;
168
169 // Don't desugar through the primary typedef of an anonymous type.
170 if (const TagType *UTT = Underlying->getAs<TagType>())
171 if (const TypedefType *QTT = dyn_cast<TypedefType>(QT))
172 if (UTT->getDecl()->getTypedefNameForAnonDecl() == QTT->getDecl())
173 break;
174
175 // Record that we actually looked through an opaque type here.
176 ShouldAKA = true;
177 QT = Underlying;
178 }
179
180 // If we have a pointer-like type, desugar the pointee as well.
181 // FIXME: Handle other pointer-like types.
182 if (const PointerType *Ty = QT->getAs<PointerType>()) {
183 QT = Context.getPointerType(Desugar(Context, Ty->getPointeeType(),
184 ShouldAKA));
185 } else if (const auto *Ty = QT->getAs<ObjCObjectPointerType>()) {
186 QT = Context.getObjCObjectPointerType(Desugar(Context, Ty->getPointeeType(),
187 ShouldAKA));
188 } else if (const LValueReferenceType *Ty = QT->getAs<LValueReferenceType>()) {
189 QT = Context.getLValueReferenceType(Desugar(Context, Ty->getPointeeType(),
190 ShouldAKA));
191 } else if (const RValueReferenceType *Ty = QT->getAs<RValueReferenceType>()) {
192 QT = Context.getRValueReferenceType(Desugar(Context, Ty->getPointeeType(),
193 ShouldAKA));
194 } else if (const auto *Ty = QT->getAs<ObjCObjectType>()) {
195 if (Ty->getBaseType().getTypePtr() != Ty && !ShouldAKA) {
196 QualType BaseType = Desugar(Context, Ty->getBaseType(), ShouldAKA);
197 QT = Context.getObjCObjectType(BaseType, Ty->getTypeArgsAsWritten(),
198 llvm::makeArrayRef(Ty->qual_begin(),
199 Ty->getNumProtocols()),
200 Ty->isKindOfTypeAsWritten());
201 }
202 }
203
204 return QC.apply(Context, QT);
205}
206
207/// Convert the given type to a string suitable for printing as part of
208/// a diagnostic.
209///
210/// There are four main criteria when determining whether we should have an
211/// a.k.a. clause when pretty-printing a type:
212///
213/// 1) Some types provide very minimal sugar that doesn't impede the
214/// user's understanding --- for example, elaborated type
215/// specifiers. If this is all the sugar we see, we don't want an
216/// a.k.a. clause.
217/// 2) Some types are technically sugared but are much more familiar
218/// when seen in their sugared form --- for example, va_list,
219/// vector types, and the magic Objective C types. We don't
220/// want to desugar these, even if we do produce an a.k.a. clause.
221/// 3) Some types may have already been desugared previously in this diagnostic.
222/// if this is the case, doing another "aka" would just be clutter.
223/// 4) Two different types within the same diagnostic have the same output
224/// string. In this case, force an a.k.a with the desugared type when
225/// doing so will provide additional information.
226///
227/// \param Context the context in which the type was allocated
228/// \param Ty the type to print
229/// \param QualTypeVals pointer values to QualTypes which are used in the
230/// diagnostic message
231static std::string
232ConvertTypeToDiagnosticString(ASTContext &Context, QualType Ty,
233 ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs,
234 ArrayRef<intptr_t> QualTypeVals) {
235 // FIXME: Playing with std::string is really slow.
236 bool ForceAKA = false;
237 QualType CanTy = Ty.getCanonicalType();
238 std::string S = Ty.getAsString(Context.getPrintingPolicy());
239 std::string CanS = CanTy.getAsString(Context.getPrintingPolicy());
240
241 for (unsigned I = 0, E = QualTypeVals.size(); I != E; ++I) {
6
Assuming 'I' is equal to 'E'
7
Loop condition is false. Execution continues on line 271
242 QualType CompareTy =
243 QualType::getFromOpaquePtr(reinterpret_cast<void*>(QualTypeVals[I]));
244 if (CompareTy.isNull())
245 continue;
246 if (CompareTy == Ty)
247 continue; // Same types
248 QualType CompareCanTy = CompareTy.getCanonicalType();
249 if (CompareCanTy == CanTy)
250 continue; // Same canonical types
251 std::string CompareS = CompareTy.getAsString(Context.getPrintingPolicy());
252 bool ShouldAKA = false;
253 QualType CompareDesugar = Desugar(Context, CompareTy, ShouldAKA);
254 std::string CompareDesugarStr =
255 CompareDesugar.getAsString(Context.getPrintingPolicy());
256 if (CompareS != S && CompareDesugarStr != S)
257 continue; // The type string is different than the comparison string
258 // and the desugared comparison string.
259 std::string CompareCanS =
260 CompareCanTy.getAsString(Context.getPrintingPolicy());
261
262 if (CompareCanS == CanS)
263 continue; // No new info from canonical type
264
265 ForceAKA = true;
266 break;
267 }
268
269 // Check to see if we already desugared this type in this
270 // diagnostic. If so, don't do it again.
271 bool Repeated = false;
272 for (unsigned i = 0, e = PrevArgs.size(); i != e; ++i) {
8
Assuming 'i' is equal to 'e'
9
Loop condition is false. Execution continues on line 286
273 // TODO: Handle ak_declcontext case.
274 if (PrevArgs[i].first == DiagnosticsEngine::ak_qualtype) {
275 void *Ptr = (void*)PrevArgs[i].second;
276 QualType PrevTy(QualType::getFromOpaquePtr(Ptr));
277 if (PrevTy == Ty) {
278 Repeated = true;
279 break;
280 }
281 }
282 }
283
284 // Consider producing an a.k.a. clause if removing all the direct
285 // sugar gives us something "significantly different".
286 if (!Repeated
9.1
'Repeated' is false
9.1
'Repeated' is false
) {
10
Taking true branch
287 bool ShouldAKA = false;
288 QualType DesugaredTy = Desugar(Context, Ty, ShouldAKA);
289 if (ShouldAKA || ForceAKA
11.1
'ForceAKA' is false
11.1
'ForceAKA' is false
) {
11
Assuming 'ShouldAKA' is false
12
Taking false branch
290 if (DesugaredTy == Ty) {
291 DesugaredTy = Ty.getCanonicalType();
292 }
293 std::string akaStr = DesugaredTy.getAsString(Context.getPrintingPolicy());
294 if (akaStr != S) {
295 S = "'" + S + "' (aka '" + akaStr + "')";
296 return S;
297 }
298 }
299
300 // Give some additional info on vector types. These are either not desugared
301 // or displaying complex __attribute__ expressions so add details of the
302 // type and element count.
303 if (Ty->isVectorType()) {
13
Calling 'Type::isVectorType'
16
Returning from 'Type::isVectorType'
17
Taking true branch
304 const VectorType *VTy = Ty->getAs<VectorType>();
18
Assuming the object is not a 'VectorType'
19
'VTy' initialized to a null pointer value
305 std::string DecoratedString;
306 llvm::raw_string_ostream OS(DecoratedString);
307 const char *Values = VTy->getNumElements() > 1 ? "values" : "value";
20
Called C++ object pointer is null
308 OS << "'" << S << "' (vector of " << VTy->getNumElements() << " '"
309 << VTy->getElementType().getAsString(Context.getPrintingPolicy())
310 << "' " << Values << ")";
311 return OS.str();
312 }
313 }
314
315 S = "'" + S + "'";
316 return S;
317}
318
319static bool FormatTemplateTypeDiff(ASTContext &Context, QualType FromType,
320 QualType ToType, bool PrintTree,
321 bool PrintFromType, bool ElideType,
322 bool ShowColors, raw_ostream &OS);
323
324void clang::FormatASTNodeDiagnosticArgument(
325 DiagnosticsEngine::ArgumentKind Kind,
326 intptr_t Val,
327 StringRef Modifier,
328 StringRef Argument,
329 ArrayRef<DiagnosticsEngine::ArgumentValue> PrevArgs,
330 SmallVectorImpl<char> &Output,
331 void *Cookie,
332 ArrayRef<intptr_t> QualTypeVals) {
333 ASTContext &Context = *static_cast<ASTContext*>(Cookie);
334
335 size_t OldEnd = Output.size();
336 llvm::raw_svector_ostream OS(Output);
337 bool NeedQuotes = true;
338
339 switch (Kind) {
1
Control jumps to 'case ak_qualtype:' at line 383
340 default: llvm_unreachable("unknown ArgumentKind")::llvm::llvm_unreachable_internal("unknown ArgumentKind", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 340)
;
341 case DiagnosticsEngine::ak_qual: {
342 assert(Modifier.empty() && Argument.empty() &&((Modifier.empty() && Argument.empty() && "Invalid modifier for Qualfiers argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for Qualfiers argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 343, __PRETTY_FUNCTION__))
343 "Invalid modifier for Qualfiers argument")((Modifier.empty() && Argument.empty() && "Invalid modifier for Qualfiers argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for Qualfiers argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 343, __PRETTY_FUNCTION__))
;
344
345 Qualifiers Q(Qualifiers::fromOpaqueValue(Val));
346 auto S = Q.getAsString();
347 if (S.empty()) {
348 OS << "unqualified";
349 NeedQuotes = false;
350 } else {
351 OS << Q.getAsString();
352 }
353 break;
354 }
355 case DiagnosticsEngine::ak_qualtype_pair: {
356 TemplateDiffTypes &TDT = *reinterpret_cast<TemplateDiffTypes*>(Val);
357 QualType FromType =
358 QualType::getFromOpaquePtr(reinterpret_cast<void*>(TDT.FromType));
359 QualType ToType =
360 QualType::getFromOpaquePtr(reinterpret_cast<void*>(TDT.ToType));
361
362 if (FormatTemplateTypeDiff(Context, FromType, ToType, TDT.PrintTree,
363 TDT.PrintFromType, TDT.ElideType,
364 TDT.ShowColors, OS)) {
365 NeedQuotes = !TDT.PrintTree;
366 TDT.TemplateDiffUsed = true;
367 break;
368 }
369
370 // Don't fall-back during tree printing. The caller will handle
371 // this case.
372 if (TDT.PrintTree)
373 return;
374
375 // Attempting to do a template diff on non-templates. Set the variables
376 // and continue with regular type printing of the appropriate type.
377 Val = TDT.PrintFromType ? TDT.FromType : TDT.ToType;
378 Modifier = StringRef();
379 Argument = StringRef();
380 // Fall through
381 LLVM_FALLTHROUGH[[gnu::fallthrough]];
382 }
383 case DiagnosticsEngine::ak_qualtype: {
384 assert(Modifier.empty() && Argument.empty() &&((Modifier.empty() && Argument.empty() && "Invalid modifier for QualType argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for QualType argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 385, __PRETTY_FUNCTION__))
2
Assuming the condition is true
3
Assuming the condition is true
4
'?' condition is true
385 "Invalid modifier for QualType argument")((Modifier.empty() && Argument.empty() && "Invalid modifier for QualType argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for QualType argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 385, __PRETTY_FUNCTION__))
;
386
387 QualType Ty(QualType::getFromOpaquePtr(reinterpret_cast<void*>(Val)));
388 OS << ConvertTypeToDiagnosticString(Context, Ty, PrevArgs, QualTypeVals);
5
Calling 'ConvertTypeToDiagnosticString'
389 NeedQuotes = false;
390 break;
391 }
392 case DiagnosticsEngine::ak_declarationname: {
393 if (Modifier == "objcclass" && Argument.empty())
394 OS << '+';
395 else if (Modifier == "objcinstance" && Argument.empty())
396 OS << '-';
397 else
398 assert(Modifier.empty() && Argument.empty() &&((Modifier.empty() && Argument.empty() && "Invalid modifier for DeclarationName argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for DeclarationName argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 399, __PRETTY_FUNCTION__))
399 "Invalid modifier for DeclarationName argument")((Modifier.empty() && Argument.empty() && "Invalid modifier for DeclarationName argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for DeclarationName argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 399, __PRETTY_FUNCTION__))
;
400
401 OS << DeclarationName::getFromOpaqueInteger(Val);
402 break;
403 }
404 case DiagnosticsEngine::ak_nameddecl: {
405 bool Qualified;
406 if (Modifier == "q" && Argument.empty())
407 Qualified = true;
408 else {
409 assert(Modifier.empty() && Argument.empty() &&((Modifier.empty() && Argument.empty() && "Invalid modifier for NamedDecl* argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for NamedDecl* argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 410, __PRETTY_FUNCTION__))
410 "Invalid modifier for NamedDecl* argument")((Modifier.empty() && Argument.empty() && "Invalid modifier for NamedDecl* argument"
) ? static_cast<void> (0) : __assert_fail ("Modifier.empty() && Argument.empty() && \"Invalid modifier for NamedDecl* argument\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 410, __PRETTY_FUNCTION__))
;
411 Qualified = false;
412 }
413 const NamedDecl *ND = reinterpret_cast<const NamedDecl*>(Val);
414 ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), Qualified);
415 break;
416 }
417 case DiagnosticsEngine::ak_nestednamespec: {
418 NestedNameSpecifier *NNS = reinterpret_cast<NestedNameSpecifier*>(Val);
419 NNS->print(OS, Context.getPrintingPolicy());
420 NeedQuotes = false;
421 break;
422 }
423 case DiagnosticsEngine::ak_declcontext: {
424 DeclContext *DC = reinterpret_cast<DeclContext *> (Val);
425 assert(DC && "Should never have a null declaration context")((DC && "Should never have a null declaration context"
) ? static_cast<void> (0) : __assert_fail ("DC && \"Should never have a null declaration context\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 425, __PRETTY_FUNCTION__))
;
426 NeedQuotes = false;
427
428 // FIXME: Get the strings for DeclContext from some localized place
429 if (DC->isTranslationUnit()) {
430 if (Context.getLangOpts().CPlusPlus)
431 OS << "the global namespace";
432 else
433 OS << "the global scope";
434 } else if (DC->isClosure()) {
435 OS << "block literal";
436 } else if (isLambdaCallOperator(DC)) {
437 OS << "lambda expression";
438 } else if (TypeDecl *Type = dyn_cast<TypeDecl>(DC)) {
439 OS << ConvertTypeToDiagnosticString(Context,
440 Context.getTypeDeclType(Type),
441 PrevArgs, QualTypeVals);
442 } else {
443 assert(isa<NamedDecl>(DC) && "Expected a NamedDecl")((isa<NamedDecl>(DC) && "Expected a NamedDecl")
? static_cast<void> (0) : __assert_fail ("isa<NamedDecl>(DC) && \"Expected a NamedDecl\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 443, __PRETTY_FUNCTION__))
;
444 NamedDecl *ND = cast<NamedDecl>(DC);
445 if (isa<NamespaceDecl>(ND))
446 OS << "namespace ";
447 else if (isa<ObjCMethodDecl>(ND))
448 OS << "method ";
449 else if (isa<FunctionDecl>(ND))
450 OS << "function ";
451
452 OS << '\'';
453 ND->getNameForDiagnostic(OS, Context.getPrintingPolicy(), true);
454 OS << '\'';
455 }
456 break;
457 }
458 case DiagnosticsEngine::ak_attr: {
459 const Attr *At = reinterpret_cast<Attr *>(Val);
460 assert(At && "Received null Attr object!")((At && "Received null Attr object!") ? static_cast<
void> (0) : __assert_fail ("At && \"Received null Attr object!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 460, __PRETTY_FUNCTION__))
;
461 OS << '\'' << At->getSpelling() << '\'';
462 NeedQuotes = false;
463 break;
464 }
465 }
466
467 if (NeedQuotes) {
468 Output.insert(Output.begin()+OldEnd, '\'');
469 Output.push_back('\'');
470 }
471}
472
473/// TemplateDiff - A class that constructs a pretty string for a pair of
474/// QualTypes. For the pair of types, a diff tree will be created containing
475/// all the information about the templates and template arguments. Afterwards,
476/// the tree is transformed to a string according to the options passed in.
477namespace {
478class TemplateDiff {
479 /// Context - The ASTContext which is used for comparing template arguments.
480 ASTContext &Context;
481
482 /// Policy - Used during expression printing.
483 PrintingPolicy Policy;
484
485 /// ElideType - Option to elide identical types.
486 bool ElideType;
487
488 /// PrintTree - Format output string as a tree.
489 bool PrintTree;
490
491 /// ShowColor - Diagnostics support color, so bolding will be used.
492 bool ShowColor;
493
494 /// FromTemplateType - When single type printing is selected, this is the
495 /// type to be be printed. When tree printing is selected, this type will
496 /// show up first in the tree.
497 QualType FromTemplateType;
498
499 /// ToTemplateType - The type that FromType is compared to. Only in tree
500 /// printing will this type be outputed.
501 QualType ToTemplateType;
502
503 /// OS - The stream used to construct the output strings.
504 raw_ostream &OS;
505
506 /// IsBold - Keeps track of the bold formatting for the output string.
507 bool IsBold;
508
509 /// DiffTree - A tree representation the differences between two types.
510 class DiffTree {
511 public:
512 /// DiffKind - The difference in a DiffNode. Fields of
513 /// TemplateArgumentInfo needed by each difference can be found in the
514 /// Set* and Get* functions.
515 enum DiffKind {
516 /// Incomplete or invalid node.
517 Invalid,
518 /// Another level of templates
519 Template,
520 /// Type difference, all type differences except those falling under
521 /// the Template difference.
522 Type,
523 /// Expression difference, this is only when both arguments are
524 /// expressions. If one argument is an expression and the other is
525 /// Integer or Declaration, then use that diff type instead.
526 Expression,
527 /// Template argument difference
528 TemplateTemplate,
529 /// Integer difference
530 Integer,
531 /// Declaration difference, nullptr arguments are included here
532 Declaration,
533 /// One argument being integer and the other being declaration
534 FromIntegerAndToDeclaration,
535 FromDeclarationAndToInteger
536 };
537
538 private:
539 /// TemplateArgumentInfo - All the information needed to pretty print
540 /// a template argument. See the Set* and Get* functions to see which
541 /// fields are used for each DiffKind.
542 struct TemplateArgumentInfo {
543 QualType ArgType;
544 Qualifiers Qual;
545 llvm::APSInt Val;
546 bool IsValidInt = false;
547 Expr *ArgExpr = nullptr;
548 TemplateDecl *TD = nullptr;
549 ValueDecl *VD = nullptr;
550 bool NeedAddressOf = false;
551 bool IsNullPtr = false;
552 bool IsDefault = false;
553 };
554
555 /// DiffNode - The root node stores the original type. Each child node
556 /// stores template arguments of their parents. For templated types, the
557 /// template decl is also stored.
558 struct DiffNode {
559 DiffKind Kind = Invalid;
560
561 /// NextNode - The index of the next sibling node or 0.
562 unsigned NextNode = 0;
563
564 /// ChildNode - The index of the first child node or 0.
565 unsigned ChildNode = 0;
566
567 /// ParentNode - The index of the parent node.
568 unsigned ParentNode = 0;
569
570 TemplateArgumentInfo FromArgInfo, ToArgInfo;
571
572 /// Same - Whether the two arguments evaluate to the same value.
573 bool Same = false;
574
575 DiffNode(unsigned ParentNode = 0) : ParentNode(ParentNode) {}
576 };
577
578 /// FlatTree - A flattened tree used to store the DiffNodes.
579 SmallVector<DiffNode, 16> FlatTree;
580
581 /// CurrentNode - The index of the current node being used.
582 unsigned CurrentNode;
583
584 /// NextFreeNode - The index of the next unused node. Used when creating
585 /// child nodes.
586 unsigned NextFreeNode;
587
588 /// ReadNode - The index of the current node being read.
589 unsigned ReadNode;
590
591 public:
592 DiffTree() :
593 CurrentNode(0), NextFreeNode(1) {
594 FlatTree.push_back(DiffNode());
595 }
596
597 // Node writing functions, one for each valid DiffKind element.
598 void SetTemplateDiff(TemplateDecl *FromTD, TemplateDecl *ToTD,
599 Qualifiers FromQual, Qualifiers ToQual,
600 bool FromDefault, bool ToDefault) {
601 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 601, __PRETTY_FUNCTION__))
;
602 FlatTree[CurrentNode].Kind = Template;
603 FlatTree[CurrentNode].FromArgInfo.TD = FromTD;
604 FlatTree[CurrentNode].ToArgInfo.TD = ToTD;
605 FlatTree[CurrentNode].FromArgInfo.Qual = FromQual;
606 FlatTree[CurrentNode].ToArgInfo.Qual = ToQual;
607 SetDefault(FromDefault, ToDefault);
608 }
609
610 void SetTypeDiff(QualType FromType, QualType ToType, bool FromDefault,
611 bool ToDefault) {
612 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 612, __PRETTY_FUNCTION__))
;
613 FlatTree[CurrentNode].Kind = Type;
614 FlatTree[CurrentNode].FromArgInfo.ArgType = FromType;
615 FlatTree[CurrentNode].ToArgInfo.ArgType = ToType;
616 SetDefault(FromDefault, ToDefault);
617 }
618
619 void SetExpressionDiff(Expr *FromExpr, Expr *ToExpr, bool FromDefault,
620 bool ToDefault) {
621 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 621, __PRETTY_FUNCTION__))
;
622 FlatTree[CurrentNode].Kind = Expression;
623 FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
624 FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
625 SetDefault(FromDefault, ToDefault);
626 }
627
628 void SetTemplateTemplateDiff(TemplateDecl *FromTD, TemplateDecl *ToTD,
629 bool FromDefault, bool ToDefault) {
630 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 630, __PRETTY_FUNCTION__))
;
631 FlatTree[CurrentNode].Kind = TemplateTemplate;
632 FlatTree[CurrentNode].FromArgInfo.TD = FromTD;
633 FlatTree[CurrentNode].ToArgInfo.TD = ToTD;
634 SetDefault(FromDefault, ToDefault);
635 }
636
637 void SetIntegerDiff(const llvm::APSInt &FromInt, const llvm::APSInt &ToInt,
638 bool IsValidFromInt, bool IsValidToInt,
639 QualType FromIntType, QualType ToIntType,
640 Expr *FromExpr, Expr *ToExpr, bool FromDefault,
641 bool ToDefault) {
642 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 642, __PRETTY_FUNCTION__))
;
643 FlatTree[CurrentNode].Kind = Integer;
644 FlatTree[CurrentNode].FromArgInfo.Val = FromInt;
645 FlatTree[CurrentNode].ToArgInfo.Val = ToInt;
646 FlatTree[CurrentNode].FromArgInfo.IsValidInt = IsValidFromInt;
647 FlatTree[CurrentNode].ToArgInfo.IsValidInt = IsValidToInt;
648 FlatTree[CurrentNode].FromArgInfo.ArgType = FromIntType;
649 FlatTree[CurrentNode].ToArgInfo.ArgType = ToIntType;
650 FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
651 FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
652 SetDefault(FromDefault, ToDefault);
653 }
654
655 void SetDeclarationDiff(ValueDecl *FromValueDecl, ValueDecl *ToValueDecl,
656 bool FromAddressOf, bool ToAddressOf,
657 bool FromNullPtr, bool ToNullPtr, Expr *FromExpr,
658 Expr *ToExpr, bool FromDefault, bool ToDefault) {
659 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 659, __PRETTY_FUNCTION__))
;
660 FlatTree[CurrentNode].Kind = Declaration;
661 FlatTree[CurrentNode].FromArgInfo.VD = FromValueDecl;
662 FlatTree[CurrentNode].ToArgInfo.VD = ToValueDecl;
663 FlatTree[CurrentNode].FromArgInfo.NeedAddressOf = FromAddressOf;
664 FlatTree[CurrentNode].ToArgInfo.NeedAddressOf = ToAddressOf;
665 FlatTree[CurrentNode].FromArgInfo.IsNullPtr = FromNullPtr;
666 FlatTree[CurrentNode].ToArgInfo.IsNullPtr = ToNullPtr;
667 FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
668 FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
669 SetDefault(FromDefault, ToDefault);
670 }
671
672 void SetFromDeclarationAndToIntegerDiff(
673 ValueDecl *FromValueDecl, bool FromAddressOf, bool FromNullPtr,
674 Expr *FromExpr, const llvm::APSInt &ToInt, bool IsValidToInt,
675 QualType ToIntType, Expr *ToExpr, bool FromDefault, bool ToDefault) {
676 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 676, __PRETTY_FUNCTION__))
;
677 FlatTree[CurrentNode].Kind = FromDeclarationAndToInteger;
678 FlatTree[CurrentNode].FromArgInfo.VD = FromValueDecl;
679 FlatTree[CurrentNode].FromArgInfo.NeedAddressOf = FromAddressOf;
680 FlatTree[CurrentNode].FromArgInfo.IsNullPtr = FromNullPtr;
681 FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
682 FlatTree[CurrentNode].ToArgInfo.Val = ToInt;
683 FlatTree[CurrentNode].ToArgInfo.IsValidInt = IsValidToInt;
684 FlatTree[CurrentNode].ToArgInfo.ArgType = ToIntType;
685 FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
686 SetDefault(FromDefault, ToDefault);
687 }
688
689 void SetFromIntegerAndToDeclarationDiff(
690 const llvm::APSInt &FromInt, bool IsValidFromInt, QualType FromIntType,
691 Expr *FromExpr, ValueDecl *ToValueDecl, bool ToAddressOf,
692 bool ToNullPtr, Expr *ToExpr, bool FromDefault, bool ToDefault) {
693 assert(FlatTree[CurrentNode].Kind == Invalid && "Node is not empty.")((FlatTree[CurrentNode].Kind == Invalid && "Node is not empty."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Invalid && \"Node is not empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 693, __PRETTY_FUNCTION__))
;
694 FlatTree[CurrentNode].Kind = FromIntegerAndToDeclaration;
695 FlatTree[CurrentNode].FromArgInfo.Val = FromInt;
696 FlatTree[CurrentNode].FromArgInfo.IsValidInt = IsValidFromInt;
697 FlatTree[CurrentNode].FromArgInfo.ArgType = FromIntType;
698 FlatTree[CurrentNode].FromArgInfo.ArgExpr = FromExpr;
699 FlatTree[CurrentNode].ToArgInfo.VD = ToValueDecl;
700 FlatTree[CurrentNode].ToArgInfo.NeedAddressOf = ToAddressOf;
701 FlatTree[CurrentNode].ToArgInfo.IsNullPtr = ToNullPtr;
702 FlatTree[CurrentNode].ToArgInfo.ArgExpr = ToExpr;
703 SetDefault(FromDefault, ToDefault);
704 }
705
706 /// SetDefault - Sets FromDefault and ToDefault flags of the current node.
707 void SetDefault(bool FromDefault, bool ToDefault) {
708 assert((!FromDefault || !ToDefault) && "Both arguments cannot be default.")(((!FromDefault || !ToDefault) && "Both arguments cannot be default."
) ? static_cast<void> (0) : __assert_fail ("(!FromDefault || !ToDefault) && \"Both arguments cannot be default.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 708, __PRETTY_FUNCTION__))
;
709 FlatTree[CurrentNode].FromArgInfo.IsDefault = FromDefault;
710 FlatTree[CurrentNode].ToArgInfo.IsDefault = ToDefault;
711 }
712
713 /// SetSame - Sets the same flag of the current node.
714 void SetSame(bool Same) {
715 FlatTree[CurrentNode].Same = Same;
716 }
717
718 /// SetKind - Sets the current node's type.
719 void SetKind(DiffKind Kind) {
720 FlatTree[CurrentNode].Kind = Kind;
721 }
722
723 /// Up - Changes the node to the parent of the current node.
724 void Up() {
725 assert(FlatTree[CurrentNode].Kind != Invalid &&((FlatTree[CurrentNode].Kind != Invalid && "Cannot exit node before setting node information."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind != Invalid && \"Cannot exit node before setting node information.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 726, __PRETTY_FUNCTION__))
726 "Cannot exit node before setting node information.")((FlatTree[CurrentNode].Kind != Invalid && "Cannot exit node before setting node information."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind != Invalid && \"Cannot exit node before setting node information.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 726, __PRETTY_FUNCTION__))
;
727 CurrentNode = FlatTree[CurrentNode].ParentNode;
728 }
729
730 /// AddNode - Adds a child node to the current node, then sets that node
731 /// node as the current node.
732 void AddNode() {
733 assert(FlatTree[CurrentNode].Kind == Template &&((FlatTree[CurrentNode].Kind == Template && "Only Template nodes can have children nodes."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Template && \"Only Template nodes can have children nodes.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 734, __PRETTY_FUNCTION__))
734 "Only Template nodes can have children nodes.")((FlatTree[CurrentNode].Kind == Template && "Only Template nodes can have children nodes."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[CurrentNode].Kind == Template && \"Only Template nodes can have children nodes.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 734, __PRETTY_FUNCTION__))
;
735 FlatTree.push_back(DiffNode(CurrentNode));
736 DiffNode &Node = FlatTree[CurrentNode];
737 if (Node.ChildNode == 0) {
738 // If a child node doesn't exist, add one.
739 Node.ChildNode = NextFreeNode;
740 } else {
741 // If a child node exists, find the last child node and add a
742 // next node to it.
743 unsigned i;
744 for (i = Node.ChildNode; FlatTree[i].NextNode != 0;
745 i = FlatTree[i].NextNode) {
746 }
747 FlatTree[i].NextNode = NextFreeNode;
748 }
749 CurrentNode = NextFreeNode;
750 ++NextFreeNode;
751 }
752
753 // Node reading functions.
754 /// StartTraverse - Prepares the tree for recursive traversal.
755 void StartTraverse() {
756 ReadNode = 0;
757 CurrentNode = NextFreeNode;
758 NextFreeNode = 0;
759 }
760
761 /// Parent - Move the current read node to its parent.
762 void Parent() {
763 ReadNode = FlatTree[ReadNode].ParentNode;
764 }
765
766 void GetTemplateDiff(TemplateDecl *&FromTD, TemplateDecl *&ToTD,
767 Qualifiers &FromQual, Qualifiers &ToQual) {
768 assert(FlatTree[ReadNode].Kind == Template && "Unexpected kind.")((FlatTree[ReadNode].Kind == Template && "Unexpected kind."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[ReadNode].Kind == Template && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 768, __PRETTY_FUNCTION__))
;
769 FromTD = FlatTree[ReadNode].FromArgInfo.TD;
770 ToTD = FlatTree[ReadNode].ToArgInfo.TD;
771 FromQual = FlatTree[ReadNode].FromArgInfo.Qual;
772 ToQual = FlatTree[ReadNode].ToArgInfo.Qual;
773 }
774
775 void GetTypeDiff(QualType &FromType, QualType &ToType) {
776 assert(FlatTree[ReadNode].Kind == Type && "Unexpected kind")((FlatTree[ReadNode].Kind == Type && "Unexpected kind"
) ? static_cast<void> (0) : __assert_fail ("FlatTree[ReadNode].Kind == Type && \"Unexpected kind\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 776, __PRETTY_FUNCTION__))
;
777 FromType = FlatTree[ReadNode].FromArgInfo.ArgType;
778 ToType = FlatTree[ReadNode].ToArgInfo.ArgType;
779 }
780
781 void GetExpressionDiff(Expr *&FromExpr, Expr *&ToExpr) {
782 assert(FlatTree[ReadNode].Kind == Expression && "Unexpected kind")((FlatTree[ReadNode].Kind == Expression && "Unexpected kind"
) ? static_cast<void> (0) : __assert_fail ("FlatTree[ReadNode].Kind == Expression && \"Unexpected kind\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 782, __PRETTY_FUNCTION__))
;
783 FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
784 ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
785 }
786
787 void GetTemplateTemplateDiff(TemplateDecl *&FromTD, TemplateDecl *&ToTD) {
788 assert(FlatTree[ReadNode].Kind == TemplateTemplate && "Unexpected kind.")((FlatTree[ReadNode].Kind == TemplateTemplate && "Unexpected kind."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[ReadNode].Kind == TemplateTemplate && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 788, __PRETTY_FUNCTION__))
;
789 FromTD = FlatTree[ReadNode].FromArgInfo.TD;
790 ToTD = FlatTree[ReadNode].ToArgInfo.TD;
791 }
792
793 void GetIntegerDiff(llvm::APSInt &FromInt, llvm::APSInt &ToInt,
794 bool &IsValidFromInt, bool &IsValidToInt,
795 QualType &FromIntType, QualType &ToIntType,
796 Expr *&FromExpr, Expr *&ToExpr) {
797 assert(FlatTree[ReadNode].Kind == Integer && "Unexpected kind.")((FlatTree[ReadNode].Kind == Integer && "Unexpected kind."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[ReadNode].Kind == Integer && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 797, __PRETTY_FUNCTION__))
;
798 FromInt = FlatTree[ReadNode].FromArgInfo.Val;
799 ToInt = FlatTree[ReadNode].ToArgInfo.Val;
800 IsValidFromInt = FlatTree[ReadNode].FromArgInfo.IsValidInt;
801 IsValidToInt = FlatTree[ReadNode].ToArgInfo.IsValidInt;
802 FromIntType = FlatTree[ReadNode].FromArgInfo.ArgType;
803 ToIntType = FlatTree[ReadNode].ToArgInfo.ArgType;
804 FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
805 ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
806 }
807
808 void GetDeclarationDiff(ValueDecl *&FromValueDecl, ValueDecl *&ToValueDecl,
809 bool &FromAddressOf, bool &ToAddressOf,
810 bool &FromNullPtr, bool &ToNullPtr, Expr *&FromExpr,
811 Expr *&ToExpr) {
812 assert(FlatTree[ReadNode].Kind == Declaration && "Unexpected kind.")((FlatTree[ReadNode].Kind == Declaration && "Unexpected kind."
) ? static_cast<void> (0) : __assert_fail ("FlatTree[ReadNode].Kind == Declaration && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 812, __PRETTY_FUNCTION__))
;
813 FromValueDecl = FlatTree[ReadNode].FromArgInfo.VD;
814 ToValueDecl = FlatTree[ReadNode].ToArgInfo.VD;
815 FromAddressOf = FlatTree[ReadNode].FromArgInfo.NeedAddressOf;
816 ToAddressOf = FlatTree[ReadNode].ToArgInfo.NeedAddressOf;
817 FromNullPtr = FlatTree[ReadNode].FromArgInfo.IsNullPtr;
818 ToNullPtr = FlatTree[ReadNode].ToArgInfo.IsNullPtr;
819 FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
820 ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
821 }
822
823 void GetFromDeclarationAndToIntegerDiff(
824 ValueDecl *&FromValueDecl, bool &FromAddressOf, bool &FromNullPtr,
825 Expr *&FromExpr, llvm::APSInt &ToInt, bool &IsValidToInt,
826 QualType &ToIntType, Expr *&ToExpr) {
827 assert(FlatTree[ReadNode].Kind == FromDeclarationAndToInteger &&((FlatTree[ReadNode].Kind == FromDeclarationAndToInteger &&
"Unexpected kind.") ? static_cast<void> (0) : __assert_fail
("FlatTree[ReadNode].Kind == FromDeclarationAndToInteger && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 828, __PRETTY_FUNCTION__))
828 "Unexpected kind.")((FlatTree[ReadNode].Kind == FromDeclarationAndToInteger &&
"Unexpected kind.") ? static_cast<void> (0) : __assert_fail
("FlatTree[ReadNode].Kind == FromDeclarationAndToInteger && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 828, __PRETTY_FUNCTION__))
;
829 FromValueDecl = FlatTree[ReadNode].FromArgInfo.VD;
830 FromAddressOf = FlatTree[ReadNode].FromArgInfo.NeedAddressOf;
831 FromNullPtr = FlatTree[ReadNode].FromArgInfo.IsNullPtr;
832 FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
833 ToInt = FlatTree[ReadNode].ToArgInfo.Val;
834 IsValidToInt = FlatTree[ReadNode].ToArgInfo.IsValidInt;
835 ToIntType = FlatTree[ReadNode].ToArgInfo.ArgType;
836 ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
837 }
838
839 void GetFromIntegerAndToDeclarationDiff(
840 llvm::APSInt &FromInt, bool &IsValidFromInt, QualType &FromIntType,
841 Expr *&FromExpr, ValueDecl *&ToValueDecl, bool &ToAddressOf,
842 bool &ToNullPtr, Expr *&ToExpr) {
843 assert(FlatTree[ReadNode].Kind == FromIntegerAndToDeclaration &&((FlatTree[ReadNode].Kind == FromIntegerAndToDeclaration &&
"Unexpected kind.") ? static_cast<void> (0) : __assert_fail
("FlatTree[ReadNode].Kind == FromIntegerAndToDeclaration && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 844, __PRETTY_FUNCTION__))
844 "Unexpected kind.")((FlatTree[ReadNode].Kind == FromIntegerAndToDeclaration &&
"Unexpected kind.") ? static_cast<void> (0) : __assert_fail
("FlatTree[ReadNode].Kind == FromIntegerAndToDeclaration && \"Unexpected kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 844, __PRETTY_FUNCTION__))
;
845 FromInt = FlatTree[ReadNode].FromArgInfo.Val;
846 IsValidFromInt = FlatTree[ReadNode].FromArgInfo.IsValidInt;
847 FromIntType = FlatTree[ReadNode].FromArgInfo.ArgType;
848 FromExpr = FlatTree[ReadNode].FromArgInfo.ArgExpr;
849 ToValueDecl = FlatTree[ReadNode].ToArgInfo.VD;
850 ToAddressOf = FlatTree[ReadNode].ToArgInfo.NeedAddressOf;
851 ToNullPtr = FlatTree[ReadNode].ToArgInfo.IsNullPtr;
852 ToExpr = FlatTree[ReadNode].ToArgInfo.ArgExpr;
853 }
854
855 /// FromDefault - Return true if the from argument is the default.
856 bool FromDefault() {
857 return FlatTree[ReadNode].FromArgInfo.IsDefault;
858 }
859
860 /// ToDefault - Return true if the to argument is the default.
861 bool ToDefault() {
862 return FlatTree[ReadNode].ToArgInfo.IsDefault;
863 }
864
865 /// NodeIsSame - Returns true the arguments are the same.
866 bool NodeIsSame() {
867 return FlatTree[ReadNode].Same;
868 }
869
870 /// HasChildrend - Returns true if the node has children.
871 bool HasChildren() {
872 return FlatTree[ReadNode].ChildNode != 0;
873 }
874
875 /// MoveToChild - Moves from the current node to its child.
876 void MoveToChild() {
877 ReadNode = FlatTree[ReadNode].ChildNode;
878 }
879
880 /// AdvanceSibling - If there is a next sibling, advance to it and return
881 /// true. Otherwise, return false.
882 bool AdvanceSibling() {
883 if (FlatTree[ReadNode].NextNode == 0)
884 return false;
885
886 ReadNode = FlatTree[ReadNode].NextNode;
887 return true;
888 }
889
890 /// HasNextSibling - Return true if the node has a next sibling.
891 bool HasNextSibling() {
892 return FlatTree[ReadNode].NextNode != 0;
893 }
894
895 /// Empty - Returns true if the tree has no information.
896 bool Empty() {
897 return GetKind() == Invalid;
898 }
899
900 /// GetKind - Returns the current node's type.
901 DiffKind GetKind() {
902 return FlatTree[ReadNode].Kind;
903 }
904 };
905
906 DiffTree Tree;
907
908 /// TSTiterator - a pair of iterators that walks the
909 /// TemplateSpecializationType and the desugared TemplateSpecializationType.
910 /// The deseguared TemplateArgument should provide the canonical argument
911 /// for comparisons.
912 class TSTiterator {
913 typedef const TemplateArgument& reference;
914 typedef const TemplateArgument* pointer;
915
916 /// InternalIterator - an iterator that is used to enter a
917 /// TemplateSpecializationType and read TemplateArguments inside template
918 /// parameter packs in order with the rest of the TemplateArguments.
919 struct InternalIterator {
920 /// TST - the template specialization whose arguments this iterator
921 /// traverse over.
922 const TemplateSpecializationType *TST;
923
924 /// Index - the index of the template argument in TST.
925 unsigned Index;
926
927 /// CurrentTA - if CurrentTA is not the same as EndTA, then CurrentTA
928 /// points to a TemplateArgument within a parameter pack.
929 TemplateArgument::pack_iterator CurrentTA;
930
931 /// EndTA - the end iterator of a parameter pack
932 TemplateArgument::pack_iterator EndTA;
933
934 /// InternalIterator - Constructs an iterator and sets it to the first
935 /// template argument.
936 InternalIterator(const TemplateSpecializationType *TST)
937 : TST(TST), Index(0), CurrentTA(nullptr), EndTA(nullptr) {
938 if (!TST) return;
939
940 if (isEnd()) return;
941
942 // Set to first template argument. If not a parameter pack, done.
943 TemplateArgument TA = TST->getArg(0);
944 if (TA.getKind() != TemplateArgument::Pack) return;
945
946 // Start looking into the parameter pack.
947 CurrentTA = TA.pack_begin();
948 EndTA = TA.pack_end();
949
950 // Found a valid template argument.
951 if (CurrentTA != EndTA) return;
952
953 // Parameter pack is empty, use the increment to get to a valid
954 // template argument.
955 ++(*this);
956 }
957
958 /// Return true if the iterator is non-singular.
959 bool isValid() const { return TST; }
960
961 /// isEnd - Returns true if the iterator is one past the end.
962 bool isEnd() const {
963 assert(TST && "InternalIterator is invalid with a null TST.")((TST && "InternalIterator is invalid with a null TST."
) ? static_cast<void> (0) : __assert_fail ("TST && \"InternalIterator is invalid with a null TST.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 963, __PRETTY_FUNCTION__))
;
964 return Index >= TST->getNumArgs();
965 }
966
967 /// &operator++ - Increment the iterator to the next template argument.
968 InternalIterator &operator++() {
969 assert(TST && "InternalIterator is invalid with a null TST.")((TST && "InternalIterator is invalid with a null TST."
) ? static_cast<void> (0) : __assert_fail ("TST && \"InternalIterator is invalid with a null TST.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 969, __PRETTY_FUNCTION__))
;
970 if (isEnd()) {
971 return *this;
972 }
973
974 // If in a parameter pack, advance in the parameter pack.
975 if (CurrentTA != EndTA) {
976 ++CurrentTA;
977 if (CurrentTA != EndTA)
978 return *this;
979 }
980
981 // Loop until a template argument is found, or the end is reached.
982 while (true) {
983 // Advance to the next template argument. Break if reached the end.
984 if (++Index == TST->getNumArgs())
985 break;
986
987 // If the TemplateArgument is not a parameter pack, done.
988 TemplateArgument TA = TST->getArg(Index);
989 if (TA.getKind() != TemplateArgument::Pack)
990 break;
991
992 // Handle parameter packs.
993 CurrentTA = TA.pack_begin();
994 EndTA = TA.pack_end();
995
996 // If the parameter pack is empty, try to advance again.
997 if (CurrentTA != EndTA)
998 break;
999 }
1000 return *this;
1001 }
1002
1003 /// operator* - Returns the appropriate TemplateArgument.
1004 reference operator*() const {
1005 assert(TST && "InternalIterator is invalid with a null TST.")((TST && "InternalIterator is invalid with a null TST."
) ? static_cast<void> (0) : __assert_fail ("TST && \"InternalIterator is invalid with a null TST.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1005, __PRETTY_FUNCTION__))
;
1006 assert(!isEnd() && "Index exceeds number of arguments.")((!isEnd() && "Index exceeds number of arguments.") ?
static_cast<void> (0) : __assert_fail ("!isEnd() && \"Index exceeds number of arguments.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1006, __PRETTY_FUNCTION__))
;
1007 if (CurrentTA == EndTA)
1008 return TST->getArg(Index);
1009 else
1010 return *CurrentTA;
1011 }
1012
1013 /// operator-> - Allow access to the underlying TemplateArgument.
1014 pointer operator->() const {
1015 assert(TST && "InternalIterator is invalid with a null TST.")((TST && "InternalIterator is invalid with a null TST."
) ? static_cast<void> (0) : __assert_fail ("TST && \"InternalIterator is invalid with a null TST.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1015, __PRETTY_FUNCTION__))
;
1016 return &operator*();
1017 }
1018 };
1019
1020 InternalIterator SugaredIterator;
1021 InternalIterator DesugaredIterator;
1022
1023 public:
1024 TSTiterator(ASTContext &Context, const TemplateSpecializationType *TST)
1025 : SugaredIterator(TST),
1026 DesugaredIterator(
1027 (TST->isSugared() && !TST->isTypeAlias())
1028 ? GetTemplateSpecializationType(Context, TST->desugar())
1029 : nullptr) {}
1030
1031 /// &operator++ - Increment the iterator to the next template argument.
1032 TSTiterator &operator++() {
1033 ++SugaredIterator;
1034 if (DesugaredIterator.isValid())
1035 ++DesugaredIterator;
1036 return *this;
1037 }
1038
1039 /// operator* - Returns the appropriate TemplateArgument.
1040 reference operator*() const {
1041 return *SugaredIterator;
1042 }
1043
1044 /// operator-> - Allow access to the underlying TemplateArgument.
1045 pointer operator->() const {
1046 return &operator*();
1047 }
1048
1049 /// isEnd - Returns true if no more TemplateArguments are available.
1050 bool isEnd() const {
1051 return SugaredIterator.isEnd();
1052 }
1053
1054 /// hasDesugaredTA - Returns true if there is another TemplateArgument
1055 /// available.
1056 bool hasDesugaredTA() const {
1057 return DesugaredIterator.isValid() && !DesugaredIterator.isEnd();
1058 }
1059
1060 /// getDesugaredTA - Returns the desugared TemplateArgument.
1061 reference getDesugaredTA() const {
1062 assert(DesugaredIterator.isValid() &&((DesugaredIterator.isValid() && "Desugared TemplateArgument should not be used."
) ? static_cast<void> (0) : __assert_fail ("DesugaredIterator.isValid() && \"Desugared TemplateArgument should not be used.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1063, __PRETTY_FUNCTION__))
1063 "Desugared TemplateArgument should not be used.")((DesugaredIterator.isValid() && "Desugared TemplateArgument should not be used."
) ? static_cast<void> (0) : __assert_fail ("DesugaredIterator.isValid() && \"Desugared TemplateArgument should not be used.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1063, __PRETTY_FUNCTION__))
;
1064 return *DesugaredIterator;
1065 }
1066 };
1067
1068 // These functions build up the template diff tree, including functions to
1069 // retrieve and compare template arguments.
1070
1071 static const TemplateSpecializationType *GetTemplateSpecializationType(
1072 ASTContext &Context, QualType Ty) {
1073 if (const TemplateSpecializationType *TST =
1074 Ty->getAs<TemplateSpecializationType>())
1075 return TST;
1076
1077 const RecordType *RT = Ty->getAs<RecordType>();
1078
1079 if (!RT)
1080 return nullptr;
1081
1082 const ClassTemplateSpecializationDecl *CTSD =
1083 dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
1084
1085 if (!CTSD)
1086 return nullptr;
1087
1088 Ty = Context.getTemplateSpecializationType(
1089 TemplateName(CTSD->getSpecializedTemplate()),
1090 CTSD->getTemplateArgs().asArray(),
1091 Ty.getLocalUnqualifiedType().getCanonicalType());
1092
1093 return Ty->getAs<TemplateSpecializationType>();
1094 }
1095
1096 /// Returns true if the DiffType is Type and false for Template.
1097 static bool OnlyPerformTypeDiff(ASTContext &Context, QualType FromType,
1098 QualType ToType,
1099 const TemplateSpecializationType *&FromArgTST,
1100 const TemplateSpecializationType *&ToArgTST) {
1101 if (FromType.isNull() || ToType.isNull())
1102 return true;
1103
1104 if (Context.hasSameType(FromType, ToType))
1105 return true;
1106
1107 FromArgTST = GetTemplateSpecializationType(Context, FromType);
1108 ToArgTST = GetTemplateSpecializationType(Context, ToType);
1109
1110 if (!FromArgTST || !ToArgTST)
1111 return true;
1112
1113 if (!hasSameTemplate(FromArgTST, ToArgTST))
1114 return true;
1115
1116 return false;
1117 }
1118
1119 /// DiffTypes - Fills a DiffNode with information about a type difference.
1120 void DiffTypes(const TSTiterator &FromIter, const TSTiterator &ToIter) {
1121 QualType FromType = GetType(FromIter);
1122 QualType ToType = GetType(ToIter);
1123
1124 bool FromDefault = FromIter.isEnd() && !FromType.isNull();
1125 bool ToDefault = ToIter.isEnd() && !ToType.isNull();
1126
1127 const TemplateSpecializationType *FromArgTST = nullptr;
1128 const TemplateSpecializationType *ToArgTST = nullptr;
1129 if (OnlyPerformTypeDiff(Context, FromType, ToType, FromArgTST, ToArgTST)) {
1130 Tree.SetTypeDiff(FromType, ToType, FromDefault, ToDefault);
1131 Tree.SetSame(!FromType.isNull() && !ToType.isNull() &&
1132 Context.hasSameType(FromType, ToType));
1133 } else {
1134 assert(FromArgTST && ToArgTST &&((FromArgTST && ToArgTST && "Both template specializations need to be valid."
) ? static_cast<void> (0) : __assert_fail ("FromArgTST && ToArgTST && \"Both template specializations need to be valid.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1135, __PRETTY_FUNCTION__))
1135 "Both template specializations need to be valid.")((FromArgTST && ToArgTST && "Both template specializations need to be valid."
) ? static_cast<void> (0) : __assert_fail ("FromArgTST && ToArgTST && \"Both template specializations need to be valid.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1135, __PRETTY_FUNCTION__))
;
1136 Qualifiers FromQual = FromType.getQualifiers(),
1137 ToQual = ToType.getQualifiers();
1138 FromQual -= QualType(FromArgTST, 0).getQualifiers();
1139 ToQual -= QualType(ToArgTST, 0).getQualifiers();
1140 Tree.SetTemplateDiff(FromArgTST->getTemplateName().getAsTemplateDecl(),
1141 ToArgTST->getTemplateName().getAsTemplateDecl(),
1142 FromQual, ToQual, FromDefault, ToDefault);
1143 DiffTemplate(FromArgTST, ToArgTST);
1144 }
1145 }
1146
1147 /// DiffTemplateTemplates - Fills a DiffNode with information about a
1148 /// template template difference.
1149 void DiffTemplateTemplates(const TSTiterator &FromIter,
1150 const TSTiterator &ToIter) {
1151 TemplateDecl *FromDecl = GetTemplateDecl(FromIter);
1152 TemplateDecl *ToDecl = GetTemplateDecl(ToIter);
1153 Tree.SetTemplateTemplateDiff(FromDecl, ToDecl, FromIter.isEnd() && FromDecl,
1154 ToIter.isEnd() && ToDecl);
1155 Tree.SetSame(FromDecl && ToDecl &&
1156 FromDecl->getCanonicalDecl() == ToDecl->getCanonicalDecl());
1157 }
1158
1159 /// InitializeNonTypeDiffVariables - Helper function for DiffNonTypes
1160 static void InitializeNonTypeDiffVariables(ASTContext &Context,
1161 const TSTiterator &Iter,
1162 NonTypeTemplateParmDecl *Default,
1163 llvm::APSInt &Value, bool &HasInt,
1164 QualType &IntType, bool &IsNullPtr,
1165 Expr *&E, ValueDecl *&VD,
1166 bool &NeedAddressOf) {
1167 if (!Iter.isEnd()) {
1168 switch (Iter->getKind()) {
1169 default:
1170 llvm_unreachable("unknown ArgumentKind")::llvm::llvm_unreachable_internal("unknown ArgumentKind", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1170)
;
1171 case TemplateArgument::Integral:
1172 Value = Iter->getAsIntegral();
1173 HasInt = true;
1174 IntType = Iter->getIntegralType();
1175 return;
1176 case TemplateArgument::Declaration: {
1177 VD = Iter->getAsDecl();
1178 QualType ArgType = Iter->getParamTypeForDecl();
1179 QualType VDType = VD->getType();
1180 if (ArgType->isPointerType() &&
1181 Context.hasSameType(ArgType->getPointeeType(), VDType))
1182 NeedAddressOf = true;
1183 return;
1184 }
1185 case TemplateArgument::NullPtr:
1186 IsNullPtr = true;
1187 return;
1188 case TemplateArgument::Expression:
1189 E = Iter->getAsExpr();
1190 }
1191 } else if (!Default->isParameterPack()) {
1192 E = Default->getDefaultArgument();
1193 }
1194
1195 if (!Iter.hasDesugaredTA()) return;
1196
1197 const TemplateArgument& TA = Iter.getDesugaredTA();
1198 switch (TA.getKind()) {
1199 default:
1200 llvm_unreachable("unknown ArgumentKind")::llvm::llvm_unreachable_internal("unknown ArgumentKind", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1200)
;
1201 case TemplateArgument::Integral:
1202 Value = TA.getAsIntegral();
1203 HasInt = true;
1204 IntType = TA.getIntegralType();
1205 return;
1206 case TemplateArgument::Declaration: {
1207 VD = TA.getAsDecl();
1208 QualType ArgType = TA.getParamTypeForDecl();
1209 QualType VDType = VD->getType();
1210 if (ArgType->isPointerType() &&
1211 Context.hasSameType(ArgType->getPointeeType(), VDType))
1212 NeedAddressOf = true;
1213 return;
1214 }
1215 case TemplateArgument::NullPtr:
1216 IsNullPtr = true;
1217 return;
1218 case TemplateArgument::Expression:
1219 // TODO: Sometimes, the desugared template argument Expr differs from
1220 // the sugared template argument Expr. It may be useful in the future
1221 // but for now, it is just discarded.
1222 if (!E)
1223 E = TA.getAsExpr();
1224 return;
1225 }
1226 }
1227
1228 /// DiffNonTypes - Handles any template parameters not handled by DiffTypes
1229 /// of DiffTemplatesTemplates, such as integer and declaration parameters.
1230 void DiffNonTypes(const TSTiterator &FromIter, const TSTiterator &ToIter,
1231 NonTypeTemplateParmDecl *FromDefaultNonTypeDecl,
1232 NonTypeTemplateParmDecl *ToDefaultNonTypeDecl) {
1233 Expr *FromExpr = nullptr, *ToExpr = nullptr;
1234 llvm::APSInt FromInt, ToInt;
1235 QualType FromIntType, ToIntType;
1236 ValueDecl *FromValueDecl = nullptr, *ToValueDecl = nullptr;
1237 bool HasFromInt = false, HasToInt = false, FromNullPtr = false,
1238 ToNullPtr = false, NeedFromAddressOf = false, NeedToAddressOf = false;
1239 InitializeNonTypeDiffVariables(
1240 Context, FromIter, FromDefaultNonTypeDecl, FromInt, HasFromInt,
1241 FromIntType, FromNullPtr, FromExpr, FromValueDecl, NeedFromAddressOf);
1242 InitializeNonTypeDiffVariables(Context, ToIter, ToDefaultNonTypeDecl, ToInt,
1243 HasToInt, ToIntType, ToNullPtr, ToExpr,
1244 ToValueDecl, NeedToAddressOf);
1245
1246 bool FromDefault = FromIter.isEnd() &&
1247 (FromExpr || FromValueDecl || HasFromInt || FromNullPtr);
1248 bool ToDefault = ToIter.isEnd() &&
1249 (ToExpr || ToValueDecl || HasToInt || ToNullPtr);
1250
1251 bool FromDeclaration = FromValueDecl || FromNullPtr;
1252 bool ToDeclaration = ToValueDecl || ToNullPtr;
1253
1254 if (FromDeclaration && HasToInt) {
1255 Tree.SetFromDeclarationAndToIntegerDiff(
1256 FromValueDecl, NeedFromAddressOf, FromNullPtr, FromExpr, ToInt,
1257 HasToInt, ToIntType, ToExpr, FromDefault, ToDefault);
1258 Tree.SetSame(false);
1259 return;
1260
1261 }
1262
1263 if (HasFromInt && ToDeclaration) {
1264 Tree.SetFromIntegerAndToDeclarationDiff(
1265 FromInt, HasFromInt, FromIntType, FromExpr, ToValueDecl,
1266 NeedToAddressOf, ToNullPtr, ToExpr, FromDefault, ToDefault);
1267 Tree.SetSame(false);
1268 return;
1269 }
1270
1271 if (HasFromInt || HasToInt) {
1272 Tree.SetIntegerDiff(FromInt, ToInt, HasFromInt, HasToInt, FromIntType,
1273 ToIntType, FromExpr, ToExpr, FromDefault, ToDefault);
1274 if (HasFromInt && HasToInt) {
1275 Tree.SetSame(Context.hasSameType(FromIntType, ToIntType) &&
1276 FromInt == ToInt);
1277 }
1278 return;
1279 }
1280
1281 if (FromDeclaration || ToDeclaration) {
1282 Tree.SetDeclarationDiff(FromValueDecl, ToValueDecl, NeedFromAddressOf,
1283 NeedToAddressOf, FromNullPtr, ToNullPtr, FromExpr,
1284 ToExpr, FromDefault, ToDefault);
1285 bool BothNull = FromNullPtr && ToNullPtr;
1286 bool SameValueDecl =
1287 FromValueDecl && ToValueDecl &&
1288 NeedFromAddressOf == NeedToAddressOf &&
1289 FromValueDecl->getCanonicalDecl() == ToValueDecl->getCanonicalDecl();
1290 Tree.SetSame(BothNull || SameValueDecl);
1291 return;
1292 }
1293
1294 assert((FromExpr || ToExpr) && "Both template arguments cannot be empty.")(((FromExpr || ToExpr) && "Both template arguments cannot be empty."
) ? static_cast<void> (0) : __assert_fail ("(FromExpr || ToExpr) && \"Both template arguments cannot be empty.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1294, __PRETTY_FUNCTION__))
;
1295 Tree.SetExpressionDiff(FromExpr, ToExpr, FromDefault, ToDefault);
1296 Tree.SetSame(IsEqualExpr(Context, FromExpr, ToExpr));
1297 }
1298
1299 /// DiffTemplate - recursively visits template arguments and stores the
1300 /// argument info into a tree.
1301 void DiffTemplate(const TemplateSpecializationType *FromTST,
1302 const TemplateSpecializationType *ToTST) {
1303 // Begin descent into diffing template tree.
1304 TemplateParameterList *ParamsFrom =
1305 FromTST->getTemplateName().getAsTemplateDecl()->getTemplateParameters();
1306 TemplateParameterList *ParamsTo =
1307 ToTST->getTemplateName().getAsTemplateDecl()->getTemplateParameters();
1308 unsigned TotalArgs = 0;
1309 for (TSTiterator FromIter(Context, FromTST), ToIter(Context, ToTST);
1310 !FromIter.isEnd() || !ToIter.isEnd(); ++TotalArgs) {
1311 Tree.AddNode();
1312
1313 // Get the parameter at index TotalArgs. If index is larger
1314 // than the total number of parameters, then there is an
1315 // argument pack, so re-use the last parameter.
1316 unsigned FromParamIndex = std::min(TotalArgs, ParamsFrom->size() - 1);
1317 unsigned ToParamIndex = std::min(TotalArgs, ParamsTo->size() - 1);
1318 NamedDecl *FromParamND = ParamsFrom->getParam(FromParamIndex);
1319 NamedDecl *ToParamND = ParamsTo->getParam(ToParamIndex);
1320
1321 assert(FromParamND->getKind() == ToParamND->getKind() &&((FromParamND->getKind() == ToParamND->getKind() &&
"Parameter Decl are not the same kind.") ? static_cast<void
> (0) : __assert_fail ("FromParamND->getKind() == ToParamND->getKind() && \"Parameter Decl are not the same kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1322, __PRETTY_FUNCTION__))
1322 "Parameter Decl are not the same kind.")((FromParamND->getKind() == ToParamND->getKind() &&
"Parameter Decl are not the same kind.") ? static_cast<void
> (0) : __assert_fail ("FromParamND->getKind() == ToParamND->getKind() && \"Parameter Decl are not the same kind.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1322, __PRETTY_FUNCTION__))
;
1323
1324 if (isa<TemplateTypeParmDecl>(FromParamND)) {
1325 DiffTypes(FromIter, ToIter);
1326 } else if (isa<TemplateTemplateParmDecl>(FromParamND)) {
1327 DiffTemplateTemplates(FromIter, ToIter);
1328 } else if (isa<NonTypeTemplateParmDecl>(FromParamND)) {
1329 NonTypeTemplateParmDecl *FromDefaultNonTypeDecl =
1330 cast<NonTypeTemplateParmDecl>(FromParamND);
1331 NonTypeTemplateParmDecl *ToDefaultNonTypeDecl =
1332 cast<NonTypeTemplateParmDecl>(ToParamND);
1333 DiffNonTypes(FromIter, ToIter, FromDefaultNonTypeDecl,
1334 ToDefaultNonTypeDecl);
1335 } else {
1336 llvm_unreachable("Unexpected Decl type.")::llvm::llvm_unreachable_internal("Unexpected Decl type.", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1336)
;
1337 }
1338
1339 ++FromIter;
1340 ++ToIter;
1341 Tree.Up();
1342 }
1343 }
1344
1345 /// makeTemplateList - Dump every template alias into the vector.
1346 static void makeTemplateList(
1347 SmallVectorImpl<const TemplateSpecializationType *> &TemplateList,
1348 const TemplateSpecializationType *TST) {
1349 while (TST) {
1350 TemplateList.push_back(TST);
1351 if (!TST->isTypeAlias())
1352 return;
1353 TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
1354 }
1355 }
1356
1357 /// hasSameBaseTemplate - Returns true when the base templates are the same,
1358 /// even if the template arguments are not.
1359 static bool hasSameBaseTemplate(const TemplateSpecializationType *FromTST,
1360 const TemplateSpecializationType *ToTST) {
1361 return FromTST->getTemplateName().getAsTemplateDecl()->getCanonicalDecl() ==
1362 ToTST->getTemplateName().getAsTemplateDecl()->getCanonicalDecl();
1363 }
1364
1365 /// hasSameTemplate - Returns true if both types are specialized from the
1366 /// same template declaration. If they come from different template aliases,
1367 /// do a parallel ascension search to determine the highest template alias in
1368 /// common and set the arguments to them.
1369 static bool hasSameTemplate(const TemplateSpecializationType *&FromTST,
1370 const TemplateSpecializationType *&ToTST) {
1371 // Check the top templates if they are the same.
1372 if (hasSameBaseTemplate(FromTST, ToTST))
1373 return true;
1374
1375 // Create vectors of template aliases.
1376 SmallVector<const TemplateSpecializationType*, 1> FromTemplateList,
1377 ToTemplateList;
1378
1379 makeTemplateList(FromTemplateList, FromTST);
1380 makeTemplateList(ToTemplateList, ToTST);
1381
1382 SmallVectorImpl<const TemplateSpecializationType *>::reverse_iterator
1383 FromIter = FromTemplateList.rbegin(), FromEnd = FromTemplateList.rend(),
1384 ToIter = ToTemplateList.rbegin(), ToEnd = ToTemplateList.rend();
1385
1386 // Check if the lowest template types are the same. If not, return.
1387 if (!hasSameBaseTemplate(*FromIter, *ToIter))
1388 return false;
1389
1390 // Begin searching up the template aliases. The bottom most template
1391 // matches so move up until one pair does not match. Use the template
1392 // right before that one.
1393 for (; FromIter != FromEnd && ToIter != ToEnd; ++FromIter, ++ToIter) {
1394 if (!hasSameBaseTemplate(*FromIter, *ToIter))
1395 break;
1396 }
1397
1398 FromTST = FromIter[-1];
1399 ToTST = ToIter[-1];
1400
1401 return true;
1402 }
1403
1404 /// GetType - Retrieves the template type arguments, including default
1405 /// arguments.
1406 static QualType GetType(const TSTiterator &Iter) {
1407 if (!Iter.isEnd())
1408 return Iter->getAsType();
1409 if (Iter.hasDesugaredTA())
1410 return Iter.getDesugaredTA().getAsType();
1411 return QualType();
1412 }
1413
1414 /// GetTemplateDecl - Retrieves the template template arguments, including
1415 /// default arguments.
1416 static TemplateDecl *GetTemplateDecl(const TSTiterator &Iter) {
1417 if (!Iter.isEnd())
1418 return Iter->getAsTemplate().getAsTemplateDecl();
1419 if (Iter.hasDesugaredTA())
1420 return Iter.getDesugaredTA().getAsTemplate().getAsTemplateDecl();
1421 return nullptr;
1422 }
1423
1424 /// IsEqualExpr - Returns true if the expressions are the same in regards to
1425 /// template arguments. These expressions are dependent, so profile them
1426 /// instead of trying to evaluate them.
1427 static bool IsEqualExpr(ASTContext &Context, Expr *FromExpr, Expr *ToExpr) {
1428 if (FromExpr == ToExpr)
1429 return true;
1430
1431 if (!FromExpr || !ToExpr)
1432 return false;
1433
1434 llvm::FoldingSetNodeID FromID, ToID;
1435 FromExpr->Profile(FromID, Context, true);
1436 ToExpr->Profile(ToID, Context, true);
1437 return FromID == ToID;
1438 }
1439
1440 // These functions converts the tree representation of the template
1441 // differences into the internal character vector.
1442
1443 /// TreeToString - Converts the Tree object into a character stream which
1444 /// will later be turned into the output string.
1445 void TreeToString(int Indent = 1) {
1446 if (PrintTree) {
1447 OS << '\n';
1448 OS.indent(2 * Indent);
1449 ++Indent;
1450 }
1451
1452 // Handle cases where the difference is not templates with different
1453 // arguments.
1454 switch (Tree.GetKind()) {
1455 case DiffTree::Invalid:
1456 llvm_unreachable("Template diffing failed with bad DiffNode")::llvm::llvm_unreachable_internal("Template diffing failed with bad DiffNode"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1456)
;
1457 case DiffTree::Type: {
1458 QualType FromType, ToType;
1459 Tree.GetTypeDiff(FromType, ToType);
1460 PrintTypeNames(FromType, ToType, Tree.FromDefault(), Tree.ToDefault(),
1461 Tree.NodeIsSame());
1462 return;
1463 }
1464 case DiffTree::Expression: {
1465 Expr *FromExpr, *ToExpr;
1466 Tree.GetExpressionDiff(FromExpr, ToExpr);
1467 PrintExpr(FromExpr, ToExpr, Tree.FromDefault(), Tree.ToDefault(),
1468 Tree.NodeIsSame());
1469 return;
1470 }
1471 case DiffTree::TemplateTemplate: {
1472 TemplateDecl *FromTD, *ToTD;
1473 Tree.GetTemplateTemplateDiff(FromTD, ToTD);
1474 PrintTemplateTemplate(FromTD, ToTD, Tree.FromDefault(),
1475 Tree.ToDefault(), Tree.NodeIsSame());
1476 return;
1477 }
1478 case DiffTree::Integer: {
1479 llvm::APSInt FromInt, ToInt;
1480 Expr *FromExpr, *ToExpr;
1481 bool IsValidFromInt, IsValidToInt;
1482 QualType FromIntType, ToIntType;
1483 Tree.GetIntegerDiff(FromInt, ToInt, IsValidFromInt, IsValidToInt,
1484 FromIntType, ToIntType, FromExpr, ToExpr);
1485 PrintAPSInt(FromInt, ToInt, IsValidFromInt, IsValidToInt, FromIntType,
1486 ToIntType, FromExpr, ToExpr, Tree.FromDefault(),
1487 Tree.ToDefault(), Tree.NodeIsSame());
1488 return;
1489 }
1490 case DiffTree::Declaration: {
1491 ValueDecl *FromValueDecl, *ToValueDecl;
1492 bool FromAddressOf, ToAddressOf;
1493 bool FromNullPtr, ToNullPtr;
1494 Expr *FromExpr, *ToExpr;
1495 Tree.GetDeclarationDiff(FromValueDecl, ToValueDecl, FromAddressOf,
1496 ToAddressOf, FromNullPtr, ToNullPtr, FromExpr,
1497 ToExpr);
1498 PrintValueDecl(FromValueDecl, ToValueDecl, FromAddressOf, ToAddressOf,
1499 FromNullPtr, ToNullPtr, FromExpr, ToExpr,
1500 Tree.FromDefault(), Tree.ToDefault(), Tree.NodeIsSame());
1501 return;
1502 }
1503 case DiffTree::FromDeclarationAndToInteger: {
1504 ValueDecl *FromValueDecl;
1505 bool FromAddressOf;
1506 bool FromNullPtr;
1507 Expr *FromExpr;
1508 llvm::APSInt ToInt;
1509 bool IsValidToInt;
1510 QualType ToIntType;
1511 Expr *ToExpr;
1512 Tree.GetFromDeclarationAndToIntegerDiff(
1513 FromValueDecl, FromAddressOf, FromNullPtr, FromExpr, ToInt,
1514 IsValidToInt, ToIntType, ToExpr);
1515 assert((FromValueDecl || FromNullPtr) && IsValidToInt)(((FromValueDecl || FromNullPtr) && IsValidToInt) ? static_cast
<void> (0) : __assert_fail ("(FromValueDecl || FromNullPtr) && IsValidToInt"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1515, __PRETTY_FUNCTION__))
;
1516 PrintValueDeclAndInteger(FromValueDecl, FromAddressOf, FromNullPtr,
1517 FromExpr, Tree.FromDefault(), ToInt, ToIntType,
1518 ToExpr, Tree.ToDefault());
1519 return;
1520 }
1521 case DiffTree::FromIntegerAndToDeclaration: {
1522 llvm::APSInt FromInt;
1523 bool IsValidFromInt;
1524 QualType FromIntType;
1525 Expr *FromExpr;
1526 ValueDecl *ToValueDecl;
1527 bool ToAddressOf;
1528 bool ToNullPtr;
1529 Expr *ToExpr;
1530 Tree.GetFromIntegerAndToDeclarationDiff(
1531 FromInt, IsValidFromInt, FromIntType, FromExpr, ToValueDecl,
1532 ToAddressOf, ToNullPtr, ToExpr);
1533 assert(IsValidFromInt && (ToValueDecl || ToNullPtr))((IsValidFromInt && (ToValueDecl || ToNullPtr)) ? static_cast
<void> (0) : __assert_fail ("IsValidFromInt && (ToValueDecl || ToNullPtr)"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1533, __PRETTY_FUNCTION__))
;
1534 PrintIntegerAndValueDecl(FromInt, FromIntType, FromExpr,
1535 Tree.FromDefault(), ToValueDecl, ToAddressOf,
1536 ToNullPtr, ToExpr, Tree.ToDefault());
1537 return;
1538 }
1539 case DiffTree::Template: {
1540 // Node is root of template. Recurse on children.
1541 TemplateDecl *FromTD, *ToTD;
1542 Qualifiers FromQual, ToQual;
1543 Tree.GetTemplateDiff(FromTD, ToTD, FromQual, ToQual);
1544
1545 PrintQualifiers(FromQual, ToQual);
1546
1547 if (!Tree.HasChildren()) {
1548 // If we're dealing with a template specialization with zero
1549 // arguments, there are no children; special-case this.
1550 OS << FromTD->getNameAsString() << "<>";
1551 return;
1552 }
1553
1554 OS << FromTD->getNameAsString() << '<';
1555 Tree.MoveToChild();
1556 unsigned NumElideArgs = 0;
1557 bool AllArgsElided = true;
1558 do {
1559 if (ElideType) {
1560 if (Tree.NodeIsSame()) {
1561 ++NumElideArgs;
1562 continue;
1563 }
1564 AllArgsElided = false;
1565 if (NumElideArgs > 0) {
1566 PrintElideArgs(NumElideArgs, Indent);
1567 NumElideArgs = 0;
1568 OS << ", ";
1569 }
1570 }
1571 TreeToString(Indent);
1572 if (Tree.HasNextSibling())
1573 OS << ", ";
1574 } while (Tree.AdvanceSibling());
1575 if (NumElideArgs > 0) {
1576 if (AllArgsElided)
1577 OS << "...";
1578 else
1579 PrintElideArgs(NumElideArgs, Indent);
1580 }
1581
1582 Tree.Parent();
1583 OS << ">";
1584 return;
1585 }
1586 }
1587 }
1588
1589 // To signal to the text printer that a certain text needs to be bolded,
1590 // a special character is injected into the character stream which the
1591 // text printer will later strip out.
1592
1593 /// Bold - Start bolding text.
1594 void Bold() {
1595 assert(!IsBold && "Attempting to bold text that is already bold.")((!IsBold && "Attempting to bold text that is already bold."
) ? static_cast<void> (0) : __assert_fail ("!IsBold && \"Attempting to bold text that is already bold.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1595, __PRETTY_FUNCTION__))
;
1596 IsBold = true;
1597 if (ShowColor)
1598 OS << ToggleHighlight;
1599 }
1600
1601 /// Unbold - Stop bolding text.
1602 void Unbold() {
1603 assert(IsBold && "Attempting to remove bold from unbold text.")((IsBold && "Attempting to remove bold from unbold text."
) ? static_cast<void> (0) : __assert_fail ("IsBold && \"Attempting to remove bold from unbold text.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1603, __PRETTY_FUNCTION__))
;
1604 IsBold = false;
1605 if (ShowColor)
1606 OS << ToggleHighlight;
1607 }
1608
1609 // Functions to print out the arguments and highlighting the difference.
1610
1611 /// PrintTypeNames - prints the typenames, bolding differences. Will detect
1612 /// typenames that are the same and attempt to disambiguate them by using
1613 /// canonical typenames.
1614 void PrintTypeNames(QualType FromType, QualType ToType,
1615 bool FromDefault, bool ToDefault, bool Same) {
1616 assert((!FromType.isNull() || !ToType.isNull()) &&(((!FromType.isNull() || !ToType.isNull()) && "Only one template argument may be missing."
) ? static_cast<void> (0) : __assert_fail ("(!FromType.isNull() || !ToType.isNull()) && \"Only one template argument may be missing.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1617, __PRETTY_FUNCTION__))
1617 "Only one template argument may be missing.")(((!FromType.isNull() || !ToType.isNull()) && "Only one template argument may be missing."
) ? static_cast<void> (0) : __assert_fail ("(!FromType.isNull() || !ToType.isNull()) && \"Only one template argument may be missing.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1617, __PRETTY_FUNCTION__))
;
1618
1619 if (Same) {
1620 OS << FromType.getAsString(Policy);
1621 return;
1622 }
1623
1624 if (!FromType.isNull() && !ToType.isNull() &&
1625 FromType.getLocalUnqualifiedType() ==
1626 ToType.getLocalUnqualifiedType()) {
1627 Qualifiers FromQual = FromType.getLocalQualifiers(),
1628 ToQual = ToType.getLocalQualifiers();
1629 PrintQualifiers(FromQual, ToQual);
1630 FromType.getLocalUnqualifiedType().print(OS, Policy);
1631 return;
1632 }
1633
1634 std::string FromTypeStr = FromType.isNull() ? "(no argument)"
1635 : FromType.getAsString(Policy);
1636 std::string ToTypeStr = ToType.isNull() ? "(no argument)"
1637 : ToType.getAsString(Policy);
1638 // Switch to canonical typename if it is better.
1639 // TODO: merge this with other aka printing above.
1640 if (FromTypeStr == ToTypeStr) {
1641 std::string FromCanTypeStr =
1642 FromType.getCanonicalType().getAsString(Policy);
1643 std::string ToCanTypeStr = ToType.getCanonicalType().getAsString(Policy);
1644 if (FromCanTypeStr != ToCanTypeStr) {
1645 FromTypeStr = FromCanTypeStr;
1646 ToTypeStr = ToCanTypeStr;
1647 }
1648 }
1649
1650 if (PrintTree) OS << '[';
1651 OS << (FromDefault ? "(default) " : "");
1652 Bold();
1653 OS << FromTypeStr;
1654 Unbold();
1655 if (PrintTree) {
1656 OS << " != " << (ToDefault ? "(default) " : "");
1657 Bold();
1658 OS << ToTypeStr;
1659 Unbold();
1660 OS << "]";
1661 }
1662 }
1663
1664 /// PrintExpr - Prints out the expr template arguments, highlighting argument
1665 /// differences.
1666 void PrintExpr(const Expr *FromExpr, const Expr *ToExpr, bool FromDefault,
1667 bool ToDefault, bool Same) {
1668 assert((FromExpr || ToExpr) &&(((FromExpr || ToExpr) && "Only one template argument may be missing."
) ? static_cast<void> (0) : __assert_fail ("(FromExpr || ToExpr) && \"Only one template argument may be missing.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1669, __PRETTY_FUNCTION__))
1669 "Only one template argument may be missing.")(((FromExpr || ToExpr) && "Only one template argument may be missing."
) ? static_cast<void> (0) : __assert_fail ("(FromExpr || ToExpr) && \"Only one template argument may be missing.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1669, __PRETTY_FUNCTION__))
;
1670 if (Same) {
1671 PrintExpr(FromExpr);
1672 } else if (!PrintTree) {
1673 OS << (FromDefault ? "(default) " : "");
1674 Bold();
1675 PrintExpr(FromExpr);
1676 Unbold();
1677 } else {
1678 OS << (FromDefault ? "[(default) " : "[");
1679 Bold();
1680 PrintExpr(FromExpr);
1681 Unbold();
1682 OS << " != " << (ToDefault ? "(default) " : "");
1683 Bold();
1684 PrintExpr(ToExpr);
1685 Unbold();
1686 OS << ']';
1687 }
1688 }
1689
1690 /// PrintExpr - Actual formatting and printing of expressions.
1691 void PrintExpr(const Expr *E) {
1692 if (E) {
1693 E->printPretty(OS, nullptr, Policy);
1694 return;
1695 }
1696 OS << "(no argument)";
1697 }
1698
1699 /// PrintTemplateTemplate - Handles printing of template template arguments,
1700 /// highlighting argument differences.
1701 void PrintTemplateTemplate(TemplateDecl *FromTD, TemplateDecl *ToTD,
1702 bool FromDefault, bool ToDefault, bool Same) {
1703 assert((FromTD || ToTD) && "Only one template argument may be missing.")(((FromTD || ToTD) && "Only one template argument may be missing."
) ? static_cast<void> (0) : __assert_fail ("(FromTD || ToTD) && \"Only one template argument may be missing.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1703, __PRETTY_FUNCTION__))
;
1704
1705 std::string FromName = FromTD ? FromTD->getName() : "(no argument)";
1706 std::string ToName = ToTD ? ToTD->getName() : "(no argument)";
1707 if (FromTD && ToTD && FromName == ToName) {
1708 FromName = FromTD->getQualifiedNameAsString();
1709 ToName = ToTD->getQualifiedNameAsString();
1710 }
1711
1712 if (Same) {
1713 OS << "template " << FromTD->getNameAsString();
1714 } else if (!PrintTree) {
1715 OS << (FromDefault ? "(default) template " : "template ");
1716 Bold();
1717 OS << FromName;
1718 Unbold();
1719 } else {
1720 OS << (FromDefault ? "[(default) template " : "[template ");
1721 Bold();
1722 OS << FromName;
1723 Unbold();
1724 OS << " != " << (ToDefault ? "(default) template " : "template ");
1725 Bold();
1726 OS << ToName;
1727 Unbold();
1728 OS << ']';
1729 }
1730 }
1731
1732 /// PrintAPSInt - Handles printing of integral arguments, highlighting
1733 /// argument differences.
1734 void PrintAPSInt(const llvm::APSInt &FromInt, const llvm::APSInt &ToInt,
1735 bool IsValidFromInt, bool IsValidToInt, QualType FromIntType,
1736 QualType ToIntType, Expr *FromExpr, Expr *ToExpr,
1737 bool FromDefault, bool ToDefault, bool Same) {
1738 assert((IsValidFromInt || IsValidToInt) &&(((IsValidFromInt || IsValidToInt) && "Only one integral argument may be missing."
) ? static_cast<void> (0) : __assert_fail ("(IsValidFromInt || IsValidToInt) && \"Only one integral argument may be missing.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1739, __PRETTY_FUNCTION__))
1739 "Only one integral argument may be missing.")(((IsValidFromInt || IsValidToInt) && "Only one integral argument may be missing."
) ? static_cast<void> (0) : __assert_fail ("(IsValidFromInt || IsValidToInt) && \"Only one integral argument may be missing.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1739, __PRETTY_FUNCTION__))
;
1740
1741 if (Same) {
1742 if (FromIntType->isBooleanType()) {
1743 OS << ((FromInt == 0) ? "false" : "true");
1744 } else {
1745 OS << FromInt.toString(10);
1746 }
1747 return;
1748 }
1749
1750 bool PrintType = IsValidFromInt && IsValidToInt &&
1751 !Context.hasSameType(FromIntType, ToIntType);
1752
1753 if (!PrintTree) {
1754 OS << (FromDefault ? "(default) " : "");
1755 PrintAPSInt(FromInt, FromExpr, IsValidFromInt, FromIntType, PrintType);
1756 } else {
1757 OS << (FromDefault ? "[(default) " : "[");
1758 PrintAPSInt(FromInt, FromExpr, IsValidFromInt, FromIntType, PrintType);
1759 OS << " != " << (ToDefault ? "(default) " : "");
1760 PrintAPSInt(ToInt, ToExpr, IsValidToInt, ToIntType, PrintType);
1761 OS << ']';
1762 }
1763 }
1764
1765 /// PrintAPSInt - If valid, print the APSInt. If the expression is
1766 /// gives more information, print it too.
1767 void PrintAPSInt(const llvm::APSInt &Val, Expr *E, bool Valid,
1768 QualType IntType, bool PrintType) {
1769 Bold();
1770 if (Valid) {
1771 if (HasExtraInfo(E)) {
1772 PrintExpr(E);
1773 Unbold();
1774 OS << " aka ";
1775 Bold();
1776 }
1777 if (PrintType) {
1778 Unbold();
1779 OS << "(";
1780 Bold();
1781 IntType.print(OS, Context.getPrintingPolicy());
1782 Unbold();
1783 OS << ") ";
1784 Bold();
1785 }
1786 if (IntType->isBooleanType()) {
1787 OS << ((Val == 0) ? "false" : "true");
1788 } else {
1789 OS << Val.toString(10);
1790 }
1791 } else if (E) {
1792 PrintExpr(E);
1793 } else {
1794 OS << "(no argument)";
1795 }
1796 Unbold();
1797 }
1798
1799 /// HasExtraInfo - Returns true if E is not an integer literal, the
1800 /// negation of an integer literal, or a boolean literal.
1801 bool HasExtraInfo(Expr *E) {
1802 if (!E) return false;
1803
1804 E = E->IgnoreImpCasts();
1805
1806 if (isa<IntegerLiteral>(E)) return false;
1807
1808 if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E))
1809 if (UO->getOpcode() == UO_Minus)
1810 if (isa<IntegerLiteral>(UO->getSubExpr()))
1811 return false;
1812
1813 if (isa<CXXBoolLiteralExpr>(E))
1814 return false;
1815
1816 return true;
1817 }
1818
1819 void PrintValueDecl(ValueDecl *VD, bool AddressOf, Expr *E, bool NullPtr) {
1820 if (VD) {
1821 if (AddressOf)
1822 OS << "&";
1823 OS << VD->getName();
1824 return;
1825 }
1826
1827 if (NullPtr) {
1828 if (E && !isa<CXXNullPtrLiteralExpr>(E)) {
1829 PrintExpr(E);
1830 if (IsBold) {
1831 Unbold();
1832 OS << " aka ";
1833 Bold();
1834 } else {
1835 OS << " aka ";
1836 }
1837 }
1838
1839 OS << "nullptr";
1840 return;
1841 }
1842
1843 OS << "(no argument)";
1844 }
1845
1846 /// PrintDecl - Handles printing of Decl arguments, highlighting
1847 /// argument differences.
1848 void PrintValueDecl(ValueDecl *FromValueDecl, ValueDecl *ToValueDecl,
1849 bool FromAddressOf, bool ToAddressOf, bool FromNullPtr,
1850 bool ToNullPtr, Expr *FromExpr, Expr *ToExpr,
1851 bool FromDefault, bool ToDefault, bool Same) {
1852 assert((FromValueDecl || FromNullPtr || ToValueDecl || ToNullPtr) &&(((FromValueDecl || FromNullPtr || ToValueDecl || ToNullPtr) &&
"Only one Decl argument may be NULL") ? static_cast<void>
(0) : __assert_fail ("(FromValueDecl || FromNullPtr || ToValueDecl || ToNullPtr) && \"Only one Decl argument may be NULL\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1853, __PRETTY_FUNCTION__))
1853 "Only one Decl argument may be NULL")(((FromValueDecl || FromNullPtr || ToValueDecl || ToNullPtr) &&
"Only one Decl argument may be NULL") ? static_cast<void>
(0) : __assert_fail ("(FromValueDecl || FromNullPtr || ToValueDecl || ToNullPtr) && \"Only one Decl argument may be NULL\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 1853, __PRETTY_FUNCTION__))
;
1854
1855 if (Same) {
1856 PrintValueDecl(FromValueDecl, FromAddressOf, FromExpr, FromNullPtr);
1857 } else if (!PrintTree) {
1858 OS << (FromDefault ? "(default) " : "");
1859 Bold();
1860 PrintValueDecl(FromValueDecl, FromAddressOf, FromExpr, FromNullPtr);
1861 Unbold();
1862 } else {
1863 OS << (FromDefault ? "[(default) " : "[");
1864 Bold();
1865 PrintValueDecl(FromValueDecl, FromAddressOf, FromExpr, FromNullPtr);
1866 Unbold();
1867 OS << " != " << (ToDefault ? "(default) " : "");
1868 Bold();
1869 PrintValueDecl(ToValueDecl, ToAddressOf, ToExpr, ToNullPtr);
1870 Unbold();
1871 OS << ']';
1872 }
1873 }
1874
1875 /// PrintValueDeclAndInteger - Uses the print functions for ValueDecl and
1876 /// APSInt to print a mixed difference.
1877 void PrintValueDeclAndInteger(ValueDecl *VD, bool NeedAddressOf,
1878 bool IsNullPtr, Expr *VDExpr, bool DefaultDecl,
1879 const llvm::APSInt &Val, QualType IntType,
1880 Expr *IntExpr, bool DefaultInt) {
1881 if (!PrintTree) {
1882 OS << (DefaultDecl ? "(default) " : "");
1883 Bold();
1884 PrintValueDecl(VD, NeedAddressOf, VDExpr, IsNullPtr);
1885 Unbold();
1886 } else {
1887 OS << (DefaultDecl ? "[(default) " : "[");
1888 Bold();
1889 PrintValueDecl(VD, NeedAddressOf, VDExpr, IsNullPtr);
1890 Unbold();
1891 OS << " != " << (DefaultInt ? "(default) " : "");
1892 PrintAPSInt(Val, IntExpr, true /*Valid*/, IntType, false /*PrintType*/);
1893 OS << ']';
1894 }
1895 }
1896
1897 /// PrintIntegerAndValueDecl - Uses the print functions for APSInt and
1898 /// ValueDecl to print a mixed difference.
1899 void PrintIntegerAndValueDecl(const llvm::APSInt &Val, QualType IntType,
1900 Expr *IntExpr, bool DefaultInt, ValueDecl *VD,
1901 bool NeedAddressOf, bool IsNullPtr,
1902 Expr *VDExpr, bool DefaultDecl) {
1903 if (!PrintTree) {
1904 OS << (DefaultInt ? "(default) " : "");
1905 PrintAPSInt(Val, IntExpr, true /*Valid*/, IntType, false /*PrintType*/);
1906 } else {
1907 OS << (DefaultInt ? "[(default) " : "[");
1908 PrintAPSInt(Val, IntExpr, true /*Valid*/, IntType, false /*PrintType*/);
1909 OS << " != " << (DefaultDecl ? "(default) " : "");
1910 Bold();
1911 PrintValueDecl(VD, NeedAddressOf, VDExpr, IsNullPtr);
1912 Unbold();
1913 OS << ']';
1914 }
1915 }
1916
1917 // Prints the appropriate placeholder for elided template arguments.
1918 void PrintElideArgs(unsigned NumElideArgs, unsigned Indent) {
1919 if (PrintTree) {
1920 OS << '\n';
1921 for (unsigned i = 0; i < Indent; ++i)
1922 OS << " ";
1923 }
1924 if (NumElideArgs == 0) return;
1925 if (NumElideArgs == 1)
1926 OS << "[...]";
1927 else
1928 OS << "[" << NumElideArgs << " * ...]";
1929 }
1930
1931 // Prints and highlights differences in Qualifiers.
1932 void PrintQualifiers(Qualifiers FromQual, Qualifiers ToQual) {
1933 // Both types have no qualifiers
1934 if (FromQual.empty() && ToQual.empty())
1935 return;
1936
1937 // Both types have same qualifiers
1938 if (FromQual == ToQual) {
1939 PrintQualifier(FromQual, /*ApplyBold*/false);
1940 return;
1941 }
1942
1943 // Find common qualifiers and strip them from FromQual and ToQual.
1944 Qualifiers CommonQual = Qualifiers::removeCommonQualifiers(FromQual,
1945 ToQual);
1946
1947 // The qualifiers are printed before the template name.
1948 // Inline printing:
1949 // The common qualifiers are printed. Then, qualifiers only in this type
1950 // are printed and highlighted. Finally, qualifiers only in the other
1951 // type are printed and highlighted inside parentheses after "missing".
1952 // Tree printing:
1953 // Qualifiers are printed next to each other, inside brackets, and
1954 // separated by "!=". The printing order is:
1955 // common qualifiers, highlighted from qualifiers, "!=",
1956 // common qualifiers, highlighted to qualifiers
1957 if (PrintTree) {
1958 OS << "[";
1959 if (CommonQual.empty() && FromQual.empty()) {
1960 Bold();
1961 OS << "(no qualifiers) ";
1962 Unbold();
1963 } else {
1964 PrintQualifier(CommonQual, /*ApplyBold*/false);
1965 PrintQualifier(FromQual, /*ApplyBold*/true);
1966 }
1967 OS << "!= ";
1968 if (CommonQual.empty() && ToQual.empty()) {
1969 Bold();
1970 OS << "(no qualifiers)";
1971 Unbold();
1972 } else {
1973 PrintQualifier(CommonQual, /*ApplyBold*/false,
1974 /*appendSpaceIfNonEmpty*/!ToQual.empty());
1975 PrintQualifier(ToQual, /*ApplyBold*/true,
1976 /*appendSpaceIfNonEmpty*/false);
1977 }
1978 OS << "] ";
1979 } else {
1980 PrintQualifier(CommonQual, /*ApplyBold*/false);
1981 PrintQualifier(FromQual, /*ApplyBold*/true);
1982 }
1983 }
1984
1985 void PrintQualifier(Qualifiers Q, bool ApplyBold,
1986 bool AppendSpaceIfNonEmpty = true) {
1987 if (Q.empty()) return;
1988 if (ApplyBold) Bold();
1989 Q.print(OS, Policy, AppendSpaceIfNonEmpty);
1990 if (ApplyBold) Unbold();
1991 }
1992
1993public:
1994
1995 TemplateDiff(raw_ostream &OS, ASTContext &Context, QualType FromType,
1996 QualType ToType, bool PrintTree, bool PrintFromType,
1997 bool ElideType, bool ShowColor)
1998 : Context(Context),
1999 Policy(Context.getLangOpts()),
2000 ElideType(ElideType),
2001 PrintTree(PrintTree),
2002 ShowColor(ShowColor),
2003 // When printing a single type, the FromType is the one printed.
2004 FromTemplateType(PrintFromType ? FromType : ToType),
2005 ToTemplateType(PrintFromType ? ToType : FromType),
2006 OS(OS),
2007 IsBold(false) {
2008 }
2009
2010 /// DiffTemplate - Start the template type diffing.
2011 void DiffTemplate() {
2012 Qualifiers FromQual = FromTemplateType.getQualifiers(),
2013 ToQual = ToTemplateType.getQualifiers();
2014
2015 const TemplateSpecializationType *FromOrigTST =
2016 GetTemplateSpecializationType(Context, FromTemplateType);
2017 const TemplateSpecializationType *ToOrigTST =
2018 GetTemplateSpecializationType(Context, ToTemplateType);
2019
2020 // Only checking templates.
2021 if (!FromOrigTST || !ToOrigTST)
2022 return;
2023
2024 // Different base templates.
2025 if (!hasSameTemplate(FromOrigTST, ToOrigTST)) {
2026 return;
2027 }
2028
2029 FromQual -= QualType(FromOrigTST, 0).getQualifiers();
2030 ToQual -= QualType(ToOrigTST, 0).getQualifiers();
2031
2032 // Same base template, but different arguments.
2033 Tree.SetTemplateDiff(FromOrigTST->getTemplateName().getAsTemplateDecl(),
2034 ToOrigTST->getTemplateName().getAsTemplateDecl(),
2035 FromQual, ToQual, false /*FromDefault*/,
2036 false /*ToDefault*/);
2037
2038 DiffTemplate(FromOrigTST, ToOrigTST);
2039 }
2040
2041 /// Emit - When the two types given are templated types with the same
2042 /// base template, a string representation of the type difference will be
2043 /// emitted to the stream and return true. Otherwise, return false.
2044 bool Emit() {
2045 Tree.StartTraverse();
2046 if (Tree.Empty())
2047 return false;
2048
2049 TreeToString();
2050 assert(!IsBold && "Bold is applied to end of string.")((!IsBold && "Bold is applied to end of string.") ? static_cast
<void> (0) : __assert_fail ("!IsBold && \"Bold is applied to end of string.\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/lib/AST/ASTDiagnostic.cpp"
, 2050, __PRETTY_FUNCTION__))
;
2051 return true;
2052 }
2053}; // end class TemplateDiff
2054} // end anonymous namespace
2055
2056/// FormatTemplateTypeDiff - A helper static function to start the template
2057/// diff and return the properly formatted string. Returns true if the diff
2058/// is successful.
2059static bool FormatTemplateTypeDiff(ASTContext &Context, QualType FromType,
2060 QualType ToType, bool PrintTree,
2061 bool PrintFromType, bool ElideType,
2062 bool ShowColors, raw_ostream &OS) {
2063 if (PrintTree)
2064 PrintFromType = true;
2065 TemplateDiff TD(OS, Context, FromType, ToType, PrintTree, PrintFromType,
2066 ElideType, ShowColors);
2067 TD.DiffTemplate();
2068 return TD.Emit();
2069}

/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h

1//===- Type.h - C Language Family Type Representation -----------*- 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/// \file
10/// C Language Family Type Representation
11///
12/// This file defines the clang::Type interface and subclasses, used to
13/// represent types for languages in the C family.
14//
15//===----------------------------------------------------------------------===//
16
17#ifndef LLVM_CLANG_AST_TYPE_H
18#define LLVM_CLANG_AST_TYPE_H
19
20#include "clang/AST/NestedNameSpecifier.h"
21#include "clang/AST/TemplateName.h"
22#include "clang/Basic/AddressSpaces.h"
23#include "clang/Basic/AttrKinds.h"
24#include "clang/Basic/Diagnostic.h"
25#include "clang/Basic/ExceptionSpecificationType.h"
26#include "clang/Basic/LLVM.h"
27#include "clang/Basic/Linkage.h"
28#include "clang/Basic/PartialDiagnostic.h"
29#include "clang/Basic/SourceLocation.h"
30#include "clang/Basic/Specifiers.h"
31#include "clang/Basic/Visibility.h"
32#include "llvm/ADT/APInt.h"
33#include "llvm/ADT/APSInt.h"
34#include "llvm/ADT/ArrayRef.h"
35#include "llvm/ADT/FoldingSet.h"
36#include "llvm/ADT/None.h"
37#include "llvm/ADT/Optional.h"
38#include "llvm/ADT/PointerIntPair.h"
39#include "llvm/ADT/PointerUnion.h"
40#include "llvm/ADT/StringRef.h"
41#include "llvm/ADT/Twine.h"
42#include "llvm/ADT/iterator_range.h"
43#include "llvm/Support/Casting.h"
44#include "llvm/Support/Compiler.h"
45#include "llvm/Support/ErrorHandling.h"
46#include "llvm/Support/PointerLikeTypeTraits.h"
47#include "llvm/Support/type_traits.h"
48#include "llvm/Support/TrailingObjects.h"
49#include <cassert>
50#include <cstddef>
51#include <cstdint>
52#include <cstring>
53#include <string>
54#include <type_traits>
55#include <utility>
56
57namespace clang {
58
59class ExtQuals;
60class QualType;
61class TagDecl;
62class Type;
63
64enum {
65 TypeAlignmentInBits = 4,
66 TypeAlignment = 1 << TypeAlignmentInBits
67};
68
69} // namespace clang
70
71namespace llvm {
72
73 template <typename T>
74 struct PointerLikeTypeTraits;
75 template<>
76 struct PointerLikeTypeTraits< ::clang::Type*> {
77 static inline void *getAsVoidPointer(::clang::Type *P) { return P; }
78
79 static inline ::clang::Type *getFromVoidPointer(void *P) {
80 return static_cast< ::clang::Type*>(P);
81 }
82
83 enum { NumLowBitsAvailable = clang::TypeAlignmentInBits };
84 };
85
86 template<>
87 struct PointerLikeTypeTraits< ::clang::ExtQuals*> {
88 static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; }
89
90 static inline ::clang::ExtQuals *getFromVoidPointer(void *P) {
91 return static_cast< ::clang::ExtQuals*>(P);
92 }
93
94 enum { NumLowBitsAvailable = clang::TypeAlignmentInBits };
95 };
96
97} // namespace llvm
98
99namespace clang {
100
101class ASTContext;
102template <typename> class CanQual;
103class CXXRecordDecl;
104class DeclContext;
105class EnumDecl;
106class Expr;
107class ExtQualsTypeCommonBase;
108class FunctionDecl;
109class IdentifierInfo;
110class NamedDecl;
111class ObjCInterfaceDecl;
112class ObjCProtocolDecl;
113class ObjCTypeParamDecl;
114struct PrintingPolicy;
115class RecordDecl;
116class Stmt;
117class TagDecl;
118class TemplateArgument;
119class TemplateArgumentListInfo;
120class TemplateArgumentLoc;
121class TemplateTypeParmDecl;
122class TypedefNameDecl;
123class UnresolvedUsingTypenameDecl;
124
125using CanQualType = CanQual<Type>;
126
127// Provide forward declarations for all of the *Type classes.
128#define TYPE(Class, Base) class Class##Type;
129#include "clang/AST/TypeNodes.inc"
130
131/// The collection of all-type qualifiers we support.
132/// Clang supports five independent qualifiers:
133/// * C99: const, volatile, and restrict
134/// * MS: __unaligned
135/// * Embedded C (TR18037): address spaces
136/// * Objective C: the GC attributes (none, weak, or strong)
137class Qualifiers {
138public:
139 enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ.
140 Const = 0x1,
141 Restrict = 0x2,
142 Volatile = 0x4,
143 CVRMask = Const | Volatile | Restrict
144 };
145
146 enum GC {
147 GCNone = 0,
148 Weak,
149 Strong
150 };
151
152 enum ObjCLifetime {
153 /// There is no lifetime qualification on this type.
154 OCL_None,
155
156 /// This object can be modified without requiring retains or
157 /// releases.
158 OCL_ExplicitNone,
159
160 /// Assigning into this object requires the old value to be
161 /// released and the new value to be retained. The timing of the
162 /// release of the old value is inexact: it may be moved to
163 /// immediately after the last known point where the value is
164 /// live.
165 OCL_Strong,
166
167 /// Reading or writing from this object requires a barrier call.
168 OCL_Weak,
169
170 /// Assigning into this object requires a lifetime extension.
171 OCL_Autoreleasing
172 };
173
174 enum {
175 /// The maximum supported address space number.
176 /// 23 bits should be enough for anyone.
177 MaxAddressSpace = 0x7fffffu,
178
179 /// The width of the "fast" qualifier mask.
180 FastWidth = 3,
181
182 /// The fast qualifier mask.
183 FastMask = (1 << FastWidth) - 1
184 };
185
186 /// Returns the common set of qualifiers while removing them from
187 /// the given sets.
188 static Qualifiers removeCommonQualifiers(Qualifiers &L, Qualifiers &R) {
189 // If both are only CVR-qualified, bit operations are sufficient.
190 if (!(L.Mask & ~CVRMask) && !(R.Mask & ~CVRMask)) {
191 Qualifiers Q;
192 Q.Mask = L.Mask & R.Mask;
193 L.Mask &= ~Q.Mask;
194 R.Mask &= ~Q.Mask;
195 return Q;
196 }
197
198 Qualifiers Q;
199 unsigned CommonCRV = L.getCVRQualifiers() & R.getCVRQualifiers();
200 Q.addCVRQualifiers(CommonCRV);
201 L.removeCVRQualifiers(CommonCRV);
202 R.removeCVRQualifiers(CommonCRV);
203
204 if (L.getObjCGCAttr() == R.getObjCGCAttr()) {
205 Q.setObjCGCAttr(L.getObjCGCAttr());
206 L.removeObjCGCAttr();
207 R.removeObjCGCAttr();
208 }
209
210 if (L.getObjCLifetime() == R.getObjCLifetime()) {
211 Q.setObjCLifetime(L.getObjCLifetime());
212 L.removeObjCLifetime();
213 R.removeObjCLifetime();
214 }
215
216 if (L.getAddressSpace() == R.getAddressSpace()) {
217 Q.setAddressSpace(L.getAddressSpace());
218 L.removeAddressSpace();
219 R.removeAddressSpace();
220 }
221 return Q;
222 }
223
224 static Qualifiers fromFastMask(unsigned Mask) {
225 Qualifiers Qs;
226 Qs.addFastQualifiers(Mask);
227 return Qs;
228 }
229
230 static Qualifiers fromCVRMask(unsigned CVR) {
231 Qualifiers Qs;
232 Qs.addCVRQualifiers(CVR);
233 return Qs;
234 }
235
236 static Qualifiers fromCVRUMask(unsigned CVRU) {
237 Qualifiers Qs;
238 Qs.addCVRUQualifiers(CVRU);
239 return Qs;
240 }
241
242 // Deserialize qualifiers from an opaque representation.
243 static Qualifiers fromOpaqueValue(unsigned opaque) {
244 Qualifiers Qs;
245 Qs.Mask = opaque;
246 return Qs;
247 }
248
249 // Serialize these qualifiers into an opaque representation.
250 unsigned getAsOpaqueValue() const {
251 return Mask;
252 }
253
254 bool hasConst() const { return Mask & Const; }
255 bool hasOnlyConst() const { return Mask == Const; }
256 void removeConst() { Mask &= ~Const; }
257 void addConst() { Mask |= Const; }
258
259 bool hasVolatile() const { return Mask & Volatile; }
260 bool hasOnlyVolatile() const { return Mask == Volatile; }
261 void removeVolatile() { Mask &= ~Volatile; }
262 void addVolatile() { Mask |= Volatile; }
263
264 bool hasRestrict() const { return Mask & Restrict; }
265 bool hasOnlyRestrict() const { return Mask == Restrict; }
266 void removeRestrict() { Mask &= ~Restrict; }
267 void addRestrict() { Mask |= Restrict; }
268
269 bool hasCVRQualifiers() const { return getCVRQualifiers(); }
270 unsigned getCVRQualifiers() const { return Mask & CVRMask; }
271 unsigned getCVRUQualifiers() const { return Mask & (CVRMask | UMask); }
272
273 void setCVRQualifiers(unsigned mask) {
274 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 274, __PRETTY_FUNCTION__))
;
275 Mask = (Mask & ~CVRMask) | mask;
276 }
277 void removeCVRQualifiers(unsigned mask) {
278 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 278, __PRETTY_FUNCTION__))
;
279 Mask &= ~mask;
280 }
281 void removeCVRQualifiers() {
282 removeCVRQualifiers(CVRMask);
283 }
284 void addCVRQualifiers(unsigned mask) {
285 assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits")((!(mask & ~CVRMask) && "bitmask contains non-CVR bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask) && \"bitmask contains non-CVR bits\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 285, __PRETTY_FUNCTION__))
;
286 Mask |= mask;
287 }
288 void addCVRUQualifiers(unsigned mask) {
289 assert(!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits")((!(mask & ~CVRMask & ~UMask) && "bitmask contains non-CVRU bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~CVRMask & ~UMask) && \"bitmask contains non-CVRU bits\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 289, __PRETTY_FUNCTION__))
;
290 Mask |= mask;
291 }
292
293 bool hasUnaligned() const { return Mask & UMask; }
294 void setUnaligned(bool flag) {
295 Mask = (Mask & ~UMask) | (flag ? UMask : 0);
296 }
297 void removeUnaligned() { Mask &= ~UMask; }
298 void addUnaligned() { Mask |= UMask; }
299
300 bool hasObjCGCAttr() const { return Mask & GCAttrMask; }
301 GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); }
302 void setObjCGCAttr(GC type) {
303 Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift);
304 }
305 void removeObjCGCAttr() { setObjCGCAttr(GCNone); }
306 void addObjCGCAttr(GC type) {
307 assert(type)((type) ? static_cast<void> (0) : __assert_fail ("type"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 307, __PRETTY_FUNCTION__))
;
308 setObjCGCAttr(type);
309 }
310 Qualifiers withoutObjCGCAttr() const {
311 Qualifiers qs = *this;
312 qs.removeObjCGCAttr();
313 return qs;
314 }
315 Qualifiers withoutObjCLifetime() const {
316 Qualifiers qs = *this;
317 qs.removeObjCLifetime();
318 return qs;
319 }
320 Qualifiers withoutAddressSpace() const {
321 Qualifiers qs = *this;
322 qs.removeAddressSpace();
323 return qs;
324 }
325
326 bool hasObjCLifetime() const { return Mask & LifetimeMask; }
327 ObjCLifetime getObjCLifetime() const {
328 return ObjCLifetime((Mask & LifetimeMask) >> LifetimeShift);
329 }
330 void setObjCLifetime(ObjCLifetime type) {
331 Mask = (Mask & ~LifetimeMask) | (type << LifetimeShift);
332 }
333 void removeObjCLifetime() { setObjCLifetime(OCL_None); }
334 void addObjCLifetime(ObjCLifetime type) {
335 assert(type)((type) ? static_cast<void> (0) : __assert_fail ("type"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 335, __PRETTY_FUNCTION__))
;
336 assert(!hasObjCLifetime())((!hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail
("!hasObjCLifetime()", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 336, __PRETTY_FUNCTION__))
;
337 Mask |= (type << LifetimeShift);
338 }
339
340 /// True if the lifetime is neither None or ExplicitNone.
341 bool hasNonTrivialObjCLifetime() const {
342 ObjCLifetime lifetime = getObjCLifetime();
343 return (lifetime > OCL_ExplicitNone);
344 }
345
346 /// True if the lifetime is either strong or weak.
347 bool hasStrongOrWeakObjCLifetime() const {
348 ObjCLifetime lifetime = getObjCLifetime();
349 return (lifetime == OCL_Strong || lifetime == OCL_Weak);
350 }
351
352 bool hasAddressSpace() const { return Mask & AddressSpaceMask; }
353 LangAS getAddressSpace() const {
354 return static_cast<LangAS>(Mask >> AddressSpaceShift);
355 }
356 bool hasTargetSpecificAddressSpace() const {
357 return isTargetAddressSpace(getAddressSpace());
358 }
359 /// Get the address space attribute value to be printed by diagnostics.
360 unsigned getAddressSpaceAttributePrintValue() const {
361 auto Addr = getAddressSpace();
362 // This function is not supposed to be used with language specific
363 // address spaces. If that happens, the diagnostic message should consider
364 // printing the QualType instead of the address space value.
365 assert(Addr == LangAS::Default || hasTargetSpecificAddressSpace())((Addr == LangAS::Default || hasTargetSpecificAddressSpace())
? static_cast<void> (0) : __assert_fail ("Addr == LangAS::Default || hasTargetSpecificAddressSpace()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 365, __PRETTY_FUNCTION__))
;
366 if (Addr != LangAS::Default)
367 return toTargetAddressSpace(Addr);
368 // TODO: The diagnostic messages where Addr may be 0 should be fixed
369 // since it cannot differentiate the situation where 0 denotes the default
370 // address space or user specified __attribute__((address_space(0))).
371 return 0;
372 }
373 void setAddressSpace(LangAS space) {
374 assert((unsigned)space <= MaxAddressSpace)(((unsigned)space <= MaxAddressSpace) ? static_cast<void
> (0) : __assert_fail ("(unsigned)space <= MaxAddressSpace"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 374, __PRETTY_FUNCTION__))
;
375 Mask = (Mask & ~AddressSpaceMask)
376 | (((uint32_t) space) << AddressSpaceShift);
377 }
378 void removeAddressSpace() { setAddressSpace(LangAS::Default); }
379 void addAddressSpace(LangAS space) {
380 assert(space != LangAS::Default)((space != LangAS::Default) ? static_cast<void> (0) : __assert_fail
("space != LangAS::Default", "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 380, __PRETTY_FUNCTION__))
;
381 setAddressSpace(space);
382 }
383
384 // Fast qualifiers are those that can be allocated directly
385 // on a QualType object.
386 bool hasFastQualifiers() const { return getFastQualifiers(); }
387 unsigned getFastQualifiers() const { return Mask & FastMask; }
388 void setFastQualifiers(unsigned mask) {
389 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 389, __PRETTY_FUNCTION__))
;
390 Mask = (Mask & ~FastMask) | mask;
391 }
392 void removeFastQualifiers(unsigned mask) {
393 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 393, __PRETTY_FUNCTION__))
;
394 Mask &= ~mask;
395 }
396 void removeFastQualifiers() {
397 removeFastQualifiers(FastMask);
398 }
399 void addFastQualifiers(unsigned mask) {
400 assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits")((!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"
) ? static_cast<void> (0) : __assert_fail ("!(mask & ~FastMask) && \"bitmask contains non-fast qualifier bits\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 400, __PRETTY_FUNCTION__))
;
401 Mask |= mask;
402 }
403
404 /// Return true if the set contains any qualifiers which require an ExtQuals
405 /// node to be allocated.
406 bool hasNonFastQualifiers() const { return Mask & ~FastMask; }
407 Qualifiers getNonFastQualifiers() const {
408 Qualifiers Quals = *this;
409 Quals.setFastQualifiers(0);
410 return Quals;
411 }
412
413 /// Return true if the set contains any qualifiers.
414 bool hasQualifiers() const { return Mask; }
415 bool empty() const { return !Mask; }
416
417 /// Add the qualifiers from the given set to this set.
418 void addQualifiers(Qualifiers Q) {
419 // If the other set doesn't have any non-boolean qualifiers, just
420 // bit-or it in.
421 if (!(Q.Mask & ~CVRMask))
422 Mask |= Q.Mask;
423 else {
424 Mask |= (Q.Mask & CVRMask);
425 if (Q.hasAddressSpace())
426 addAddressSpace(Q.getAddressSpace());
427 if (Q.hasObjCGCAttr())
428 addObjCGCAttr(Q.getObjCGCAttr());
429 if (Q.hasObjCLifetime())
430 addObjCLifetime(Q.getObjCLifetime());
431 }
432 }
433
434 /// Remove the qualifiers from the given set from this set.
435 void removeQualifiers(Qualifiers Q) {
436 // If the other set doesn't have any non-boolean qualifiers, just
437 // bit-and the inverse in.
438 if (!(Q.Mask & ~CVRMask))
439 Mask &= ~Q.Mask;
440 else {
441 Mask &= ~(Q.Mask & CVRMask);
442 if (getObjCGCAttr() == Q.getObjCGCAttr())
443 removeObjCGCAttr();
444 if (getObjCLifetime() == Q.getObjCLifetime())
445 removeObjCLifetime();
446 if (getAddressSpace() == Q.getAddressSpace())
447 removeAddressSpace();
448 }
449 }
450
451 /// Add the qualifiers from the given set to this set, given that
452 /// they don't conflict.
453 void addConsistentQualifiers(Qualifiers qs) {
454 assert(getAddressSpace() == qs.getAddressSpace() ||((getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace
() || !qs.hasAddressSpace()) ? static_cast<void> (0) : __assert_fail
("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 455, __PRETTY_FUNCTION__))
455 !hasAddressSpace() || !qs.hasAddressSpace())((getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace
() || !qs.hasAddressSpace()) ? static_cast<void> (0) : __assert_fail
("getAddressSpace() == qs.getAddressSpace() || !hasAddressSpace() || !qs.hasAddressSpace()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 455, __PRETTY_FUNCTION__))
;
456 assert(getObjCGCAttr() == qs.getObjCGCAttr() ||((getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() ||
!qs.hasObjCGCAttr()) ? static_cast<void> (0) : __assert_fail
("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 457, __PRETTY_FUNCTION__))
457 !hasObjCGCAttr() || !qs.hasObjCGCAttr())((getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() ||
!qs.hasObjCGCAttr()) ? static_cast<void> (0) : __assert_fail
("getObjCGCAttr() == qs.getObjCGCAttr() || !hasObjCGCAttr() || !qs.hasObjCGCAttr()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 457, __PRETTY_FUNCTION__))
;
458 assert(getObjCLifetime() == qs.getObjCLifetime() ||((getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime
() || !qs.hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail
("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 459, __PRETTY_FUNCTION__))
459 !hasObjCLifetime() || !qs.hasObjCLifetime())((getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime
() || !qs.hasObjCLifetime()) ? static_cast<void> (0) : __assert_fail
("getObjCLifetime() == qs.getObjCLifetime() || !hasObjCLifetime() || !qs.hasObjCLifetime()"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 459, __PRETTY_FUNCTION__))
;
460 Mask |= qs.Mask;
461 }
462
463 /// Returns true if address space A is equal to or a superset of B.
464 /// OpenCL v2.0 defines conversion rules (OpenCLC v2.0 s6.5.5) and notion of
465 /// overlapping address spaces.
466 /// CL1.1 or CL1.2:
467 /// every address space is a superset of itself.
468 /// CL2.0 adds:
469 /// __generic is a superset of any address space except for __constant.
470 static bool isAddressSpaceSupersetOf(LangAS A, LangAS B) {
471 // Address spaces must match exactly.
472 return A == B ||
473 // Otherwise in OpenCLC v2.0 s6.5.5: every address space except
474 // for __constant can be used as __generic.
475 (A == LangAS::opencl_generic && B != LangAS::opencl_constant);
476 }
477
478 /// Returns true if the address space in these qualifiers is equal to or
479 /// a superset of the address space in the argument qualifiers.
480 bool isAddressSpaceSupersetOf(Qualifiers other) const {
481 return isAddressSpaceSupersetOf(getAddressSpace(), other.getAddressSpace());
482 }
483
484 /// Determines if these qualifiers compatibly include another set.
485 /// Generally this answers the question of whether an object with the other
486 /// qualifiers can be safely used as an object with these qualifiers.
487 bool compatiblyIncludes(Qualifiers other) const {
488 return isAddressSpaceSupersetOf(other) &&
489 // ObjC GC qualifiers can match, be added, or be removed, but can't
490 // be changed.
491 (getObjCGCAttr() == other.getObjCGCAttr() || !hasObjCGCAttr() ||
492 !other.hasObjCGCAttr()) &&
493 // ObjC lifetime qualifiers must match exactly.
494 getObjCLifetime() == other.getObjCLifetime() &&
495 // CVR qualifiers may subset.
496 (((Mask & CVRMask) | (other.Mask & CVRMask)) == (Mask & CVRMask)) &&
497 // U qualifier may superset.
498 (!other.hasUnaligned() || hasUnaligned());
499 }
500
501 /// Determines if these qualifiers compatibly include another set of
502 /// qualifiers from the narrow perspective of Objective-C ARC lifetime.
503 ///
504 /// One set of Objective-C lifetime qualifiers compatibly includes the other
505 /// if the lifetime qualifiers match, or if both are non-__weak and the
506 /// including set also contains the 'const' qualifier, or both are non-__weak
507 /// and one is None (which can only happen in non-ARC modes).
508 bool compatiblyIncludesObjCLifetime(Qualifiers other) const {
509 if (getObjCLifetime() == other.getObjCLifetime())
510 return true;
511
512 if (getObjCLifetime() == OCL_Weak || other.getObjCLifetime() == OCL_Weak)
513 return false;
514
515 if (getObjCLifetime() == OCL_None || other.getObjCLifetime() == OCL_None)
516 return true;
517
518 return hasConst();
519 }
520
521 /// Determine whether this set of qualifiers is a strict superset of
522 /// another set of qualifiers, not considering qualifier compatibility.
523 bool isStrictSupersetOf(Qualifiers Other) const;
524
525 bool operator==(Qualifiers Other) const { return Mask == Other.Mask; }
526 bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; }
527
528 explicit operator bool() const { return hasQualifiers(); }
529
530 Qualifiers &operator+=(Qualifiers R) {
531 addQualifiers(R);
532 return *this;
533 }
534
535 // Union two qualifier sets. If an enumerated qualifier appears
536 // in both sets, use the one from the right.
537 friend Qualifiers operator+(Qualifiers L, Qualifiers R) {
538 L += R;
539 return L;
540 }
541
542 Qualifiers &operator-=(Qualifiers R) {
543 removeQualifiers(R);
544 return *this;
545 }
546
547 /// Compute the difference between two qualifier sets.
548 friend Qualifiers operator-(Qualifiers L, Qualifiers R) {
549 L -= R;
550 return L;
551 }
552
553 std::string getAsString() const;
554 std::string getAsString(const PrintingPolicy &Policy) const;
555
556 bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const;
557 void print(raw_ostream &OS, const PrintingPolicy &Policy,
558 bool appendSpaceIfNonEmpty = false) const;
559
560 void Profile(llvm::FoldingSetNodeID &ID) const {
561 ID.AddInteger(Mask);
562 }
563
564private:
565 // bits: |0 1 2|3|4 .. 5|6 .. 8|9 ... 31|
566 // |C R V|U|GCAttr|Lifetime|AddressSpace|
567 uint32_t Mask = 0;
568
569 static const uint32_t UMask = 0x8;
570 static const uint32_t UShift = 3;
571 static const uint32_t GCAttrMask = 0x30;
572 static const uint32_t GCAttrShift = 4;
573 static const uint32_t LifetimeMask = 0x1C0;
574 static const uint32_t LifetimeShift = 6;
575 static const uint32_t AddressSpaceMask =
576 ~(CVRMask | UMask | GCAttrMask | LifetimeMask);
577 static const uint32_t AddressSpaceShift = 9;
578};
579
580/// A std::pair-like structure for storing a qualified type split
581/// into its local qualifiers and its locally-unqualified type.
582struct SplitQualType {
583 /// The locally-unqualified type.
584 const Type *Ty = nullptr;
585
586 /// The local qualifiers.
587 Qualifiers Quals;
588
589 SplitQualType() = default;
590 SplitQualType(const Type *ty, Qualifiers qs) : Ty(ty), Quals(qs) {}
591
592 SplitQualType getSingleStepDesugaredType() const; // end of this file
593
594 // Make std::tie work.
595 std::pair<const Type *,Qualifiers> asPair() const {
596 return std::pair<const Type *, Qualifiers>(Ty, Quals);
597 }
598
599 friend bool operator==(SplitQualType a, SplitQualType b) {
600 return a.Ty == b.Ty && a.Quals == b.Quals;
601 }
602 friend bool operator!=(SplitQualType a, SplitQualType b) {
603 return a.Ty != b.Ty || a.Quals != b.Quals;
604 }
605};
606
607/// The kind of type we are substituting Objective-C type arguments into.
608///
609/// The kind of substitution affects the replacement of type parameters when
610/// no concrete type information is provided, e.g., when dealing with an
611/// unspecialized type.
612enum class ObjCSubstitutionContext {
613 /// An ordinary type.
614 Ordinary,
615
616 /// The result type of a method or function.
617 Result,
618
619 /// The parameter type of a method or function.
620 Parameter,
621
622 /// The type of a property.
623 Property,
624
625 /// The superclass of a type.
626 Superclass,
627};
628
629/// A (possibly-)qualified type.
630///
631/// For efficiency, we don't store CV-qualified types as nodes on their
632/// own: instead each reference to a type stores the qualifiers. This
633/// greatly reduces the number of nodes we need to allocate for types (for
634/// example we only need one for 'int', 'const int', 'volatile int',
635/// 'const volatile int', etc).
636///
637/// As an added efficiency bonus, instead of making this a pair, we
638/// just store the two bits we care about in the low bits of the
639/// pointer. To handle the packing/unpacking, we make QualType be a
640/// simple wrapper class that acts like a smart pointer. A third bit
641/// indicates whether there are extended qualifiers present, in which
642/// case the pointer points to a special structure.
643class QualType {
644 friend class QualifierCollector;
645
646 // Thankfully, these are efficiently composable.
647 llvm::PointerIntPair<llvm::PointerUnion<const Type *, const ExtQuals *>,
648 Qualifiers::FastWidth> Value;
649
650 const ExtQuals *getExtQualsUnsafe() const {
651 return Value.getPointer().get<const ExtQuals*>();
652 }
653
654 const Type *getTypePtrUnsafe() const {
655 return Value.getPointer().get<const Type*>();
656 }
657
658 const ExtQualsTypeCommonBase *getCommonPtr() const {
659 assert(!isNull() && "Cannot retrieve a NULL type pointer")((!isNull() && "Cannot retrieve a NULL type pointer")
? static_cast<void> (0) : __assert_fail ("!isNull() && \"Cannot retrieve a NULL type pointer\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 659, __PRETTY_FUNCTION__))
;
660 auto CommonPtrVal = reinterpret_cast<uintptr_t>(Value.getOpaqueValue());
661 CommonPtrVal &= ~(uintptr_t)((1 << TypeAlignmentInBits) - 1);
662 return reinterpret_cast<ExtQualsTypeCommonBase*>(CommonPtrVal);
663 }
664
665public:
666 QualType() = default;
667 QualType(const Type *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
668 QualType(const ExtQuals *Ptr, unsigned Quals) : Value(Ptr, Quals) {}
669
670 unsigned getLocalFastQualifiers() const { return Value.getInt(); }
671 void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); }
672
673 /// Retrieves a pointer to the underlying (unqualified) type.
674 ///
675 /// This function requires that the type not be NULL. If the type might be
676 /// NULL, use the (slightly less efficient) \c getTypePtrOrNull().
677 const Type *getTypePtr() const;
678
679 const Type *getTypePtrOrNull() const;
680
681 /// Retrieves a pointer to the name of the base type.
682 const IdentifierInfo *getBaseTypeIdentifier() const;
683
684 /// Divides a QualType into its unqualified type and a set of local
685 /// qualifiers.
686 SplitQualType split() const;
687
688 void *getAsOpaquePtr() const { return Value.getOpaqueValue(); }
689
690 static QualType getFromOpaquePtr(const void *Ptr) {
691 QualType T;
692 T.Value.setFromOpaqueValue(const_cast<void*>(Ptr));
693 return T;
694 }
695
696 const Type &operator*() const {
697 return *getTypePtr();
698 }
699
700 const Type *operator->() const {
701 return getTypePtr();
702 }
703
704 bool isCanonical() const;
705 bool isCanonicalAsParam() const;
706
707 /// Return true if this QualType doesn't point to a type yet.
708 bool isNull() const {
709 return Value.getPointer().isNull();
710 }
711
712 /// Determine whether this particular QualType instance has the
713 /// "const" qualifier set, without looking through typedefs that may have
714 /// added "const" at a different level.
715 bool isLocalConstQualified() const {
716 return (getLocalFastQualifiers() & Qualifiers::Const);
717 }
718
719 /// Determine whether this type is const-qualified.
720 bool isConstQualified() const;
721
722 /// Determine whether this particular QualType instance has the
723 /// "restrict" qualifier set, without looking through typedefs that may have
724 /// added "restrict" at a different level.
725 bool isLocalRestrictQualified() const {
726 return (getLocalFastQualifiers() & Qualifiers::Restrict);
727 }
728
729 /// Determine whether this type is restrict-qualified.
730 bool isRestrictQualified() const;
731
732 /// Determine whether this particular QualType instance has the
733 /// "volatile" qualifier set, without looking through typedefs that may have
734 /// added "volatile" at a different level.
735 bool isLocalVolatileQualified() const {
736 return (getLocalFastQualifiers() & Qualifiers::Volatile);
737 }
738
739 /// Determine whether this type is volatile-qualified.
740 bool isVolatileQualified() const;
741
742 /// Determine whether this particular QualType instance has any
743 /// qualifiers, without looking through any typedefs that might add
744 /// qualifiers at a different level.
745 bool hasLocalQualifiers() const {
746 return getLocalFastQualifiers() || hasLocalNonFastQualifiers();
747 }
748
749 /// Determine whether this type has any qualifiers.
750 bool hasQualifiers() const;
751
752 /// Determine whether this particular QualType instance has any
753 /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType
754 /// instance.
755 bool hasLocalNonFastQualifiers() const {
756 return Value.getPointer().is<const ExtQuals*>();
757 }
758
759 /// Retrieve the set of qualifiers local to this particular QualType
760 /// instance, not including any qualifiers acquired through typedefs or
761 /// other sugar.
762 Qualifiers getLocalQualifiers() const;
763
764 /// Retrieve the set of qualifiers applied to this type.
765 Qualifiers getQualifiers() const;
766
767 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
768 /// local to this particular QualType instance, not including any qualifiers
769 /// acquired through typedefs or other sugar.
770 unsigned getLocalCVRQualifiers() const {
771 return getLocalFastQualifiers();
772 }
773
774 /// Retrieve the set of CVR (const-volatile-restrict) qualifiers
775 /// applied to this type.
776 unsigned getCVRQualifiers() const;
777
778 bool isConstant(const ASTContext& Ctx) const {
779 return QualType::isConstant(*this, Ctx);
780 }
781
782 /// Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
783 bool isPODType(const ASTContext &Context) const;
784
785 /// Return true if this is a POD type according to the rules of the C++98
786 /// standard, regardless of the current compilation's language.
787 bool isCXX98PODType(const ASTContext &Context) const;
788
789 /// Return true if this is a POD type according to the more relaxed rules
790 /// of the C++11 standard, regardless of the current compilation's language.
791 /// (C++0x [basic.types]p9). Note that, unlike
792 /// CXXRecordDecl::isCXX11StandardLayout, this takes DRs into account.
793 bool isCXX11PODType(const ASTContext &Context) const;
794
795 /// Return true if this is a trivial type per (C++0x [basic.types]p9)
796 bool isTrivialType(const ASTContext &Context) const;
797
798 /// Return true if this is a trivially copyable type (C++0x [basic.types]p9)
799 bool isTriviallyCopyableType(const ASTContext &Context) const;
800
801
802 /// Returns true if it is a class and it might be dynamic.
803 bool mayBeDynamicClass() const;
804
805 /// Returns true if it is not a class or if the class might not be dynamic.
806 bool mayBeNotDynamicClass() const;
807
808 // Don't promise in the API that anything besides 'const' can be
809 // easily added.
810
811 /// Add the `const` type qualifier to this QualType.
812 void addConst() {
813 addFastQualifiers(Qualifiers::Const);
814 }
815 QualType withConst() const {
816 return withFastQualifiers(Qualifiers::Const);
817 }
818
819 /// Add the `volatile` type qualifier to this QualType.
820 void addVolatile() {
821 addFastQualifiers(Qualifiers::Volatile);
822 }
823 QualType withVolatile() const {
824 return withFastQualifiers(Qualifiers::Volatile);
825 }
826
827 /// Add the `restrict` qualifier to this QualType.
828 void addRestrict() {
829 addFastQualifiers(Qualifiers::Restrict);
830 }
831 QualType withRestrict() const {
832 return withFastQualifiers(Qualifiers::Restrict);
833 }
834
835 QualType withCVRQualifiers(unsigned CVR) const {
836 return withFastQualifiers(CVR);
837 }
838
839 void addFastQualifiers(unsigned TQs) {
840 assert(!(TQs & ~Qualifiers::FastMask)((!(TQs & ~Qualifiers::FastMask) && "non-fast qualifier bits set in mask!"
) ? static_cast<void> (0) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 841, __PRETTY_FUNCTION__))
841 && "non-fast qualifier bits set in mask!")((!(TQs & ~Qualifiers::FastMask) && "non-fast qualifier bits set in mask!"
) ? static_cast<void> (0) : __assert_fail ("!(TQs & ~Qualifiers::FastMask) && \"non-fast qualifier bits set in mask!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 841, __PRETTY_FUNCTION__))
;
842 Value.setInt(Value.getInt() | TQs);
843 }
844
845 void removeLocalConst();
846 void removeLocalVolatile();
847 void removeLocalRestrict();
848 void removeLocalCVRQualifiers(unsigned Mask);
849
850 void removeLocalFastQualifiers() { Value.setInt(0); }
851 void removeLocalFastQualifiers(unsigned Mask) {
852 assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers")((!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("!(Mask & ~Qualifiers::FastMask) && \"mask has non-fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 852, __PRETTY_FUNCTION__))
;
853 Value.setInt(Value.getInt() & ~Mask);
854 }
855
856 // Creates a type with the given qualifiers in addition to any
857 // qualifiers already on this type.
858 QualType withFastQualifiers(unsigned TQs) const {
859 QualType T = *this;
860 T.addFastQualifiers(TQs);
861 return T;
862 }
863
864 // Creates a type with exactly the given fast qualifiers, removing
865 // any existing fast qualifiers.
866 QualType withExactLocalFastQualifiers(unsigned TQs) const {
867 return withoutLocalFastQualifiers().withFastQualifiers(TQs);
868 }
869
870 // Removes fast qualifiers, but leaves any extended qualifiers in place.
871 QualType withoutLocalFastQualifiers() const {
872 QualType T = *this;
873 T.removeLocalFastQualifiers();
874 return T;
875 }
876
877 QualType getCanonicalType() const;
878
879 /// Return this type with all of the instance-specific qualifiers
880 /// removed, but without removing any qualifiers that may have been applied
881 /// through typedefs.
882 QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); }
883
884 /// Retrieve the unqualified variant of the given type,
885 /// removing as little sugar as possible.
886 ///
887 /// This routine looks through various kinds of sugar to find the
888 /// least-desugared type that is unqualified. For example, given:
889 ///
890 /// \code
891 /// typedef int Integer;
892 /// typedef const Integer CInteger;
893 /// typedef CInteger DifferenceType;
894 /// \endcode
895 ///
896 /// Executing \c getUnqualifiedType() on the type \c DifferenceType will
897 /// desugar until we hit the type \c Integer, which has no qualifiers on it.
898 ///
899 /// The resulting type might still be qualified if it's sugar for an array
900 /// type. To strip qualifiers even from within a sugared array type, use
901 /// ASTContext::getUnqualifiedArrayType.
902 inline QualType getUnqualifiedType() const;
903
904 /// Retrieve the unqualified variant of the given type, removing as little
905 /// sugar as possible.
906 ///
907 /// Like getUnqualifiedType(), but also returns the set of
908 /// qualifiers that were built up.
909 ///
910 /// The resulting type might still be qualified if it's sugar for an array
911 /// type. To strip qualifiers even from within a sugared array type, use
912 /// ASTContext::getUnqualifiedArrayType.
913 inline SplitQualType getSplitUnqualifiedType() const;
914
915 /// Determine whether this type is more qualified than the other
916 /// given type, requiring exact equality for non-CVR qualifiers.
917 bool isMoreQualifiedThan(QualType Other) const;
918
919 /// Determine whether this type is at least as qualified as the other
920 /// given type, requiring exact equality for non-CVR qualifiers.
921 bool isAtLeastAsQualifiedAs(QualType Other) const;
922
923 QualType getNonReferenceType() const;
924
925 /// Determine the type of a (typically non-lvalue) expression with the
926 /// specified result type.
927 ///
928 /// This routine should be used for expressions for which the return type is
929 /// explicitly specified (e.g., in a cast or call) and isn't necessarily
930 /// an lvalue. It removes a top-level reference (since there are no
931 /// expressions of reference type) and deletes top-level cvr-qualifiers
932 /// from non-class types (in C++) or all types (in C).
933 QualType getNonLValueExprType(const ASTContext &Context) const;
934
935 /// Return the specified type with any "sugar" removed from
936 /// the type. This takes off typedefs, typeof's etc. If the outer level of
937 /// the type is already concrete, it returns it unmodified. This is similar
938 /// to getting the canonical type, but it doesn't remove *all* typedefs. For
939 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
940 /// concrete.
941 ///
942 /// Qualifiers are left in place.
943 QualType getDesugaredType(const ASTContext &Context) const {
944 return getDesugaredType(*this, Context);
945 }
946
947 SplitQualType getSplitDesugaredType() const {
948 return getSplitDesugaredType(*this);
949 }
950
951 /// Return the specified type with one level of "sugar" removed from
952 /// the type.
953 ///
954 /// This routine takes off the first typedef, typeof, etc. If the outer level
955 /// of the type is already concrete, it returns it unmodified.
956 QualType getSingleStepDesugaredType(const ASTContext &Context) const {
957 return getSingleStepDesugaredTypeImpl(*this, Context);
958 }
959
960 /// Returns the specified type after dropping any
961 /// outer-level parentheses.
962 QualType IgnoreParens() const {
963 if (isa<ParenType>(*this))
964 return QualType::IgnoreParens(*this);
965 return *this;
966 }
967
968 /// Indicate whether the specified types and qualifiers are identical.
969 friend bool operator==(const QualType &LHS, const QualType &RHS) {
970 return LHS.Value == RHS.Value;
971 }
972 friend bool operator!=(const QualType &LHS, const QualType &RHS) {
973 return LHS.Value != RHS.Value;
974 }
975 friend bool operator<(const QualType &LHS, const QualType &RHS) {
976 return LHS.Value < RHS.Value;
977 }
978
979 static std::string getAsString(SplitQualType split,
980 const PrintingPolicy &Policy) {
981 return getAsString(split.Ty, split.Quals, Policy);
982 }
983 static std::string getAsString(const Type *ty, Qualifiers qs,
984 const PrintingPolicy &Policy);
985
986 std::string getAsString() const;
987 std::string getAsString(const PrintingPolicy &Policy) const;
988
989 void print(raw_ostream &OS, const PrintingPolicy &Policy,
990 const Twine &PlaceHolder = Twine(),
991 unsigned Indentation = 0) const;
992
993 static void print(SplitQualType split, raw_ostream &OS,
994 const PrintingPolicy &policy, const Twine &PlaceHolder,
995 unsigned Indentation = 0) {
996 return print(split.Ty, split.Quals, OS, policy, PlaceHolder, Indentation);
997 }
998
999 static void print(const Type *ty, Qualifiers qs,
1000 raw_ostream &OS, const PrintingPolicy &policy,
1001 const Twine &PlaceHolder,
1002 unsigned Indentation = 0);
1003
1004 void getAsStringInternal(std::string &Str,
1005 const PrintingPolicy &Policy) const;
1006
1007 static void getAsStringInternal(SplitQualType split, std::string &out,
1008 const PrintingPolicy &policy) {
1009 return getAsStringInternal(split.Ty, split.Quals, out, policy);
1010 }
1011
1012 static void getAsStringInternal(const Type *ty, Qualifiers qs,
1013 std::string &out,
1014 const PrintingPolicy &policy);
1015
1016 class StreamedQualTypeHelper {
1017 const QualType &T;
1018 const PrintingPolicy &Policy;
1019 const Twine &PlaceHolder;
1020 unsigned Indentation;
1021
1022 public:
1023 StreamedQualTypeHelper(const QualType &T, const PrintingPolicy &Policy,
1024 const Twine &PlaceHolder, unsigned Indentation)
1025 : T(T), Policy(Policy), PlaceHolder(PlaceHolder),
1026 Indentation(Indentation) {}
1027
1028 friend raw_ostream &operator<<(raw_ostream &OS,
1029 const StreamedQualTypeHelper &SQT) {
1030 SQT.T.print(OS, SQT.Policy, SQT.PlaceHolder, SQT.Indentation);
1031 return OS;
1032 }
1033 };
1034
1035 StreamedQualTypeHelper stream(const PrintingPolicy &Policy,
1036 const Twine &PlaceHolder = Twine(),
1037 unsigned Indentation = 0) const {
1038 return StreamedQualTypeHelper(*this, Policy, PlaceHolder, Indentation);
1039 }
1040
1041 void dump(const char *s) const;
1042 void dump() const;
1043 void dump(llvm::raw_ostream &OS) const;
1044
1045 void Profile(llvm::FoldingSetNodeID &ID) const {
1046 ID.AddPointer(getAsOpaquePtr());
1047 }
1048
1049 /// Return the address space of this type.
1050 inline LangAS getAddressSpace() const;
1051
1052 /// Returns gc attribute of this type.
1053 inline Qualifiers::GC getObjCGCAttr() const;
1054
1055 /// true when Type is objc's weak.
1056 bool isObjCGCWeak() const {
1057 return getObjCGCAttr() == Qualifiers::Weak;
1058 }
1059
1060 /// true when Type is objc's strong.
1061 bool isObjCGCStrong() const {
1062 return getObjCGCAttr() == Qualifiers::Strong;
1063 }
1064
1065 /// Returns lifetime attribute of this type.
1066 Qualifiers::ObjCLifetime getObjCLifetime() const {
1067 return getQualifiers().getObjCLifetime();
1068 }
1069
1070 bool hasNonTrivialObjCLifetime() const {
1071 return getQualifiers().hasNonTrivialObjCLifetime();
1072 }
1073
1074 bool hasStrongOrWeakObjCLifetime() const {
1075 return getQualifiers().hasStrongOrWeakObjCLifetime();
1076 }
1077
1078 // true when Type is objc's weak and weak is enabled but ARC isn't.
1079 bool isNonWeakInMRRWithObjCWeak(const ASTContext &Context) const;
1080
1081 enum PrimitiveDefaultInitializeKind {
1082 /// The type does not fall into any of the following categories. Note that
1083 /// this case is zero-valued so that values of this enum can be used as a
1084 /// boolean condition for non-triviality.
1085 PDIK_Trivial,
1086
1087 /// The type is an Objective-C retainable pointer type that is qualified
1088 /// with the ARC __strong qualifier.
1089 PDIK_ARCStrong,
1090
1091 /// The type is an Objective-C retainable pointer type that is qualified
1092 /// with the ARC __weak qualifier.
1093 PDIK_ARCWeak,
1094
1095 /// The type is a struct containing a field whose type is not PCK_Trivial.
1096 PDIK_Struct
1097 };
1098
1099 /// Functions to query basic properties of non-trivial C struct types.
1100
1101 /// Check if this is a non-trivial type that would cause a C struct
1102 /// transitively containing this type to be non-trivial to default initialize
1103 /// and return the kind.
1104 PrimitiveDefaultInitializeKind
1105 isNonTrivialToPrimitiveDefaultInitialize() const;
1106
1107 enum PrimitiveCopyKind {
1108 /// The type does not fall into any of the following categories. Note that
1109 /// this case is zero-valued so that values of this enum can be used as a
1110 /// boolean condition for non-triviality.
1111 PCK_Trivial,
1112
1113 /// The type would be trivial except that it is volatile-qualified. Types
1114 /// that fall into one of the other non-trivial cases may additionally be
1115 /// volatile-qualified.
1116 PCK_VolatileTrivial,
1117
1118 /// The type is an Objective-C retainable pointer type that is qualified
1119 /// with the ARC __strong qualifier.
1120 PCK_ARCStrong,
1121
1122 /// The type is an Objective-C retainable pointer type that is qualified
1123 /// with the ARC __weak qualifier.
1124 PCK_ARCWeak,
1125
1126 /// The type is a struct containing a field whose type is neither
1127 /// PCK_Trivial nor PCK_VolatileTrivial.
1128 /// Note that a C++ struct type does not necessarily match this; C++ copying
1129 /// semantics are too complex to express here, in part because they depend
1130 /// on the exact constructor or assignment operator that is chosen by
1131 /// overload resolution to do the copy.
1132 PCK_Struct
1133 };
1134
1135 /// Check if this is a non-trivial type that would cause a C struct
1136 /// transitively containing this type to be non-trivial to copy and return the
1137 /// kind.
1138 PrimitiveCopyKind isNonTrivialToPrimitiveCopy() const;
1139
1140 /// Check if this is a non-trivial type that would cause a C struct
1141 /// transitively containing this type to be non-trivial to destructively
1142 /// move and return the kind. Destructive move in this context is a C++-style
1143 /// move in which the source object is placed in a valid but unspecified state
1144 /// after it is moved, as opposed to a truly destructive move in which the
1145 /// source object is placed in an uninitialized state.
1146 PrimitiveCopyKind isNonTrivialToPrimitiveDestructiveMove() const;
1147
1148 enum DestructionKind {
1149 DK_none,
1150 DK_cxx_destructor,
1151 DK_objc_strong_lifetime,
1152 DK_objc_weak_lifetime,
1153 DK_nontrivial_c_struct
1154 };
1155
1156 /// Returns a nonzero value if objects of this type require
1157 /// non-trivial work to clean up after. Non-zero because it's
1158 /// conceivable that qualifiers (objc_gc(weak)?) could make
1159 /// something require destruction.
1160 DestructionKind isDestructedType() const {
1161 return isDestructedTypeImpl(*this);
1162 }
1163
1164 /// Check if this is or contains a C union that is non-trivial to
1165 /// default-initialize, which is a union that has a member that is non-trivial
1166 /// to default-initialize. If this returns true,
1167 /// isNonTrivialToPrimitiveDefaultInitialize returns PDIK_Struct.
1168 bool hasNonTrivialToPrimitiveDefaultInitializeCUnion() const;
1169
1170 /// Check if this is or contains a C union that is non-trivial to destruct,
1171 /// which is a union that has a member that is non-trivial to destruct. If
1172 /// this returns true, isDestructedType returns DK_nontrivial_c_struct.
1173 bool hasNonTrivialToPrimitiveDestructCUnion() const;
1174
1175 /// Check if this is or contains a C union that is non-trivial to copy, which
1176 /// is a union that has a member that is non-trivial to copy. If this returns
1177 /// true, isNonTrivialToPrimitiveCopy returns PCK_Struct.
1178 bool hasNonTrivialToPrimitiveCopyCUnion() const;
1179
1180 /// Determine whether expressions of the given type are forbidden
1181 /// from being lvalues in C.
1182 ///
1183 /// The expression types that are forbidden to be lvalues are:
1184 /// - 'void', but not qualified void
1185 /// - function types
1186 ///
1187 /// The exact rule here is C99 6.3.2.1:
1188 /// An lvalue is an expression with an object type or an incomplete
1189 /// type other than void.
1190 bool isCForbiddenLValueType() const;
1191
1192 /// Substitute type arguments for the Objective-C type parameters used in the
1193 /// subject type.
1194 ///
1195 /// \param ctx ASTContext in which the type exists.
1196 ///
1197 /// \param typeArgs The type arguments that will be substituted for the
1198 /// Objective-C type parameters in the subject type, which are generally
1199 /// computed via \c Type::getObjCSubstitutions. If empty, the type
1200 /// parameters will be replaced with their bounds or id/Class, as appropriate
1201 /// for the context.
1202 ///
1203 /// \param context The context in which the subject type was written.
1204 ///
1205 /// \returns the resulting type.
1206 QualType substObjCTypeArgs(ASTContext &ctx,
1207 ArrayRef<QualType> typeArgs,
1208 ObjCSubstitutionContext context) const;
1209
1210 /// Substitute type arguments from an object type for the Objective-C type
1211 /// parameters used in the subject type.
1212 ///
1213 /// This operation combines the computation of type arguments for
1214 /// substitution (\c Type::getObjCSubstitutions) with the actual process of
1215 /// substitution (\c QualType::substObjCTypeArgs) for the convenience of
1216 /// callers that need to perform a single substitution in isolation.
1217 ///
1218 /// \param objectType The type of the object whose member type we're
1219 /// substituting into. For example, this might be the receiver of a message
1220 /// or the base of a property access.
1221 ///
1222 /// \param dc The declaration context from which the subject type was
1223 /// retrieved, which indicates (for example) which type parameters should
1224 /// be substituted.
1225 ///
1226 /// \param context The context in which the subject type was written.
1227 ///
1228 /// \returns the subject type after replacing all of the Objective-C type
1229 /// parameters with their corresponding arguments.
1230 QualType substObjCMemberType(QualType objectType,
1231 const DeclContext *dc,
1232 ObjCSubstitutionContext context) const;
1233
1234 /// Strip Objective-C "__kindof" types from the given type.
1235 QualType stripObjCKindOfType(const ASTContext &ctx) const;
1236
1237 /// Remove all qualifiers including _Atomic.
1238 QualType getAtomicUnqualifiedType() const;
1239
1240private:
1241 // These methods are implemented in a separate translation unit;
1242 // "static"-ize them to avoid creating temporary QualTypes in the
1243 // caller.
1244 static bool isConstant(QualType T, const ASTContext& Ctx);
1245 static QualType getDesugaredType(QualType T, const ASTContext &Context);
1246 static SplitQualType getSplitDesugaredType(QualType T);
1247 static SplitQualType getSplitUnqualifiedTypeImpl(QualType type);
1248 static QualType getSingleStepDesugaredTypeImpl(QualType type,
1249 const ASTContext &C);
1250 static QualType IgnoreParens(QualType T);
1251 static DestructionKind isDestructedTypeImpl(QualType type);
1252
1253 /// Check if \param RD is or contains a non-trivial C union.
1254 static bool hasNonTrivialToPrimitiveDefaultInitializeCUnion(const RecordDecl *RD);
1255 static bool hasNonTrivialToPrimitiveDestructCUnion(const RecordDecl *RD);
1256 static bool hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD);
1257};
1258
1259} // namespace clang
1260
1261namespace llvm {
1262
1263/// Implement simplify_type for QualType, so that we can dyn_cast from QualType
1264/// to a specific Type class.
1265template<> struct simplify_type< ::clang::QualType> {
1266 using SimpleType = const ::clang::Type *;
1267
1268 static SimpleType getSimplifiedValue(::clang::QualType Val) {
1269 return Val.getTypePtr();
1270 }
1271};
1272
1273// Teach SmallPtrSet that QualType is "basically a pointer".
1274template<>
1275struct PointerLikeTypeTraits<clang::QualType> {
1276 static inline void *getAsVoidPointer(clang::QualType P) {
1277 return P.getAsOpaquePtr();
1278 }
1279
1280 static inline clang::QualType getFromVoidPointer(void *P) {
1281 return clang::QualType::getFromOpaquePtr(P);
1282 }
1283
1284 // Various qualifiers go in low bits.
1285 enum { NumLowBitsAvailable = 0 };
1286};
1287
1288} // namespace llvm
1289
1290namespace clang {
1291
1292/// Base class that is common to both the \c ExtQuals and \c Type
1293/// classes, which allows \c QualType to access the common fields between the
1294/// two.
1295class ExtQualsTypeCommonBase {
1296 friend class ExtQuals;
1297 friend class QualType;
1298 friend class Type;
1299
1300 /// The "base" type of an extended qualifiers type (\c ExtQuals) or
1301 /// a self-referential pointer (for \c Type).
1302 ///
1303 /// This pointer allows an efficient mapping from a QualType to its
1304 /// underlying type pointer.
1305 const Type *const BaseType;
1306
1307 /// The canonical type of this type. A QualType.
1308 QualType CanonicalType;
1309
1310 ExtQualsTypeCommonBase(const Type *baseType, QualType canon)
1311 : BaseType(baseType), CanonicalType(canon) {}
1312};
1313
1314/// We can encode up to four bits in the low bits of a
1315/// type pointer, but there are many more type qualifiers that we want
1316/// to be able to apply to an arbitrary type. Therefore we have this
1317/// struct, intended to be heap-allocated and used by QualType to
1318/// store qualifiers.
1319///
1320/// The current design tags the 'const', 'restrict', and 'volatile' qualifiers
1321/// in three low bits on the QualType pointer; a fourth bit records whether
1322/// the pointer is an ExtQuals node. The extended qualifiers (address spaces,
1323/// Objective-C GC attributes) are much more rare.
1324class ExtQuals : public ExtQualsTypeCommonBase, public llvm::FoldingSetNode {
1325 // NOTE: changing the fast qualifiers should be straightforward as
1326 // long as you don't make 'const' non-fast.
1327 // 1. Qualifiers:
1328 // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ).
1329 // Fast qualifiers must occupy the low-order bits.
1330 // b) Update Qualifiers::FastWidth and FastMask.
1331 // 2. QualType:
1332 // a) Update is{Volatile,Restrict}Qualified(), defined inline.
1333 // b) Update remove{Volatile,Restrict}, defined near the end of
1334 // this header.
1335 // 3. ASTContext:
1336 // a) Update get{Volatile,Restrict}Type.
1337
1338 /// The immutable set of qualifiers applied by this node. Always contains
1339 /// extended qualifiers.
1340 Qualifiers Quals;
1341
1342 ExtQuals *this_() { return this; }
1343
1344public:
1345 ExtQuals(const Type *baseType, QualType canon, Qualifiers quals)
1346 : ExtQualsTypeCommonBase(baseType,
1347 canon.isNull() ? QualType(this_(), 0) : canon),
1348 Quals(quals) {
1349 assert(Quals.hasNonFastQualifiers()((Quals.hasNonFastQualifiers() && "ExtQuals created with no fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 1350, __PRETTY_FUNCTION__))
1350 && "ExtQuals created with no fast qualifiers")((Quals.hasNonFastQualifiers() && "ExtQuals created with no fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("Quals.hasNonFastQualifiers() && \"ExtQuals created with no fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 1350, __PRETTY_FUNCTION__))
;
1351 assert(!Quals.hasFastQualifiers()((!Quals.hasFastQualifiers() && "ExtQuals created with fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 1352, __PRETTY_FUNCTION__))
1352 && "ExtQuals created with fast qualifiers")((!Quals.hasFastQualifiers() && "ExtQuals created with fast qualifiers"
) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"ExtQuals created with fast qualifiers\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 1352, __PRETTY_FUNCTION__))
;
1353 }
1354
1355 Qualifiers getQualifiers() const { return Quals; }
1356
1357 bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); }
1358 Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); }
1359
1360 bool hasObjCLifetime() const { return Quals.hasObjCLifetime(); }
1361 Qualifiers::ObjCLifetime getObjCLifetime() const {
1362 return Quals.getObjCLifetime();
1363 }
1364
1365 bool hasAddressSpace() const { return Quals.hasAddressSpace(); }
1366 LangAS getAddressSpace() const { return Quals.getAddressSpace(); }
1367
1368 const Type *getBaseType() const { return BaseType; }
1369
1370public:
1371 void Profile(llvm::FoldingSetNodeID &ID) const {
1372 Profile(ID, getBaseType(), Quals);
1373 }
1374
1375 static void Profile(llvm::FoldingSetNodeID &ID,
1376 const Type *BaseType,
1377 Qualifiers Quals) {
1378 assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!")((!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!"
) ? static_cast<void> (0) : __assert_fail ("!Quals.hasFastQualifiers() && \"fast qualifiers in ExtQuals hash!\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 1378, __PRETTY_FUNCTION__))
;
1379 ID.AddPointer(BaseType);
1380 Quals.Profile(ID);
1381 }
1382};
1383
1384/// The kind of C++11 ref-qualifier associated with a function type.
1385/// This determines whether a member function's "this" object can be an
1386/// lvalue, rvalue, or neither.
1387enum RefQualifierKind {
1388 /// No ref-qualifier was provided.
1389 RQ_None = 0,
1390
1391 /// An lvalue ref-qualifier was provided (\c &).
1392 RQ_LValue,
1393
1394 /// An rvalue ref-qualifier was provided (\c &&).
1395 RQ_RValue
1396};
1397
1398/// Which keyword(s) were used to create an AutoType.
1399enum class AutoTypeKeyword {
1400 /// auto
1401 Auto,
1402
1403 /// decltype(auto)
1404 DecltypeAuto,
1405
1406 /// __auto_type (GNU extension)
1407 GNUAutoType
1408};
1409
1410/// The base class of the type hierarchy.
1411///
1412/// A central concept with types is that each type always has a canonical
1413/// type. A canonical type is the type with any typedef names stripped out
1414/// of it or the types it references. For example, consider:
1415///
1416/// typedef int foo;
1417/// typedef foo* bar;
1418/// 'int *' 'foo *' 'bar'
1419///
1420/// There will be a Type object created for 'int'. Since int is canonical, its
1421/// CanonicalType pointer points to itself. There is also a Type for 'foo' (a
1422/// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next
1423/// there is a PointerType that represents 'int*', which, like 'int', is
1424/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical
1425/// type is 'int*', and there is a TypedefType for 'bar', whose canonical type
1426/// is also 'int*'.
1427///
1428/// Non-canonical types are useful for emitting diagnostics, without losing
1429/// information about typedefs being used. Canonical types are useful for type
1430/// comparisons (they allow by-pointer equality tests) and useful for reasoning
1431/// about whether something has a particular form (e.g. is a function type),
1432/// because they implicitly, recursively, strip all typedefs out of a type.
1433///
1434/// Types, once created, are immutable.
1435///
1436class alignas(8) Type : public ExtQualsTypeCommonBase {
1437public:
1438 enum TypeClass {
1439#define TYPE(Class, Base) Class,
1440#define LAST_TYPE(Class) TypeLast = Class
1441#define ABSTRACT_TYPE(Class, Base)
1442#include "clang/AST/TypeNodes.inc"
1443 };
1444
1445private:
1446 /// Bitfields required by the Type class.
1447 class TypeBitfields {
1448 friend class Type;
1449 template <class T> friend class TypePropertyCache;
1450
1451 /// TypeClass bitfield - Enum that specifies what subclass this belongs to.
1452 unsigned TC : 8;
1453
1454 /// Whether this type is a dependent type (C++ [temp.dep.type]).
1455 unsigned Dependent : 1;
1456
1457 /// Whether this type somehow involves a template parameter, even
1458 /// if the resolution of the type does not depend on a template parameter.
1459 unsigned InstantiationDependent : 1;
1460
1461 /// Whether this type is a variably-modified type (C99 6.7.5).
1462 unsigned VariablyModified : 1;
1463
1464 /// Whether this type contains an unexpanded parameter pack
1465 /// (for C++11 variadic templates).
1466 unsigned ContainsUnexpandedParameterPack : 1;
1467
1468 /// True if the cache (i.e. the bitfields here starting with
1469 /// 'Cache') is valid.
1470 mutable unsigned CacheValid : 1;
1471
1472 /// Linkage of this type.
1473 mutable unsigned CachedLinkage : 3;
1474
1475 /// Whether this type involves and local or unnamed types.
1476 mutable unsigned CachedLocalOrUnnamed : 1;
1477
1478 /// Whether this type comes from an AST file.
1479 mutable unsigned FromAST : 1;
1480
1481 bool isCacheValid() const {
1482 return CacheValid;
1483 }
1484
1485 Linkage getLinkage() const {
1486 assert(isCacheValid() && "getting linkage from invalid cache")((isCacheValid() && "getting linkage from invalid cache"
) ? static_cast<void> (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 1486, __PRETTY_FUNCTION__))
;
1487 return static_cast<Linkage>(CachedLinkage);
1488 }
1489
1490 bool hasLocalOrUnnamedType() const {
1491 assert(isCacheValid() && "getting linkage from invalid cache")((isCacheValid() && "getting linkage from invalid cache"
) ? static_cast<void> (0) : __assert_fail ("isCacheValid() && \"getting linkage from invalid cache\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 1491, __PRETTY_FUNCTION__))
;
1492 return CachedLocalOrUnnamed;
1493 }
1494 };
1495 enum { NumTypeBits = 18 };
1496
1497protected:
1498 // These classes allow subclasses to somewhat cleanly pack bitfields
1499 // into Type.
1500
1501 class ArrayTypeBitfields {
1502 friend class ArrayType;
1503
1504 unsigned : NumTypeBits;
1505
1506 /// CVR qualifiers from declarations like
1507 /// 'int X[static restrict 4]'. For function parameters only.
1508 unsigned IndexTypeQuals : 3;
1509
1510 /// Storage class qualifiers from declarations like
1511 /// 'int X[static restrict 4]'. For function parameters only.
1512 /// Actually an ArrayType::ArraySizeModifier.
1513 unsigned SizeModifier : 3;
1514 };
1515
1516 class ConstantArrayTypeBitfields {
1517 friend class ConstantArrayType;
1518
1519 unsigned : NumTypeBits + 3 + 3;
1520
1521 /// Whether we have a stored size expression.
1522 unsigned HasStoredSizeExpr : 1;
1523 };
1524
1525 class BuiltinTypeBitfields {
1526 friend class BuiltinType;
1527
1528 unsigned : NumTypeBits;
1529
1530 /// The kind (BuiltinType::Kind) of builtin type this is.
1531 unsigned Kind : 8;
1532 };
1533
1534 /// FunctionTypeBitfields store various bits belonging to FunctionProtoType.
1535 /// Only common bits are stored here. Additional uncommon bits are stored
1536 /// in a trailing object after FunctionProtoType.
1537 class FunctionTypeBitfields {
1538 friend class FunctionProtoType;
1539 friend class FunctionType;
1540
1541 unsigned : NumTypeBits;
1542
1543 /// Extra information which affects how the function is called, like
1544 /// regparm and the calling convention.
1545 unsigned ExtInfo : 12;
1546
1547 /// The ref-qualifier associated with a \c FunctionProtoType.
1548 ///
1549 /// This is a value of type \c RefQualifierKind.
1550 unsigned RefQualifier : 2;
1551
1552 /// Used only by FunctionProtoType, put here to pack with the
1553 /// other bitfields.
1554 /// The qualifiers are part of FunctionProtoType because...
1555 ///
1556 /// C++ 8.3.5p4: The return type, the parameter type list and the
1557 /// cv-qualifier-seq, [...], are part of the function type.
1558 unsigned FastTypeQuals : Qualifiers::FastWidth;
1559 /// Whether this function has extended Qualifiers.
1560 unsigned HasExtQuals : 1;
1561
1562 /// The number of parameters this function has, not counting '...'.
1563 /// According to [implimits] 8 bits should be enough here but this is
1564 /// somewhat easy to exceed with metaprogramming and so we would like to
1565 /// keep NumParams as wide as reasonably possible.
1566 unsigned NumParams : 16;
1567
1568 /// The type of exception specification this function has.
1569 unsigned ExceptionSpecType : 4;
1570
1571 /// Whether this function has extended parameter information.
1572 unsigned HasExtParameterInfos : 1;
1573
1574 /// Whether the function is variadic.
1575 unsigned Variadic : 1;
1576
1577 /// Whether this function has a trailing return type.
1578 unsigned HasTrailingReturn : 1;
1579 };
1580
1581 class ObjCObjectTypeBitfields {
1582 friend class ObjCObjectType;
1583
1584 unsigned : NumTypeBits;
1585
1586 /// The number of type arguments stored directly on this object type.
1587 unsigned NumTypeArgs : 7;
1588
1589 /// The number of protocols stored directly on this object type.
1590 unsigned NumProtocols : 6;
1591
1592 /// Whether this is a "kindof" type.
1593 unsigned IsKindOf : 1;
1594 };
1595
1596 class ReferenceTypeBitfields {
1597 friend class ReferenceType;
1598
1599 unsigned : NumTypeBits;
1600
1601 /// True if the type was originally spelled with an lvalue sigil.
1602 /// This is never true of rvalue references but can also be false
1603 /// on lvalue references because of C++0x [dcl.typedef]p9,
1604 /// as follows:
1605 ///
1606 /// typedef int &ref; // lvalue, spelled lvalue
1607 /// typedef int &&rvref; // rvalue
1608 /// ref &a; // lvalue, inner ref, spelled lvalue
1609 /// ref &&a; // lvalue, inner ref
1610 /// rvref &a; // lvalue, inner ref, spelled lvalue
1611 /// rvref &&a; // rvalue, inner ref
1612 unsigned SpelledAsLValue : 1;
1613
1614 /// True if the inner type is a reference type. This only happens
1615 /// in non-canonical forms.
1616 unsigned InnerRef : 1;
1617 };
1618
1619 class TypeWithKeywordBitfields {
1620 friend class TypeWithKeyword;
1621
1622 unsigned : NumTypeBits;
1623
1624 /// An ElaboratedTypeKeyword. 8 bits for efficient access.
1625 unsigned Keyword : 8;
1626 };
1627
1628 enum { NumTypeWithKeywordBits = 8 };
1629
1630 class ElaboratedTypeBitfields {
1631 friend class ElaboratedType;
1632
1633 unsigned : NumTypeBits;
1634 unsigned : NumTypeWithKeywordBits;
1635
1636 /// Whether the ElaboratedType has a trailing OwnedTagDecl.
1637 unsigned HasOwnedTagDecl : 1;
1638 };
1639
1640 class VectorTypeBitfields {
1641 friend class VectorType;
1642 friend class DependentVectorType;
1643
1644 unsigned : NumTypeBits;
1645
1646 /// The kind of vector, either a generic vector type or some
1647 /// target-specific vector type such as for AltiVec or Neon.
1648 unsigned VecKind : 3;
1649
1650 /// The number of elements in the vector.
1651 unsigned NumElements : 29 - NumTypeBits;
1652
1653 enum { MaxNumElements = (1 << (29 - NumTypeBits)) - 1 };
1654 };
1655
1656 class AttributedTypeBitfields {
1657 friend class AttributedType;
1658
1659 unsigned : NumTypeBits;
1660
1661 /// An AttributedType::Kind
1662 unsigned AttrKind : 32 - NumTypeBits;
1663 };
1664
1665 class AutoTypeBitfields {
1666 friend class AutoType;
1667
1668 unsigned : NumTypeBits;
1669
1670 /// Was this placeholder type spelled as 'auto', 'decltype(auto)',
1671 /// or '__auto_type'? AutoTypeKeyword value.
1672 unsigned Keyword : 2;
1673 };
1674
1675 class SubstTemplateTypeParmPackTypeBitfields {
1676 friend class SubstTemplateTypeParmPackType;
1677
1678 unsigned : NumTypeBits;
1679
1680 /// The number of template arguments in \c Arguments, which is
1681 /// expected to be able to hold at least 1024 according to [implimits].
1682 /// However as this limit is somewhat easy to hit with template
1683 /// metaprogramming we'd prefer to keep it as large as possible.
1684 /// At the moment it has been left as a non-bitfield since this type
1685 /// safely fits in 64 bits as an unsigned, so there is no reason to
1686 /// introduce the performance impact of a bitfield.
1687 unsigned NumArgs;
1688 };
1689
1690 class TemplateSpecializationTypeBitfields {
1691 friend class TemplateSpecializationType;
1692
1693 unsigned : NumTypeBits;
1694
1695 /// Whether this template specialization type is a substituted type alias.
1696 unsigned TypeAlias : 1;
1697
1698 /// The number of template arguments named in this class template
1699 /// specialization, which is expected to be able to hold at least 1024
1700 /// according to [implimits]. However, as this limit is somewhat easy to
1701 /// hit with template metaprogramming we'd prefer to keep it as large
1702 /// as possible. At the moment it has been left as a non-bitfield since
1703 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1704 /// to introduce the performance impact of a bitfield.
1705 unsigned NumArgs;
1706 };
1707
1708 class DependentTemplateSpecializationTypeBitfields {
1709 friend class DependentTemplateSpecializationType;
1710
1711 unsigned : NumTypeBits;
1712 unsigned : NumTypeWithKeywordBits;
1713
1714 /// The number of template arguments named in this class template
1715 /// specialization, which is expected to be able to hold at least 1024
1716 /// according to [implimits]. However, as this limit is somewhat easy to
1717 /// hit with template metaprogramming we'd prefer to keep it as large
1718 /// as possible. At the moment it has been left as a non-bitfield since
1719 /// this type safely fits in 64 bits as an unsigned, so there is no reason
1720 /// to introduce the performance impact of a bitfield.
1721 unsigned NumArgs;
1722 };
1723
1724 class PackExpansionTypeBitfields {
1725 friend class PackExpansionType;
1726
1727 unsigned : NumTypeBits;
1728
1729 /// The number of expansions that this pack expansion will
1730 /// generate when substituted (+1), which is expected to be able to
1731 /// hold at least 1024 according to [implimits]. However, as this limit
1732 /// is somewhat easy to hit with template metaprogramming we'd prefer to
1733 /// keep it as large as possible. At the moment it has been left as a
1734 /// non-bitfield since this type safely fits in 64 bits as an unsigned, so
1735 /// there is no reason to introduce the performance impact of a bitfield.
1736 ///
1737 /// This field will only have a non-zero value when some of the parameter
1738 /// packs that occur within the pattern have been substituted but others
1739 /// have not.
1740 unsigned NumExpansions;
1741 };
1742
1743 union {
1744 TypeBitfields TypeBits;
1745 ArrayTypeBitfields ArrayTypeBits;
1746 ConstantArrayTypeBitfields ConstantArrayTypeBits;
1747 AttributedTypeBitfields AttributedTypeBits;
1748 AutoTypeBitfields AutoTypeBits;
1749 BuiltinTypeBitfields BuiltinTypeBits;
1750 FunctionTypeBitfields FunctionTypeBits;
1751 ObjCObjectTypeBitfields ObjCObjectTypeBits;
1752 ReferenceTypeBitfields ReferenceTypeBits;
1753 TypeWithKeywordBitfields TypeWithKeywordBits;
1754 ElaboratedTypeBitfields ElaboratedTypeBits;
1755 VectorTypeBitfields VectorTypeBits;
1756 SubstTemplateTypeParmPackTypeBitfields SubstTemplateTypeParmPackTypeBits;
1757 TemplateSpecializationTypeBitfields TemplateSpecializationTypeBits;
1758 DependentTemplateSpecializationTypeBitfields
1759 DependentTemplateSpecializationTypeBits;
1760 PackExpansionTypeBitfields PackExpansionTypeBits;
1761
1762 static_assert(sizeof(TypeBitfields) <= 8,
1763 "TypeBitfields is larger than 8 bytes!");
1764 static_assert(sizeof(ArrayTypeBitfields) <= 8,
1765 "ArrayTypeBitfields is larger than 8 bytes!");
1766 static_assert(sizeof(AttributedTypeBitfields) <= 8,
1767 "AttributedTypeBitfields is larger than 8 bytes!");
1768 static_assert(sizeof(AutoTypeBitfields) <= 8,
1769 "AutoTypeBitfields is larger than 8 bytes!");
1770 static_assert(sizeof(BuiltinTypeBitfields) <= 8,
1771 "BuiltinTypeBitfields is larger than 8 bytes!");
1772 static_assert(sizeof(FunctionTypeBitfields) <= 8,
1773 "FunctionTypeBitfields is larger than 8 bytes!");
1774 static_assert(sizeof(ObjCObjectTypeBitfields) <= 8,
1775 "ObjCObjectTypeBitfields is larger than 8 bytes!");
1776 static_assert(sizeof(ReferenceTypeBitfields) <= 8,
1777 "ReferenceTypeBitfields is larger than 8 bytes!");
1778 static_assert(sizeof(TypeWithKeywordBitfields) <= 8,
1779 "TypeWithKeywordBitfields is larger than 8 bytes!");
1780 static_assert(sizeof(ElaboratedTypeBitfields) <= 8,
1781 "ElaboratedTypeBitfields is larger than 8 bytes!");
1782 static_assert(sizeof(VectorTypeBitfields) <= 8,
1783 "VectorTypeBitfields is larger than 8 bytes!");
1784 static_assert(sizeof(SubstTemplateTypeParmPackTypeBitfields) <= 8,
1785 "SubstTemplateTypeParmPackTypeBitfields is larger"
1786 " than 8 bytes!");
1787 static_assert(sizeof(TemplateSpecializationTypeBitfields) <= 8,
1788 "TemplateSpecializationTypeBitfields is larger"
1789 " than 8 bytes!");
1790 static_assert(sizeof(DependentTemplateSpecializationTypeBitfields) <= 8,
1791 "DependentTemplateSpecializationTypeBitfields is larger"
1792 " than 8 bytes!");
1793 static_assert(sizeof(PackExpansionTypeBitfields) <= 8,
1794 "PackExpansionTypeBitfields is larger than 8 bytes");
1795 };
1796
1797private:
1798 template <class T> friend class TypePropertyCache;
1799
1800 /// Set whether this type comes from an AST file.
1801 void setFromAST(bool V = true) const {
1802 TypeBits.FromAST = V;
1803 }
1804
1805protected:
1806 friend class ASTContext;
1807
1808 Type(TypeClass tc, QualType canon, bool Dependent,
1809 bool InstantiationDependent, bool VariablyModified,
1810 bool ContainsUnexpandedParameterPack)
1811 : ExtQualsTypeCommonBase(this,
1812 canon.isNull() ? QualType(this_(), 0) : canon) {
1813 TypeBits.TC = tc;
1814 TypeBits.Dependent = Dependent;
1815 TypeBits.InstantiationDependent = Dependent || InstantiationDependent;
1816 TypeBits.VariablyModified = VariablyModified;
1817 TypeBits.ContainsUnexpandedParameterPack = ContainsUnexpandedParameterPack;
1818 TypeBits.CacheValid = false;
1819 TypeBits.CachedLocalOrUnnamed = false;
1820 TypeBits.CachedLinkage = NoLinkage;
1821 TypeBits.FromAST = false;
1822 }
1823
1824 // silence VC++ warning C4355: 'this' : used in base member initializer list
1825 Type *this_() { return this; }
1826
1827 void setDependent(bool D = true) {
1828 TypeBits.Dependent = D;
1829 if (D)
1830 TypeBits.InstantiationDependent = true;
1831 }
1832
1833 void setInstantiationDependent(bool D = true) {
1834 TypeBits.InstantiationDependent = D; }
1835
1836 void setVariablyModified(bool VM = true) { TypeBits.VariablyModified = VM; }
1837
1838 void setContainsUnexpandedParameterPack(bool PP = true) {
1839 TypeBits.ContainsUnexpandedParameterPack = PP;
1840 }
1841
1842public:
1843 friend class ASTReader;
1844 friend class ASTWriter;
1845
1846 Type(const Type &) = delete;
1847 Type(Type &&) = delete;
1848 Type &operator=(const Type &) = delete;
1849 Type &operator=(Type &&) = delete;
1850
1851 TypeClass getTypeClass() const { return static_cast<TypeClass>(TypeBits.TC); }
1852
1853 /// Whether this type comes from an AST file.
1854 bool isFromAST() const { return TypeBits.FromAST; }
1855
1856 /// Whether this type is or contains an unexpanded parameter
1857 /// pack, used to support C++0x variadic templates.
1858 ///
1859 /// A type that contains a parameter pack shall be expanded by the
1860 /// ellipsis operator at some point. For example, the typedef in the
1861 /// following example contains an unexpanded parameter pack 'T':
1862 ///
1863 /// \code
1864 /// template<typename ...T>
1865 /// struct X {
1866 /// typedef T* pointer_types; // ill-formed; T is a parameter pack.
1867 /// };
1868 /// \endcode
1869 ///
1870 /// Note that this routine does not specify which
1871 bool containsUnexpandedParameterPack() const {
1872 return TypeBits.ContainsUnexpandedParameterPack;
1873 }
1874
1875 /// Determines if this type would be canonical if it had no further
1876 /// qualification.
1877 bool isCanonicalUnqualified() const {
1878 return CanonicalType == QualType(this, 0);
1879 }
1880
1881 /// Pull a single level of sugar off of this locally-unqualified type.
1882 /// Users should generally prefer SplitQualType::getSingleStepDesugaredType()
1883 /// or QualType::getSingleStepDesugaredType(const ASTContext&).
1884 QualType getLocallyUnqualifiedSingleStepDesugaredType() const;
1885
1886 /// Types are partitioned into 3 broad categories (C99 6.2.5p1):
1887 /// object types, function types, and incomplete types.
1888
1889 /// Return true if this is an incomplete type.
1890 /// A type that can describe objects, but which lacks information needed to
1891 /// determine its size (e.g. void, or a fwd declared struct). Clients of this
1892 /// routine will need to determine if the size is actually required.
1893 ///
1894 /// Def If non-null, and the type refers to some kind of declaration
1895 /// that can be completed (such as a C struct, C++ class, or Objective-C
1896 /// class), will be set to the declaration.
1897 bool isIncompleteType(NamedDecl **Def = nullptr) const;
1898
1899 /// Return true if this is an incomplete or object
1900 /// type, in other words, not a function type.
1901 bool isIncompleteOrObjectType() const {
1902 return !isFunctionType();
1903 }
1904
1905 /// Determine whether this type is an object type.
1906 bool isObjectType() const {
1907 // C++ [basic.types]p8:
1908 // An object type is a (possibly cv-qualified) type that is not a
1909 // function type, not a reference type, and not a void type.
1910 return !isReferenceType() && !isFunctionType() && !isVoidType();
1911 }
1912
1913 /// Return true if this is a literal type
1914 /// (C++11 [basic.types]p10)
1915 bool isLiteralType(const ASTContext &Ctx) const;
1916
1917 /// Test if this type is a standard-layout type.
1918 /// (C++0x [basic.type]p9)
1919 bool isStandardLayoutType() const;
1920
1921 /// Helper methods to distinguish type categories. All type predicates
1922 /// operate on the canonical type, ignoring typedefs and qualifiers.
1923
1924 /// Returns true if the type is a builtin type.
1925 bool isBuiltinType() const;
1926
1927 /// Test for a particular builtin type.
1928 bool isSpecificBuiltinType(unsigned K) const;
1929
1930 /// Test for a type which does not represent an actual type-system type but
1931 /// is instead used as a placeholder for various convenient purposes within
1932 /// Clang. All such types are BuiltinTypes.
1933 bool isPlaceholderType() const;
1934 const BuiltinType *getAsPlaceholderType() const;
1935
1936 /// Test for a specific placeholder type.
1937 bool isSpecificPlaceholderType(unsigned K) const;
1938
1939 /// Test for a placeholder type other than Overload; see
1940 /// BuiltinType::isNonOverloadPlaceholderType.
1941 bool isNonOverloadPlaceholderType() const;
1942
1943 /// isIntegerType() does *not* include complex integers (a GCC extension).
1944 /// isComplexIntegerType() can be used to test for complex integers.
1945 bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum)
1946 bool isEnumeralType() const;
1947
1948 /// Determine whether this type is a scoped enumeration type.
1949 bool isScopedEnumeralType() const;
1950 bool isBooleanType() const;
1951 bool isCharType() const;
1952 bool isWideCharType() const;
1953 bool isChar8Type() const;
1954 bool isChar16Type() const;
1955 bool isChar32Type() const;
1956 bool isAnyCharacterType() const;
1957 bool isIntegralType(const ASTContext &Ctx) const;
1958
1959 /// Determine whether this type is an integral or enumeration type.
1960 bool isIntegralOrEnumerationType() const;
1961
1962 /// Determine whether this type is an integral or unscoped enumeration type.
1963 bool isIntegralOrUnscopedEnumerationType() const;
1964
1965 /// Floating point categories.
1966 bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double)
1967 /// isComplexType() does *not* include complex integers (a GCC extension).
1968 /// isComplexIntegerType() can be used to test for complex integers.
1969 bool isComplexType() const; // C99 6.2.5p11 (complex)
1970 bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int.
1971 bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex)
1972 bool isHalfType() const; // OpenCL 6.1.1.1, NEON (IEEE 754-2008 half)
1973 bool isFloat16Type() const; // C11 extension ISO/IEC TS 18661
1974 bool isFloat128Type() const;
1975 bool isRealType() const; // C99 6.2.5p17 (real floating + integer)
1976 bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating)
1977 bool isVoidType() const; // C99 6.2.5p19
1978 bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers)
1979 bool isAggregateType() const;
1980 bool isFundamentalType() const;
1981 bool isCompoundType() const;
1982
1983 // Type Predicates: Check to see if this type is structurally the specified
1984 // type, ignoring typedefs and qualifiers.
1985 bool isFunctionType() const;
1986 bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); }
1987 bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); }
1988 bool isPointerType() const;
1989 bool isAnyPointerType() const; // Any C pointer or ObjC object pointer
1990 bool isBlockPointerType() const;
1991 bool isVoidPointerType() const;
1992 bool isReferenceType() const;
1993 bool isLValueReferenceType() const;
1994 bool isRValueReferenceType() const;
1995 bool isFunctionPointerType() const;
1996 bool isFunctionReferenceType() const;
1997 bool isMemberPointerType() const;
1998 bool isMemberFunctionPointerType() const;
1999 bool isMemberDataPointerType() const;
2000 bool isArrayType() const;
2001 bool isConstantArrayType() const;
2002 bool isIncompleteArrayType() const;
2003 bool isVariableArrayType() const;
2004 bool isDependentSizedArrayType() const;
2005 bool isRecordType() const;
2006 bool isClassType() const;
2007 bool isStructureType() const;
2008 bool isObjCBoxableRecordType() const;
2009 bool isInterfaceType() const;
2010 bool isStructureOrClassType() const;
2011 bool isUnionType() const;
2012 bool isComplexIntegerType() const; // GCC _Complex integer type.
2013 bool isVectorType() const; // GCC vector type.
2014 bool isExtVectorType() const; // Extended vector type.
2015 bool isDependentAddressSpaceType() const; // value-dependent address space qualifier
2016 bool isObjCObjectPointerType() const; // pointer to ObjC object
2017 bool isObjCRetainableType() const; // ObjC object or block pointer
2018 bool isObjCLifetimeType() const; // (array of)* retainable type
2019 bool isObjCIndirectLifetimeType() const; // (pointer to)* lifetime type
2020 bool isObjCNSObjectType() const; // __attribute__((NSObject))
2021 bool isObjCIndependentClassType() const; // __attribute__((objc_independent_class))
2022 // FIXME: change this to 'raw' interface type, so we can used 'interface' type
2023 // for the common case.
2024 bool isObjCObjectType() const; // NSString or typeof(*(id)0)
2025 bool isObjCQualifiedInterfaceType() const; // NSString<foo>
2026 bool isObjCQualifiedIdType() const; // id<foo>
2027 bool isObjCQualifiedClassType() const; // Class<foo>
2028 bool isObjCObjectOrInterfaceType() const;
2029 bool isObjCIdType() const; // id
2030 bool isDecltypeType() const;
2031 /// Was this type written with the special inert-in-ARC __unsafe_unretained
2032 /// qualifier?
2033 ///
2034 /// This approximates the answer to the following question: if this
2035 /// translation unit were compiled in ARC, would this type be qualified
2036 /// with __unsafe_unretained?
2037 bool isObjCInertUnsafeUnretainedType() const {
2038 return hasAttr(attr::ObjCInertUnsafeUnretained);
2039 }
2040
2041 /// Whether the type is Objective-C 'id' or a __kindof type of an
2042 /// object type, e.g., __kindof NSView * or __kindof id
2043 /// <NSCopying>.
2044 ///
2045 /// \param bound Will be set to the bound on non-id subtype types,
2046 /// which will be (possibly specialized) Objective-C class type, or
2047 /// null for 'id.
2048 bool isObjCIdOrObjectKindOfType(const ASTContext &ctx,
2049 const ObjCObjectType *&bound) const;
2050
2051 bool isObjCClassType() const; // Class
2052
2053 /// Whether the type is Objective-C 'Class' or a __kindof type of an
2054 /// Class type, e.g., __kindof Class <NSCopying>.
2055 ///
2056 /// Unlike \c isObjCIdOrObjectKindOfType, there is no relevant bound
2057 /// here because Objective-C's type system cannot express "a class
2058 /// object for a subclass of NSFoo".
2059 bool isObjCClassOrClassKindOfType() const;
2060
2061 bool isBlockCompatibleObjCPointerType(ASTContext &ctx) const;
2062 bool isObjCSelType() const; // Class
2063 bool isObjCBuiltinType() const; // 'id' or 'Class'
2064 bool isObjCARCBridgableType() const;
2065 bool isCARCBridgableType() const;
2066 bool isTemplateTypeParmType() const; // C++ template type parameter
2067 bool isNullPtrType() const; // C++11 std::nullptr_t
2068 bool isNothrowT() const; // C++ std::nothrow_t
2069 bool isAlignValT() const; // C++17 std::align_val_t
2070 bool isStdByteType() const; // C++17 std::byte
2071 bool isAtomicType() const; // C11 _Atomic()
2072
2073#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2074 bool is##Id##Type() const;
2075#include "clang/Basic/OpenCLImageTypes.def"
2076
2077 bool isImageType() const; // Any OpenCL image type
2078
2079 bool isSamplerT() const; // OpenCL sampler_t
2080 bool isEventT() const; // OpenCL event_t
2081 bool isClkEventT() const; // OpenCL clk_event_t
2082 bool isQueueT() const; // OpenCL queue_t
2083 bool isReserveIDT() const; // OpenCL reserve_id_t
2084
2085#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2086 bool is##Id##Type() const;
2087#include "clang/Basic/OpenCLExtensionTypes.def"
2088 // Type defined in cl_intel_device_side_avc_motion_estimation OpenCL extension
2089 bool isOCLIntelSubgroupAVCType() const;
2090 bool isOCLExtOpaqueType() const; // Any OpenCL extension type
2091
2092 bool isPipeType() const; // OpenCL pipe type
2093 bool isOpenCLSpecificType() const; // Any OpenCL specific type
2094
2095 /// Determines if this type, which must satisfy
2096 /// isObjCLifetimeType(), is implicitly __unsafe_unretained rather
2097 /// than implicitly __strong.
2098 bool isObjCARCImplicitlyUnretainedType() const;
2099
2100 /// Return the implicit lifetime for this type, which must not be dependent.
2101 Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const;
2102
2103 enum ScalarTypeKind {
2104 STK_CPointer,
2105 STK_BlockPointer,
2106 STK_ObjCObjectPointer,
2107 STK_MemberPointer,
2108 STK_Bool,
2109 STK_Integral,
2110 STK_Floating,
2111 STK_IntegralComplex,
2112 STK_FloatingComplex,
2113 STK_FixedPoint
2114 };
2115
2116 /// Given that this is a scalar type, classify it.
2117 ScalarTypeKind getScalarTypeKind() const;
2118
2119 /// Whether this type is a dependent type, meaning that its definition
2120 /// somehow depends on a template parameter (C++ [temp.dep.type]).
2121 bool isDependentType() const { return TypeBits.Dependent; }
2122
2123 /// Determine whether this type is an instantiation-dependent type,
2124 /// meaning that the type involves a template parameter (even if the
2125 /// definition does not actually depend on the type substituted for that
2126 /// template parameter).
2127 bool isInstantiationDependentType() const {
2128 return TypeBits.InstantiationDependent;
2129 }
2130
2131 /// Determine whether this type is an undeduced type, meaning that
2132 /// it somehow involves a C++11 'auto' type or similar which has not yet been
2133 /// deduced.
2134 bool isUndeducedType() const;
2135
2136 /// Whether this type is a variably-modified type (C99 6.7.5).
2137 bool isVariablyModifiedType() const { return TypeBits.VariablyModified; }
2138
2139 /// Whether this type involves a variable-length array type
2140 /// with a definite size.
2141 bool hasSizedVLAType() const;
2142
2143 /// Whether this type is or contains a local or unnamed type.
2144 bool hasUnnamedOrLocalType() const;
2145
2146 bool isOverloadableType() const;
2147
2148 /// Determine wither this type is a C++ elaborated-type-specifier.
2149 bool isElaboratedTypeSpecifier() const;
2150
2151 bool canDecayToPointerType() const;
2152
2153 /// Whether this type is represented natively as a pointer. This includes
2154 /// pointers, references, block pointers, and Objective-C interface,
2155 /// qualified id, and qualified interface types, as well as nullptr_t.
2156 bool hasPointerRepresentation() const;
2157
2158 /// Whether this type can represent an objective pointer type for the
2159 /// purpose of GC'ability
2160 bool hasObjCPointerRepresentation() const;
2161
2162 /// Determine whether this type has an integer representation
2163 /// of some sort, e.g., it is an integer type or a vector.
2164 bool hasIntegerRepresentation() const;
2165
2166 /// Determine whether this type has an signed integer representation
2167 /// of some sort, e.g., it is an signed integer type or a vector.
2168 bool hasSignedIntegerRepresentation() const;
2169
2170 /// Determine whether this type has an unsigned integer representation
2171 /// of some sort, e.g., it is an unsigned integer type or a vector.
2172 bool hasUnsignedIntegerRepresentation() const;
2173
2174 /// Determine whether this type has a floating-point representation
2175 /// of some sort, e.g., it is a floating-point type or a vector thereof.
2176 bool hasFloatingRepresentation() const;
2177
2178 // Type Checking Functions: Check to see if this type is structurally the
2179 // specified type, ignoring typedefs and qualifiers, and return a pointer to
2180 // the best type we can.
2181 const RecordType *getAsStructureType() const;
2182 /// NOTE: getAs*ArrayType are methods on ASTContext.
2183 const RecordType *getAsUnionType() const;
2184 const ComplexType *getAsComplexIntegerType() const; // GCC complex int type.
2185 const ObjCObjectType *getAsObjCInterfaceType() const;
2186
2187 // The following is a convenience method that returns an ObjCObjectPointerType
2188 // for object declared using an interface.
2189 const ObjCObjectPointerType *getAsObjCInterfacePointerType() const;
2190 const ObjCObjectPointerType *getAsObjCQualifiedIdType() const;
2191 const ObjCObjectPointerType *getAsObjCQualifiedClassType() const;
2192 const ObjCObjectType *getAsObjCQualifiedInterfaceType() const;
2193
2194 /// Retrieves the CXXRecordDecl that this type refers to, either
2195 /// because the type is a RecordType or because it is the injected-class-name
2196 /// type of a class template or class template partial specialization.
2197 CXXRecordDecl *getAsCXXRecordDecl() const;
2198
2199 /// Retrieves the RecordDecl this type refers to.
2200 RecordDecl *getAsRecordDecl() const;
2201
2202 /// Retrieves the TagDecl that this type refers to, either
2203 /// because the type is a TagType or because it is the injected-class-name
2204 /// type of a class template or class template partial specialization.
2205 TagDecl *getAsTagDecl() const;
2206
2207 /// If this is a pointer or reference to a RecordType, return the
2208 /// CXXRecordDecl that the type refers to.
2209 ///
2210 /// If this is not a pointer or reference, or the type being pointed to does
2211 /// not refer to a CXXRecordDecl, returns NULL.
2212 const CXXRecordDecl *getPointeeCXXRecordDecl() const;
2213
2214 /// Get the DeducedType whose type will be deduced for a variable with
2215 /// an initializer of this type. This looks through declarators like pointer
2216 /// types, but not through decltype or typedefs.
2217 DeducedType *getContainedDeducedType() const;
2218
2219 /// Get the AutoType whose type will be deduced for a variable with
2220 /// an initializer of this type. This looks through declarators like pointer
2221 /// types, but not through decltype or typedefs.
2222 AutoType *getContainedAutoType() const {
2223 return dyn_cast_or_null<AutoType>(getContainedDeducedType());
2224 }
2225
2226 /// Determine whether this type was written with a leading 'auto'
2227 /// corresponding to a trailing return type (possibly for a nested
2228 /// function type within a pointer to function type or similar).
2229 bool hasAutoForTrailingReturnType() const;
2230
2231 /// Member-template getAs<specific type>'. Look through sugar for
2232 /// an instance of \<specific type>. This scheme will eventually
2233 /// replace the specific getAsXXXX methods above.
2234 ///
2235 /// There are some specializations of this member template listed
2236 /// immediately following this class.
2237 template <typename T> const T *getAs() const;
2238
2239 /// Member-template getAsAdjusted<specific type>. Look through specific kinds
2240 /// of sugar (parens, attributes, etc) for an instance of \<specific type>.
2241 /// This is used when you need to walk over sugar nodes that represent some
2242 /// kind of type adjustment from a type that was written as a \<specific type>
2243 /// to another type that is still canonically a \<specific type>.
2244 template <typename T> const T *getAsAdjusted() const;
2245
2246 /// A variant of getAs<> for array types which silently discards
2247 /// qualifiers from the outermost type.
2248 const ArrayType *getAsArrayTypeUnsafe() const;
2249
2250 /// Member-template castAs<specific type>. Look through sugar for
2251 /// the underlying instance of \<specific type>.
2252 ///
2253 /// This method has the same relationship to getAs<T> as cast<T> has
2254 /// to dyn_cast<T>; which is to say, the underlying type *must*
2255 /// have the intended type, and this method will never return null.
2256 template <typename T> const T *castAs() const;
2257
2258 /// A variant of castAs<> for array type which silently discards
2259 /// qualifiers from the outermost type.
2260 const ArrayType *castAsArrayTypeUnsafe() const;
2261
2262 /// Determine whether this type had the specified attribute applied to it
2263 /// (looking through top-level type sugar).
2264 bool hasAttr(attr::Kind AK) const;
2265
2266 /// Get the base element type of this type, potentially discarding type
2267 /// qualifiers. This should never be used when type qualifiers
2268 /// are meaningful.
2269 const Type *getBaseElementTypeUnsafe() const;
2270
2271 /// If this is an array type, return the element type of the array,
2272 /// potentially with type qualifiers missing.
2273 /// This should never be used when type qualifiers are meaningful.
2274 const Type *getArrayElementTypeNoTypeQual() const;
2275
2276 /// If this is a pointer type, return the pointee type.
2277 /// If this is an array type, return the array element type.
2278 /// This should never be used when type qualifiers are meaningful.
2279 const Type *getPointeeOrArrayElementType() const;
2280
2281 /// If this is a pointer, ObjC object pointer, or block
2282 /// pointer, this returns the respective pointee.
2283 QualType getPointeeType() const;
2284
2285 /// Return the specified type with any "sugar" removed from the type,
2286 /// removing any typedefs, typeofs, etc., as well as any qualifiers.
2287 const Type *getUnqualifiedDesugaredType() const;
2288
2289 /// More type predicates useful for type checking/promotion
2290 bool isPromotableIntegerType() const; // C99 6.3.1.1p2
2291
2292 /// Return true if this is an integer type that is
2293 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
2294 /// or an enum decl which has a signed representation.
2295 bool isSignedIntegerType() const;
2296
2297 /// Return true if this is an integer type that is
2298 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool],
2299 /// or an enum decl which has an unsigned representation.
2300 bool isUnsignedIntegerType() const;
2301
2302 /// Determines whether this is an integer type that is signed or an
2303 /// enumeration types whose underlying type is a signed integer type.
2304 bool isSignedIntegerOrEnumerationType() const;
2305
2306 /// Determines whether this is an integer type that is unsigned or an
2307 /// enumeration types whose underlying type is a unsigned integer type.
2308 bool isUnsignedIntegerOrEnumerationType() const;
2309
2310 /// Return true if this is a fixed point type according to
2311 /// ISO/IEC JTC1 SC22 WG14 N1169.
2312 bool isFixedPointType() const;
2313
2314 /// Return true if this is a fixed point or integer type.
2315 bool isFixedPointOrIntegerType() const;
2316
2317 /// Return true if this is a saturated fixed point type according to
2318 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2319 bool isSaturatedFixedPointType() const;
2320
2321 /// Return true if this is a saturated fixed point type according to
2322 /// ISO/IEC JTC1 SC22 WG14 N1169. This type can be signed or unsigned.
2323 bool isUnsaturatedFixedPointType() const;
2324
2325 /// Return true if this is a fixed point type that is signed according
2326 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2327 bool isSignedFixedPointType() const;
2328
2329 /// Return true if this is a fixed point type that is unsigned according
2330 /// to ISO/IEC JTC1 SC22 WG14 N1169. This type can also be saturated.
2331 bool isUnsignedFixedPointType() const;
2332
2333 /// Return true if this is not a variable sized type,
2334 /// according to the rules of C99 6.7.5p3. It is not legal to call this on
2335 /// incomplete types.
2336 bool isConstantSizeType() const;
2337
2338 /// Returns true if this type can be represented by some
2339 /// set of type specifiers.
2340 bool isSpecifierType() const;
2341
2342 /// Determine the linkage of this type.
2343 Linkage getLinkage() const;
2344
2345 /// Determine the visibility of this type.
2346 Visibility getVisibility() const {
2347 return getLinkageAndVisibility().getVisibility();
2348 }
2349
2350 /// Return true if the visibility was explicitly set is the code.
2351 bool isVisibilityExplicit() const {
2352 return getLinkageAndVisibility().isVisibilityExplicit();
2353 }
2354
2355 /// Determine the linkage and visibility of this type.
2356 LinkageInfo getLinkageAndVisibility() const;
2357
2358 /// True if the computed linkage is valid. Used for consistency
2359 /// checking. Should always return true.
2360 bool isLinkageValid() const;
2361
2362 /// Determine the nullability of the given type.
2363 ///
2364 /// Note that nullability is only captured as sugar within the type
2365 /// system, not as part of the canonical type, so nullability will
2366 /// be lost by canonicalization and desugaring.
2367 Optional<NullabilityKind> getNullability(const ASTContext &context) const;
2368
2369 /// Determine whether the given type can have a nullability
2370 /// specifier applied to it, i.e., if it is any kind of pointer type.
2371 ///
2372 /// \param ResultIfUnknown The value to return if we don't yet know whether
2373 /// this type can have nullability because it is dependent.
2374 bool canHaveNullability(bool ResultIfUnknown = true) const;
2375
2376 /// Retrieve the set of substitutions required when accessing a member
2377 /// of the Objective-C receiver type that is declared in the given context.
2378 ///
2379 /// \c *this is the type of the object we're operating on, e.g., the
2380 /// receiver for a message send or the base of a property access, and is
2381 /// expected to be of some object or object pointer type.
2382 ///
2383 /// \param dc The declaration context for which we are building up a
2384 /// substitution mapping, which should be an Objective-C class, extension,
2385 /// category, or method within.
2386 ///
2387 /// \returns an array of type arguments that can be substituted for
2388 /// the type parameters of the given declaration context in any type described
2389 /// within that context, or an empty optional to indicate that no
2390 /// substitution is required.
2391 Optional<ArrayRef<QualType>>
2392 getObjCSubstitutions(const DeclContext *dc) const;
2393
2394 /// Determines if this is an ObjC interface type that may accept type
2395 /// parameters.
2396 bool acceptsObjCTypeParams() const;
2397
2398 const char *getTypeClassName() const;
2399
2400 QualType getCanonicalTypeInternal() const {
2401 return CanonicalType;
2402 }
2403
2404 CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h
2405 void dump() const;
2406 void dump(llvm::raw_ostream &OS) const;
2407};
2408
2409/// This will check for a TypedefType by removing any existing sugar
2410/// until it reaches a TypedefType or a non-sugared type.
2411template <> const TypedefType *Type::getAs() const;
2412
2413/// This will check for a TemplateSpecializationType by removing any
2414/// existing sugar until it reaches a TemplateSpecializationType or a
2415/// non-sugared type.
2416template <> const TemplateSpecializationType *Type::getAs() const;
2417
2418/// This will check for an AttributedType by removing any existing sugar
2419/// until it reaches an AttributedType or a non-sugared type.
2420template <> const AttributedType *Type::getAs() const;
2421
2422// We can do canonical leaf types faster, because we don't have to
2423// worry about preserving child type decoration.
2424#define TYPE(Class, Base)
2425#define LEAF_TYPE(Class) \
2426template <> inline const Class##Type *Type::getAs() const { \
2427 return dyn_cast<Class##Type>(CanonicalType); \
2428} \
2429template <> inline const Class##Type *Type::castAs() const { \
2430 return cast<Class##Type>(CanonicalType); \
2431}
2432#include "clang/AST/TypeNodes.inc"
2433
2434/// This class is used for builtin types like 'int'. Builtin
2435/// types are always canonical and have a literal name field.
2436class BuiltinType : public Type {
2437public:
2438 enum Kind {
2439// OpenCL image types
2440#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) Id,
2441#include "clang/Basic/OpenCLImageTypes.def"
2442// OpenCL extension types
2443#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) Id,
2444#include "clang/Basic/OpenCLExtensionTypes.def"
2445// SVE Types
2446#define SVE_TYPE(Name, Id, SingletonId) Id,
2447#include "clang/Basic/AArch64SVEACLETypes.def"
2448// All other builtin types
2449#define BUILTIN_TYPE(Id, SingletonId) Id,
2450#define LAST_BUILTIN_TYPE(Id) LastKind = Id
2451#include "clang/AST/BuiltinTypes.def"
2452 };
2453
2454private:
2455 friend class ASTContext; // ASTContext creates these.
2456
2457 BuiltinType(Kind K)
2458 : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent),
2459 /*InstantiationDependent=*/(K == Dependent),
2460 /*VariablyModified=*/false,
2461 /*Unexpanded parameter pack=*/false) {
2462 BuiltinTypeBits.Kind = K;
2463 }
2464
2465public:
2466 Kind getKind() const { return static_cast<Kind>(BuiltinTypeBits.Kind); }
2467 StringRef getName(const PrintingPolicy &Policy) const;
2468
2469 const char *getNameAsCString(const PrintingPolicy &Policy) const {
2470 // The StringRef is null-terminated.
2471 StringRef str = getName(Policy);
2472 assert(!str.empty() && str.data()[str.size()] == '\0')((!str.empty() && str.data()[str.size()] == '\0') ? static_cast
<void> (0) : __assert_fail ("!str.empty() && str.data()[str.size()] == '\\0'"
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 2472, __PRETTY_FUNCTION__))
;
2473 return str.data();
2474 }
2475
2476 bool isSugared() const { return false; }
2477 QualType desugar() const { return QualType(this, 0); }
2478
2479 bool isInteger() const {
2480 return getKind() >= Bool && getKind() <= Int128;
2481 }
2482
2483 bool isSignedInteger() const {
2484 return getKind() >= Char_S && getKind() <= Int128;
2485 }
2486
2487 bool isUnsignedInteger() const {
2488 return getKind() >= Bool && getKind() <= UInt128;
2489 }
2490
2491 bool isFloatingPoint() const {
2492 return getKind() >= Half && getKind() <= Float128;
2493 }
2494
2495 /// Determines whether the given kind corresponds to a placeholder type.
2496 static bool isPlaceholderTypeKind(Kind K) {
2497 return K >= Overload;
2498 }
2499
2500 /// Determines whether this type is a placeholder type, i.e. a type
2501 /// which cannot appear in arbitrary positions in a fully-formed
2502 /// expression.
2503 bool isPlaceholderType() const {
2504 return isPlaceholderTypeKind(getKind());
2505 }
2506
2507 /// Determines whether this type is a placeholder type other than
2508 /// Overload. Most placeholder types require only syntactic
2509 /// information about their context in order to be resolved (e.g.
2510 /// whether it is a call expression), which means they can (and
2511 /// should) be resolved in an earlier "phase" of analysis.
2512 /// Overload expressions sometimes pick up further information
2513 /// from their context, like whether the context expects a
2514 /// specific function-pointer type, and so frequently need
2515 /// special treatment.
2516 bool isNonOverloadPlaceholderType() const {
2517 return getKind() > Overload;
2518 }
2519
2520 static bool classof(const Type *T) { return T->getTypeClass() == Builtin; }
2521};
2522
2523/// Complex values, per C99 6.2.5p11. This supports the C99 complex
2524/// types (_Complex float etc) as well as the GCC integer complex extensions.
2525class ComplexType : public Type, public llvm::FoldingSetNode {
2526 friend class ASTContext; // ASTContext creates these.
2527
2528 QualType ElementType;
2529
2530 ComplexType(QualType Element, QualType CanonicalPtr)
2531 : Type(Complex, CanonicalPtr, Element->isDependentType(),
2532 Element->isInstantiationDependentType(),
2533 Element->isVariablyModifiedType(),
2534 Element->containsUnexpandedParameterPack()),
2535 ElementType(Element) {}
2536
2537public:
2538 QualType getElementType() const { return ElementType; }
2539
2540 bool isSugared() const { return false; }
2541 QualType desugar() const { return QualType(this, 0); }
2542
2543 void Profile(llvm::FoldingSetNodeID &ID) {
2544 Profile(ID, getElementType());
2545 }
2546
2547 static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) {
2548 ID.AddPointer(Element.getAsOpaquePtr());
2549 }
2550
2551 static bool classof(const Type *T) { return T->getTypeClass() == Complex; }
2552};
2553
2554/// Sugar for parentheses used when specifying types.
2555class ParenType : public Type, public llvm::FoldingSetNode {
2556 friend class ASTContext; // ASTContext creates these.
2557
2558 QualType Inner;
2559
2560 ParenType(QualType InnerType, QualType CanonType)
2561 : Type(Paren, CanonType, InnerType->isDependentType(),
2562 InnerType->isInstantiationDependentType(),
2563 InnerType->isVariablyModifiedType(),
2564 InnerType->containsUnexpandedParameterPack()),
2565 Inner(InnerType) {}
2566
2567public:
2568 QualType getInnerType() const { return Inner; }
2569
2570 bool isSugared() const { return true; }
2571 QualType desugar() const { return getInnerType(); }
2572
2573 void Profile(llvm::FoldingSetNodeID &ID) {
2574 Profile(ID, getInnerType());
2575 }
2576
2577 static void Profile(llvm::FoldingSetNodeID &ID, QualType Inner) {
2578 Inner.Profile(ID);
2579 }
2580
2581 static bool classof(const Type *T) { return T->getTypeClass() == Paren; }
2582};
2583
2584/// PointerType - C99 6.7.5.1 - Pointer Declarators.
2585class PointerType : public Type, public llvm::FoldingSetNode {
2586 friend class ASTContext; // ASTContext creates these.
2587
2588 QualType PointeeType;
2589
2590 PointerType(QualType Pointee, QualType CanonicalPtr)
2591 : Type(Pointer, CanonicalPtr, Pointee->isDependentType(),
2592 Pointee->isInstantiationDependentType(),
2593 Pointee->isVariablyModifiedType(),
2594 Pointee->containsUnexpandedParameterPack()),
2595 PointeeType(Pointee) {}
2596
2597public:
2598 QualType getPointeeType() const { return PointeeType; }
2599
2600 /// Returns true if address spaces of pointers overlap.
2601 /// OpenCL v2.0 defines conversion rules for pointers to different
2602 /// address spaces (OpenCLC v2.0 s6.5.5) and notion of overlapping
2603 /// address spaces.
2604 /// CL1.1 or CL1.2:
2605 /// address spaces overlap iff they are they same.
2606 /// CL2.0 adds:
2607 /// __generic overlaps with any address space except for __constant.
2608 bool isAddressSpaceOverlapping(const PointerType &other) const {
2609 Qualifiers thisQuals = PointeeType.getQualifiers();
2610 Qualifiers otherQuals = other.getPointeeType().getQualifiers();
2611 // Address spaces overlap if at least one of them is a superset of another
2612 return thisQuals.isAddressSpaceSupersetOf(otherQuals) ||
2613 otherQuals.isAddressSpaceSupersetOf(thisQuals);
2614 }
2615
2616 bool isSugared() const { return false; }
2617 QualType desugar() const { return QualType(this, 0); }
2618
2619 void Profile(llvm::FoldingSetNodeID &ID) {
2620 Profile(ID, getPointeeType());
2621 }
2622
2623 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2624 ID.AddPointer(Pointee.getAsOpaquePtr());
2625 }
2626
2627 static bool classof(const Type *T) { return T->getTypeClass() == Pointer; }
2628};
2629
2630/// Represents a type which was implicitly adjusted by the semantic
2631/// engine for arbitrary reasons. For example, array and function types can
2632/// decay, and function types can have their calling conventions adjusted.
2633class AdjustedType : public Type, public llvm::FoldingSetNode {
2634 QualType OriginalTy;
2635 QualType AdjustedTy;
2636
2637protected:
2638 friend class ASTContext; // ASTContext creates these.
2639
2640 AdjustedType(TypeClass TC, QualType OriginalTy, QualType AdjustedTy,
2641 QualType CanonicalPtr)
2642 : Type(TC, CanonicalPtr, OriginalTy->isDependentType(),
2643 OriginalTy->isInstantiationDependentType(),
2644 OriginalTy->isVariablyModifiedType(),
2645 OriginalTy->containsUnexpandedParameterPack()),
2646 OriginalTy(OriginalTy), AdjustedTy(AdjustedTy) {}
2647
2648public:
2649 QualType getOriginalType() const { return OriginalTy; }
2650 QualType getAdjustedType() const { return AdjustedTy; }
2651
2652 bool isSugared() const { return true; }
2653 QualType desugar() const { return AdjustedTy; }
2654
2655 void Profile(llvm::FoldingSetNodeID &ID) {
2656 Profile(ID, OriginalTy, AdjustedTy);
2657 }
2658
2659 static void Profile(llvm::FoldingSetNodeID &ID, QualType Orig, QualType New) {
2660 ID.AddPointer(Orig.getAsOpaquePtr());
2661 ID.AddPointer(New.getAsOpaquePtr());
2662 }
2663
2664 static bool classof(const Type *T) {
2665 return T->getTypeClass() == Adjusted || T->getTypeClass() == Decayed;
2666 }
2667};
2668
2669/// Represents a pointer type decayed from an array or function type.
2670class DecayedType : public AdjustedType {
2671 friend class ASTContext; // ASTContext creates these.
2672
2673 inline
2674 DecayedType(QualType OriginalType, QualType Decayed, QualType Canonical);
2675
2676public:
2677 QualType getDecayedType() const { return getAdjustedType(); }
2678
2679 inline QualType getPointeeType() const;
2680
2681 static bool classof(const Type *T) { return T->getTypeClass() == Decayed; }
2682};
2683
2684/// Pointer to a block type.
2685/// This type is to represent types syntactically represented as
2686/// "void (^)(int)", etc. Pointee is required to always be a function type.
2687class BlockPointerType : public Type, public llvm::FoldingSetNode {
2688 friend class ASTContext; // ASTContext creates these.
2689
2690 // Block is some kind of pointer type
2691 QualType PointeeType;
2692
2693 BlockPointerType(QualType Pointee, QualType CanonicalCls)
2694 : Type(BlockPointer, CanonicalCls, Pointee->isDependentType(),
2695 Pointee->isInstantiationDependentType(),
2696 Pointee->isVariablyModifiedType(),
2697 Pointee->containsUnexpandedParameterPack()),
2698 PointeeType(Pointee) {}
2699
2700public:
2701 // Get the pointee type. Pointee is required to always be a function type.
2702 QualType getPointeeType() const { return PointeeType; }
2703
2704 bool isSugared() const { return false; }
2705 QualType desugar() const { return QualType(this, 0); }
2706
2707 void Profile(llvm::FoldingSetNodeID &ID) {
2708 Profile(ID, getPointeeType());
2709 }
2710
2711 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
2712 ID.AddPointer(Pointee.getAsOpaquePtr());
2713 }
2714
2715 static bool classof(const Type *T) {
2716 return T->getTypeClass() == BlockPointer;
2717 }
2718};
2719
2720/// Base for LValueReferenceType and RValueReferenceType
2721class ReferenceType : public Type, public llvm::FoldingSetNode {
2722 QualType PointeeType;
2723
2724protected:
2725 ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef,
2726 bool SpelledAsLValue)
2727 : Type(tc, CanonicalRef, Referencee->isDependentType(),
2728 Referencee->isInstantiationDependentType(),
2729 Referencee->isVariablyModifiedType(),
2730 Referencee->containsUnexpandedParameterPack()),
2731 PointeeType(Referencee) {
2732 ReferenceTypeBits.SpelledAsLValue = SpelledAsLValue;
2733 ReferenceTypeBits.InnerRef = Referencee->isReferenceType();
2734 }
2735
2736public:
2737 bool isSpelledAsLValue() const { return ReferenceTypeBits.SpelledAsLValue; }
2738 bool isInnerRef() const { return ReferenceTypeBits.InnerRef; }
2739
2740 QualType getPointeeTypeAsWritten() const { return PointeeType; }
2741
2742 QualType getPointeeType() const {
2743 // FIXME: this might strip inner qualifiers; okay?
2744 const ReferenceType *T = this;
2745 while (T->isInnerRef())
2746 T = T->PointeeType->castAs<ReferenceType>();
2747 return T->PointeeType;
2748 }
2749
2750 void Profile(llvm::FoldingSetNodeID &ID) {
2751 Profile(ID, PointeeType, isSpelledAsLValue());
2752 }
2753
2754 static void Profile(llvm::FoldingSetNodeID &ID,
2755 QualType Referencee,
2756 bool SpelledAsLValue) {
2757 ID.AddPointer(Referencee.getAsOpaquePtr());
2758 ID.AddBoolean(SpelledAsLValue);
2759 }
2760
2761 static bool classof(const Type *T) {
2762 return T->getTypeClass() == LValueReference ||
2763 T->getTypeClass() == RValueReference;
2764 }
2765};
2766
2767/// An lvalue reference type, per C++11 [dcl.ref].
2768class LValueReferenceType : public ReferenceType {
2769 friend class ASTContext; // ASTContext creates these
2770
2771 LValueReferenceType(QualType Referencee, QualType CanonicalRef,
2772 bool SpelledAsLValue)
2773 : ReferenceType(LValueReference, Referencee, CanonicalRef,
2774 SpelledAsLValue) {}
2775
2776public:
2777 bool isSugared() const { return false; }
2778 QualType desugar() const { return QualType(this, 0); }
2779
2780 static bool classof(const Type *T) {
2781 return T->getTypeClass() == LValueReference;
2782 }
2783};
2784
2785/// An rvalue reference type, per C++11 [dcl.ref].
2786class RValueReferenceType : public ReferenceType {
2787 friend class ASTContext; // ASTContext creates these
2788
2789 RValueReferenceType(QualType Referencee, QualType CanonicalRef)
2790 : ReferenceType(RValueReference, Referencee, CanonicalRef, false) {}
2791
2792public:
2793 bool isSugared() const { return false; }
2794 QualType desugar() const { return QualType(this, 0); }
2795
2796 static bool classof(const Type *T) {
2797 return T->getTypeClass() == RValueReference;
2798 }
2799};
2800
2801/// A pointer to member type per C++ 8.3.3 - Pointers to members.
2802///
2803/// This includes both pointers to data members and pointer to member functions.
2804class MemberPointerType : public Type, public llvm::FoldingSetNode {
2805 friend class ASTContext; // ASTContext creates these.
2806
2807 QualType PointeeType;
2808
2809 /// The class of which the pointee is a member. Must ultimately be a
2810 /// RecordType, but could be a typedef or a template parameter too.
2811 const Type *Class;
2812
2813 MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr)
2814 : Type(MemberPointer, CanonicalPtr,
2815 Cls->isDependentType() || Pointee->isDependentType(),
2816 (Cls->isInstantiationDependentType() ||
2817 Pointee->isInstantiationDependentType()),
2818 Pointee->isVariablyModifiedType(),
2819 (Cls->containsUnexpandedParameterPack() ||
2820 Pointee->containsUnexpandedParameterPack())),
2821 PointeeType(Pointee), Class(Cls) {}
2822
2823public:
2824 QualType getPointeeType() const { return PointeeType; }
2825
2826 /// Returns true if the member type (i.e. the pointee type) is a
2827 /// function type rather than a data-member type.
2828 bool isMemberFunctionPointer() const {
2829 return PointeeType->isFunctionProtoType();
2830 }
2831
2832 /// Returns true if the member type (i.e. the pointee type) is a
2833 /// data type rather than a function type.
2834 bool isMemberDataPointer() const {
2835 return !PointeeType->isFunctionProtoType();
2836 }
2837
2838 const Type *getClass() const { return Class; }
2839 CXXRecordDecl *getMostRecentCXXRecordDecl() const;
2840
2841 bool isSugared() const { return false; }
2842 QualType desugar() const { return QualType(this, 0); }
2843
2844 void Profile(llvm::FoldingSetNodeID &ID) {
2845 Profile(ID, getPointeeType(), getClass());
2846 }
2847
2848 static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee,
2849 const Type *Class) {
2850 ID.AddPointer(Pointee.getAsOpaquePtr());
2851 ID.AddPointer(Class);
2852 }
2853
2854 static bool classof(const Type *T) {
2855 return T->getTypeClass() == MemberPointer;
2856 }
2857};
2858
2859/// Represents an array type, per C99 6.7.5.2 - Array Declarators.
2860class ArrayType : public Type, public llvm::FoldingSetNode {
2861public:
2862 /// Capture whether this is a normal array (e.g. int X[4])
2863 /// an array with a static size (e.g. int X[static 4]), or an array
2864 /// with a star size (e.g. int X[*]).
2865 /// 'static' is only allowed on function parameters.
2866 enum ArraySizeModifier {
2867 Normal, Static, Star
2868 };
2869
2870private:
2871 /// The element type of the array.
2872 QualType ElementType;
2873
2874protected:
2875 friend class ASTContext; // ASTContext creates these.
2876
2877 ArrayType(TypeClass tc, QualType et, QualType can, ArraySizeModifier sm,
2878 unsigned tq, const Expr *sz = nullptr);
2879
2880public:
2881 QualType getElementType() const { return ElementType; }
2882
2883 ArraySizeModifier getSizeModifier() const {
2884 return ArraySizeModifier(ArrayTypeBits.SizeModifier);
2885 }
2886
2887 Qualifiers getIndexTypeQualifiers() const {
2888 return Qualifiers::fromCVRMask(getIndexTypeCVRQualifiers());
2889 }
2890
2891 unsigned getIndexTypeCVRQualifiers() const {
2892 return ArrayTypeBits.IndexTypeQuals;
2893 }
2894
2895 static bool classof(const Type *T) {
2896 return T->getTypeClass() == ConstantArray ||
2897 T->getTypeClass() == VariableArray ||
2898 T->getTypeClass() == IncompleteArray ||
2899 T->getTypeClass() == DependentSizedArray;
2900 }
2901};
2902
2903/// Represents the canonical version of C arrays with a specified constant size.
2904/// For example, the canonical type for 'int A[4 + 4*100]' is a
2905/// ConstantArrayType where the element type is 'int' and the size is 404.
2906class ConstantArrayType final
2907 : public ArrayType,
2908 private llvm::TrailingObjects<ConstantArrayType, const Expr *> {
2909 friend class ASTContext; // ASTContext creates these.
2910 friend TrailingObjects;
2911
2912 llvm::APInt Size; // Allows us to unique the type.
2913
2914 ConstantArrayType(QualType et, QualType can, const llvm::APInt &size,
2915 const Expr *sz, ArraySizeModifier sm, unsigned tq)
2916 : ArrayType(ConstantArray, et, can, sm, tq, sz), Size(size) {
2917 ConstantArrayTypeBits.HasStoredSizeExpr = sz != nullptr;
2918 if (ConstantArrayTypeBits.HasStoredSizeExpr) {
2919 assert(!can.isNull() && "canonical constant array should not have size")((!can.isNull() && "canonical constant array should not have size"
) ? static_cast<void> (0) : __assert_fail ("!can.isNull() && \"canonical constant array should not have size\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 2919, __PRETTY_FUNCTION__))
;
2920 *getTrailingObjects<const Expr*>() = sz;
2921 }
2922 }
2923
2924 unsigned numTrailingObjects(OverloadToken<const Expr*>) const {
2925 return ConstantArrayTypeBits.HasStoredSizeExpr;
2926 }
2927
2928public:
2929 const llvm::APInt &getSize() const { return Size; }
2930 const Expr *getSizeExpr() const {
2931 return ConstantArrayTypeBits.HasStoredSizeExpr
2932 ? *getTrailingObjects<const Expr *>()
2933 : nullptr;
2934 }
2935 bool isSugared() const { return false; }
2936 QualType desugar() const { return QualType(this, 0); }
2937
2938 /// Determine the number of bits required to address a member of
2939 // an array with the given element type and number of elements.
2940 static unsigned getNumAddressingBits(const ASTContext &Context,
2941 QualType ElementType,
2942 const llvm::APInt &NumElements);
2943
2944 /// Determine the maximum number of active bits that an array's size
2945 /// can require, which limits the maximum size of the array.
2946 static unsigned getMaxSizeBits(const ASTContext &Context);
2947
2948 void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
2949 Profile(ID, Ctx, getElementType(), getSize(), getSizeExpr(),
2950 getSizeModifier(), getIndexTypeCVRQualifiers());
2951 }
2952
2953 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx,
2954 QualType ET, const llvm::APInt &ArraySize,
2955 const Expr *SizeExpr, ArraySizeModifier SizeMod,
2956 unsigned TypeQuals);
2957
2958 static bool classof(const Type *T) {
2959 return T->getTypeClass() == ConstantArray;
2960 }
2961};
2962
2963/// Represents a C array with an unspecified size. For example 'int A[]' has
2964/// an IncompleteArrayType where the element type is 'int' and the size is
2965/// unspecified.
2966class IncompleteArrayType : public ArrayType {
2967 friend class ASTContext; // ASTContext creates these.
2968
2969 IncompleteArrayType(QualType et, QualType can,
2970 ArraySizeModifier sm, unsigned tq)
2971 : ArrayType(IncompleteArray, et, can, sm, tq) {}
2972
2973public:
2974 friend class StmtIteratorBase;
2975
2976 bool isSugared() const { return false; }
2977 QualType desugar() const { return QualType(this, 0); }
2978
2979 static bool classof(const Type *T) {
2980 return T->getTypeClass() == IncompleteArray;
2981 }
2982
2983 void Profile(llvm::FoldingSetNodeID &ID) {
2984 Profile(ID, getElementType(), getSizeModifier(),
2985 getIndexTypeCVRQualifiers());
2986 }
2987
2988 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET,
2989 ArraySizeModifier SizeMod, unsigned TypeQuals) {
2990 ID.AddPointer(ET.getAsOpaquePtr());
2991 ID.AddInteger(SizeMod);
2992 ID.AddInteger(TypeQuals);
2993 }
2994};
2995
2996/// Represents a C array with a specified size that is not an
2997/// integer-constant-expression. For example, 'int s[x+foo()]'.
2998/// Since the size expression is an arbitrary expression, we store it as such.
2999///
3000/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and
3001/// should not be: two lexically equivalent variable array types could mean
3002/// different things, for example, these variables do not have the same type
3003/// dynamically:
3004///
3005/// void foo(int x) {
3006/// int Y[x];
3007/// ++x;
3008/// int Z[x];
3009/// }
3010class VariableArrayType : public ArrayType {
3011 friend class ASTContext; // ASTContext creates these.
3012
3013 /// An assignment-expression. VLA's are only permitted within
3014 /// a function block.
3015 Stmt *SizeExpr;
3016
3017 /// The range spanned by the left and right array brackets.
3018 SourceRange Brackets;
3019
3020 VariableArrayType(QualType et, QualType can, Expr *e,
3021 ArraySizeModifier sm, unsigned tq,
3022 SourceRange brackets)
3023 : ArrayType(VariableArray, et, can, sm, tq, e),
3024 SizeExpr((Stmt*) e), Brackets(brackets) {}
3025
3026public:
3027 friend class StmtIteratorBase;
3028
3029 Expr *getSizeExpr() const {
3030 // We use C-style casts instead of cast<> here because we do not wish
3031 // to have a dependency of Type.h on Stmt.h/Expr.h.
3032 return (Expr*) SizeExpr;
3033 }
3034
3035 SourceRange getBracketsRange() const { return Brackets; }
3036 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3037 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3038
3039 bool isSugared() const { return false; }
3040 QualType desugar() const { return QualType(this, 0); }
3041
3042 static bool classof(const Type *T) {
3043 return T->getTypeClass() == VariableArray;
3044 }
3045
3046 void Profile(llvm::FoldingSetNodeID &ID) {
3047 llvm_unreachable("Cannot unique VariableArrayTypes.")::llvm::llvm_unreachable_internal("Cannot unique VariableArrayTypes."
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 3047)
;
3048 }
3049};
3050
3051/// Represents an array type in C++ whose size is a value-dependent expression.
3052///
3053/// For example:
3054/// \code
3055/// template<typename T, int Size>
3056/// class array {
3057/// T data[Size];
3058/// };
3059/// \endcode
3060///
3061/// For these types, we won't actually know what the array bound is
3062/// until template instantiation occurs, at which point this will
3063/// become either a ConstantArrayType or a VariableArrayType.
3064class DependentSizedArrayType : public ArrayType {
3065 friend class ASTContext; // ASTContext creates these.
3066
3067 const ASTContext &Context;
3068
3069 /// An assignment expression that will instantiate to the
3070 /// size of the array.
3071 ///
3072 /// The expression itself might be null, in which case the array
3073 /// type will have its size deduced from an initializer.
3074 Stmt *SizeExpr;
3075
3076 /// The range spanned by the left and right array brackets.
3077 SourceRange Brackets;
3078
3079 DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can,
3080 Expr *e, ArraySizeModifier sm, unsigned tq,
3081 SourceRange brackets);
3082
3083public:
3084 friend class StmtIteratorBase;
3085
3086 Expr *getSizeExpr() const {
3087 // We use C-style casts instead of cast<> here because we do not wish
3088 // to have a dependency of Type.h on Stmt.h/Expr.h.
3089 return (Expr*) SizeExpr;
3090 }
3091
3092 SourceRange getBracketsRange() const { return Brackets; }
3093 SourceLocation getLBracketLoc() const { return Brackets.getBegin(); }
3094 SourceLocation getRBracketLoc() const { return Brackets.getEnd(); }
3095
3096 bool isSugared() const { return false; }
3097 QualType desugar() const { return QualType(this, 0); }
3098
3099 static bool classof(const Type *T) {
3100 return T->getTypeClass() == DependentSizedArray;
3101 }
3102
3103 void Profile(llvm::FoldingSetNodeID &ID) {
3104 Profile(ID, Context, getElementType(),
3105 getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr());
3106 }
3107
3108 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3109 QualType ET, ArraySizeModifier SizeMod,
3110 unsigned TypeQuals, Expr *E);
3111};
3112
3113/// Represents an extended address space qualifier where the input address space
3114/// value is dependent. Non-dependent address spaces are not represented with a
3115/// special Type subclass; they are stored on an ExtQuals node as part of a QualType.
3116///
3117/// For example:
3118/// \code
3119/// template<typename T, int AddrSpace>
3120/// class AddressSpace {
3121/// typedef T __attribute__((address_space(AddrSpace))) type;
3122/// }
3123/// \endcode
3124class DependentAddressSpaceType : public Type, public llvm::FoldingSetNode {
3125 friend class ASTContext;
3126
3127 const ASTContext &Context;
3128 Expr *AddrSpaceExpr;
3129 QualType PointeeType;
3130 SourceLocation loc;
3131
3132 DependentAddressSpaceType(const ASTContext &Context, QualType PointeeType,
3133 QualType can, Expr *AddrSpaceExpr,
3134 SourceLocation loc);
3135
3136public:
3137 Expr *getAddrSpaceExpr() const { return AddrSpaceExpr; }
3138 QualType getPointeeType() const { return PointeeType; }
3139 SourceLocation getAttributeLoc() const { return loc; }
3140
3141 bool isSugared() const { return false; }
3142 QualType desugar() const { return QualType(this, 0); }
3143
3144 static bool classof(const Type *T) {
3145 return T->getTypeClass() == DependentAddressSpace;
3146 }
3147
3148 void Profile(llvm::FoldingSetNodeID &ID) {
3149 Profile(ID, Context, getPointeeType(), getAddrSpaceExpr());
3150 }
3151
3152 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3153 QualType PointeeType, Expr *AddrSpaceExpr);
3154};
3155
3156/// Represents an extended vector type where either the type or size is
3157/// dependent.
3158///
3159/// For example:
3160/// \code
3161/// template<typename T, int Size>
3162/// class vector {
3163/// typedef T __attribute__((ext_vector_type(Size))) type;
3164/// }
3165/// \endcode
3166class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode {
3167 friend class ASTContext;
3168
3169 const ASTContext &Context;
3170 Expr *SizeExpr;
3171
3172 /// The element type of the array.
3173 QualType ElementType;
3174
3175 SourceLocation loc;
3176
3177 DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType,
3178 QualType can, Expr *SizeExpr, SourceLocation loc);
3179
3180public:
3181 Expr *getSizeExpr() const { return SizeExpr; }
3182 QualType getElementType() const { return ElementType; }
3183 SourceLocation getAttributeLoc() const { return loc; }
3184
3185 bool isSugared() const { return false; }
3186 QualType desugar() const { return QualType(this, 0); }
3187
3188 static bool classof(const Type *T) {
3189 return T->getTypeClass() == DependentSizedExtVector;
3190 }
3191
3192 void Profile(llvm::FoldingSetNodeID &ID) {
3193 Profile(ID, Context, getElementType(), getSizeExpr());
3194 }
3195
3196 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3197 QualType ElementType, Expr *SizeExpr);
3198};
3199
3200
3201/// Represents a GCC generic vector type. This type is created using
3202/// __attribute__((vector_size(n)), where "n" specifies the vector size in
3203/// bytes; or from an Altivec __vector or vector declaration.
3204/// Since the constructor takes the number of vector elements, the
3205/// client is responsible for converting the size into the number of elements.
3206class VectorType : public Type, public llvm::FoldingSetNode {
3207public:
3208 enum VectorKind {
3209 /// not a target-specific vector type
3210 GenericVector,
3211
3212 /// is AltiVec vector
3213 AltiVecVector,
3214
3215 /// is AltiVec 'vector Pixel'
3216 AltiVecPixel,
3217
3218 /// is AltiVec 'vector bool ...'
3219 AltiVecBool,
3220
3221 /// is ARM Neon vector
3222 NeonVector,
3223
3224 /// is ARM Neon polynomial vector
3225 NeonPolyVector
3226 };
3227
3228protected:
3229 friend class ASTContext; // ASTContext creates these.
3230
3231 /// The element type of the vector.
3232 QualType ElementType;
3233
3234 VectorType(QualType vecType, unsigned nElements, QualType canonType,
3235 VectorKind vecKind);
3236
3237 VectorType(TypeClass tc, QualType vecType, unsigned nElements,
3238 QualType canonType, VectorKind vecKind);
3239
3240public:
3241 QualType getElementType() const { return ElementType; }
3242 unsigned getNumElements() const { return VectorTypeBits.NumElements; }
3243
3244 static bool isVectorSizeTooLarge(unsigned NumElements) {
3245 return NumElements > VectorTypeBitfields::MaxNumElements;
3246 }
3247
3248 bool isSugared() const { return false; }
3249 QualType desugar() const { return QualType(this, 0); }
3250
3251 VectorKind getVectorKind() const {
3252 return VectorKind(VectorTypeBits.VecKind);
3253 }
3254
3255 void Profile(llvm::FoldingSetNodeID &ID) {
3256 Profile(ID, getElementType(), getNumElements(),
3257 getTypeClass(), getVectorKind());
3258 }
3259
3260 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
3261 unsigned NumElements, TypeClass TypeClass,
3262 VectorKind VecKind) {
3263 ID.AddPointer(ElementType.getAsOpaquePtr());
3264 ID.AddInteger(NumElements);
3265 ID.AddInteger(TypeClass);
3266 ID.AddInteger(VecKind);
3267 }
3268
3269 static bool classof(const Type *T) {
3270 return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector;
3271 }
3272};
3273
3274/// Represents a vector type where either the type or size is dependent.
3275////
3276/// For example:
3277/// \code
3278/// template<typename T, int Size>
3279/// class vector {
3280/// typedef T __attribute__((vector_size(Size))) type;
3281/// }
3282/// \endcode
3283class DependentVectorType : public Type, public llvm::FoldingSetNode {
3284 friend class ASTContext;
3285
3286 const ASTContext &Context;
3287 QualType ElementType;
3288 Expr *SizeExpr;
3289 SourceLocation Loc;
3290
3291 DependentVectorType(const ASTContext &Context, QualType ElementType,
3292 QualType CanonType, Expr *SizeExpr,
3293 SourceLocation Loc, VectorType::VectorKind vecKind);
3294
3295public:
3296 Expr *getSizeExpr() const { return SizeExpr; }
3297 QualType getElementType() const { return ElementType; }
3298 SourceLocation getAttributeLoc() const { return Loc; }
3299 VectorType::VectorKind getVectorKind() const {
3300 return VectorType::VectorKind(VectorTypeBits.VecKind);
3301 }
3302
3303 bool isSugared() const { return false; }
3304 QualType desugar() const { return QualType(this, 0); }
3305
3306 static bool classof(const Type *T) {
3307 return T->getTypeClass() == DependentVector;
3308 }
3309
3310 void Profile(llvm::FoldingSetNodeID &ID) {
3311 Profile(ID, Context, getElementType(), getSizeExpr(), getVectorKind());
3312 }
3313
3314 static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
3315 QualType ElementType, const Expr *SizeExpr,
3316 VectorType::VectorKind VecKind);
3317};
3318
3319/// ExtVectorType - Extended vector type. This type is created using
3320/// __attribute__((ext_vector_type(n)), where "n" is the number of elements.
3321/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This
3322/// class enables syntactic extensions, like Vector Components for accessing
3323/// points (as .xyzw), colors (as .rgba), and textures (modeled after OpenGL
3324/// Shading Language).
3325class ExtVectorType : public VectorType {
3326 friend class ASTContext; // ASTContext creates these.
3327
3328 ExtVectorType(QualType vecType, unsigned nElements, QualType canonType)
3329 : VectorType(ExtVector, vecType, nElements, canonType, GenericVector) {}
3330
3331public:
3332 static int getPointAccessorIdx(char c) {
3333 switch (c) {
3334 default: return -1;
3335 case 'x': case 'r': return 0;
3336 case 'y': case 'g': return 1;
3337 case 'z': case 'b': return 2;
3338 case 'w': case 'a': return 3;
3339 }
3340 }
3341
3342 static int getNumericAccessorIdx(char c) {
3343 switch (c) {
3344 default: return -1;
3345 case '0': return 0;
3346 case '1': return 1;
3347 case '2': return 2;
3348 case '3': return 3;
3349 case '4': return 4;
3350 case '5': return 5;
3351 case '6': return 6;
3352 case '7': return 7;
3353 case '8': return 8;
3354 case '9': return 9;
3355 case 'A':
3356 case 'a': return 10;
3357 case 'B':
3358 case 'b': return 11;
3359 case 'C':
3360 case 'c': return 12;
3361 case 'D':
3362 case 'd': return 13;
3363 case 'E':
3364 case 'e': return 14;
3365 case 'F':
3366 case 'f': return 15;
3367 }
3368 }
3369
3370 static int getAccessorIdx(char c, bool isNumericAccessor) {
3371 if (isNumericAccessor)
3372 return getNumericAccessorIdx(c);
3373 else
3374 return getPointAccessorIdx(c);
3375 }
3376
3377 bool isAccessorWithinNumElements(char c, bool isNumericAccessor) const {
3378 if (int idx = getAccessorIdx(c, isNumericAccessor)+1)
3379 return unsigned(idx-1) < getNumElements();
3380 return false;
3381 }
3382
3383 bool isSugared() const { return false; }
3384 QualType desugar() const { return QualType(this, 0); }
3385
3386 static bool classof(const Type *T) {
3387 return T->getTypeClass() == ExtVector;
3388 }
3389};
3390
3391/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base
3392/// class of FunctionNoProtoType and FunctionProtoType.
3393class FunctionType : public Type {
3394 // The type returned by the function.
3395 QualType ResultType;
3396
3397public:
3398 /// Interesting information about a specific parameter that can't simply
3399 /// be reflected in parameter's type. This is only used by FunctionProtoType
3400 /// but is in FunctionType to make this class available during the
3401 /// specification of the bases of FunctionProtoType.
3402 ///
3403 /// It makes sense to model language features this way when there's some
3404 /// sort of parameter-specific override (such as an attribute) that
3405 /// affects how the function is called. For example, the ARC ns_consumed
3406 /// attribute changes whether a parameter is passed at +0 (the default)
3407 /// or +1 (ns_consumed). This must be reflected in the function type,
3408 /// but isn't really a change to the parameter type.
3409 ///
3410 /// One serious disadvantage of modelling language features this way is
3411 /// that they generally do not work with language features that attempt
3412 /// to destructure types. For example, template argument deduction will
3413 /// not be able to match a parameter declared as
3414 /// T (*)(U)
3415 /// against an argument of type
3416 /// void (*)(__attribute__((ns_consumed)) id)
3417 /// because the substitution of T=void, U=id into the former will
3418 /// not produce the latter.
3419 class ExtParameterInfo {
3420 enum {
3421 ABIMask = 0x0F,
3422 IsConsumed = 0x10,
3423 HasPassObjSize = 0x20,
3424 IsNoEscape = 0x40,
3425 };
3426 unsigned char Data = 0;
3427
3428 public:
3429 ExtParameterInfo() = default;
3430
3431 /// Return the ABI treatment of this parameter.
3432 ParameterABI getABI() const { return ParameterABI(Data & ABIMask); }
3433 ExtParameterInfo withABI(ParameterABI kind) const {
3434 ExtParameterInfo copy = *this;
3435 copy.Data = (copy.Data & ~ABIMask) | unsigned(kind);
3436 return copy;
3437 }
3438
3439 /// Is this parameter considered "consumed" by Objective-C ARC?
3440 /// Consumed parameters must have retainable object type.
3441 bool isConsumed() const { return (Data & IsConsumed); }
3442 ExtParameterInfo withIsConsumed(bool consumed) const {
3443 ExtParameterInfo copy = *this;
3444 if (consumed)
3445 copy.Data |= IsConsumed;
3446 else
3447 copy.Data &= ~IsConsumed;
3448 return copy;
3449 }
3450
3451 bool hasPassObjectSize() const { return Data & HasPassObjSize; }
3452 ExtParameterInfo withHasPassObjectSize() const {
3453 ExtParameterInfo Copy = *this;
3454 Copy.Data |= HasPassObjSize;
3455 return Copy;
3456 }
3457
3458 bool isNoEscape() const { return Data & IsNoEscape; }
3459 ExtParameterInfo withIsNoEscape(bool NoEscape) const {
3460 ExtParameterInfo Copy = *this;
3461 if (NoEscape)
3462 Copy.Data |= IsNoEscape;
3463 else
3464 Copy.Data &= ~IsNoEscape;
3465 return Copy;
3466 }
3467
3468 unsigned char getOpaqueValue() const { return Data; }
3469 static ExtParameterInfo getFromOpaqueValue(unsigned char data) {
3470 ExtParameterInfo result;
3471 result.Data = data;
3472 return result;
3473 }
3474
3475 friend bool operator==(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3476 return lhs.Data == rhs.Data;
3477 }
3478
3479 friend bool operator!=(ExtParameterInfo lhs, ExtParameterInfo rhs) {
3480 return lhs.Data != rhs.Data;
3481 }
3482 };
3483
3484 /// A class which abstracts out some details necessary for
3485 /// making a call.
3486 ///
3487 /// It is not actually used directly for storing this information in
3488 /// a FunctionType, although FunctionType does currently use the
3489 /// same bit-pattern.
3490 ///
3491 // If you add a field (say Foo), other than the obvious places (both,
3492 // constructors, compile failures), what you need to update is
3493 // * Operator==
3494 // * getFoo
3495 // * withFoo
3496 // * functionType. Add Foo, getFoo.
3497 // * ASTContext::getFooType
3498 // * ASTContext::mergeFunctionTypes
3499 // * FunctionNoProtoType::Profile
3500 // * FunctionProtoType::Profile
3501 // * TypePrinter::PrintFunctionProto
3502 // * AST read and write
3503 // * Codegen
3504 class ExtInfo {
3505 friend class FunctionType;
3506
3507 // Feel free to rearrange or add bits, but if you go over 12,
3508 // you'll need to adjust both the Bits field below and
3509 // Type::FunctionTypeBitfields.
3510
3511 // | CC |noreturn|produces|nocallersavedregs|regparm|nocfcheck|
3512 // |0 .. 4| 5 | 6 | 7 |8 .. 10| 11 |
3513 //
3514 // regparm is either 0 (no regparm attribute) or the regparm value+1.
3515 enum { CallConvMask = 0x1F };
3516 enum { NoReturnMask = 0x20 };
3517 enum { ProducesResultMask = 0x40 };
3518 enum { NoCallerSavedRegsMask = 0x80 };
3519 enum { NoCfCheckMask = 0x800 };
3520 enum {
3521 RegParmMask = ~(CallConvMask | NoReturnMask | ProducesResultMask |
3522 NoCallerSavedRegsMask | NoCfCheckMask),
3523 RegParmOffset = 8
3524 }; // Assumed to be the last field
3525 uint16_t Bits = CC_C;
3526
3527 ExtInfo(unsigned Bits) : Bits(static_cast<uint16_t>(Bits)) {}
3528
3529 public:
3530 // Constructor with no defaults. Use this when you know that you
3531 // have all the elements (when reading an AST file for example).
3532 ExtInfo(bool noReturn, bool hasRegParm, unsigned regParm, CallingConv cc,
3533 bool producesResult, bool noCallerSavedRegs, bool NoCfCheck) {
3534 assert((!hasRegParm || regParm < 7) && "Invalid regparm value")(((!hasRegParm || regParm < 7) && "Invalid regparm value"
) ? static_cast<void> (0) : __assert_fail ("(!hasRegParm || regParm < 7) && \"Invalid regparm value\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 3534, __PRETTY_FUNCTION__))
;
3535 Bits = ((unsigned)cc) | (noReturn ? NoReturnMask : 0) |
3536 (producesResult ? ProducesResultMask : 0) |
3537 (noCallerSavedRegs ? NoCallerSavedRegsMask : 0) |
3538 (hasRegParm ? ((regParm + 1) << RegParmOffset) : 0) |
3539 (NoCfCheck ? NoCfCheckMask : 0);
3540 }
3541
3542 // Constructor with all defaults. Use when for example creating a
3543 // function known to use defaults.
3544 ExtInfo() = default;
3545
3546 // Constructor with just the calling convention, which is an important part
3547 // of the canonical type.
3548 ExtInfo(CallingConv CC) : Bits(CC) {}
3549
3550 bool getNoReturn() const { return Bits & NoReturnMask; }
3551 bool getProducesResult() const { return Bits & ProducesResultMask; }
3552 bool getNoCallerSavedRegs() const { return Bits & NoCallerSavedRegsMask; }
3553 bool getNoCfCheck() const { return Bits & NoCfCheckMask; }
3554 bool getHasRegParm() const { return (Bits >> RegParmOffset) != 0; }
3555
3556 unsigned getRegParm() const {
3557 unsigned RegParm = (Bits & RegParmMask) >> RegParmOffset;
3558 if (RegParm > 0)
3559 --RegParm;
3560 return RegParm;
3561 }
3562
3563 CallingConv getCC() const { return CallingConv(Bits & CallConvMask); }
3564
3565 bool operator==(ExtInfo Other) const {
3566 return Bits == Other.Bits;
3567 }
3568 bool operator!=(ExtInfo Other) const {
3569 return Bits != Other.Bits;
3570 }
3571
3572 // Note that we don't have setters. That is by design, use
3573 // the following with methods instead of mutating these objects.
3574
3575 ExtInfo withNoReturn(bool noReturn) const {
3576 if (noReturn)
3577 return ExtInfo(Bits | NoReturnMask);
3578 else
3579 return ExtInfo(Bits & ~NoReturnMask);
3580 }
3581
3582 ExtInfo withProducesResult(bool producesResult) const {
3583 if (producesResult)
3584 return ExtInfo(Bits | ProducesResultMask);
3585 else
3586 return ExtInfo(Bits & ~ProducesResultMask);
3587 }
3588
3589 ExtInfo withNoCallerSavedRegs(bool noCallerSavedRegs) const {
3590 if (noCallerSavedRegs)
3591 return ExtInfo(Bits | NoCallerSavedRegsMask);
3592 else
3593 return ExtInfo(Bits & ~NoCallerSavedRegsMask);
3594 }
3595
3596 ExtInfo withNoCfCheck(bool noCfCheck) const {
3597 if (noCfCheck)
3598 return ExtInfo(Bits | NoCfCheckMask);
3599 else
3600 return ExtInfo(Bits & ~NoCfCheckMask);
3601 }
3602
3603 ExtInfo withRegParm(unsigned RegParm) const {
3604 assert(RegParm < 7 && "Invalid regparm value")((RegParm < 7 && "Invalid regparm value") ? static_cast
<void> (0) : __assert_fail ("RegParm < 7 && \"Invalid regparm value\""
, "/build/llvm-toolchain-snapshot-10~svn374877/tools/clang/include/clang/AST/Type.h"
, 3604, __PRETTY_FUNCTION__))
;
3605 return ExtInfo((Bits & ~RegParmMask) |
3606 ((RegParm + 1) << RegParmOffset));
3607 }
3608
3609 ExtInfo withCallingConv(CallingConv cc) const {
3610 return ExtInfo((Bits & ~CallConvMask) | (unsigned) cc);
3611 }
3612
3613 void Profile(llvm::FoldingSetNodeID &ID) const {
3614 ID.AddInteger(Bits);
3615 }
3616 };
3617
3618 /// A simple holder for a QualType representing a type in an
3619 /// exception specification. Unfortunately needed by FunctionProtoType
3620 /// because TrailingObjects cannot handle repeated types.
3621 struct ExceptionType { QualType Type; };
3622
3623 /// A simple holder for various uncommon bits which do not fit in
3624 /// FunctionTypeBitfields. Aligned to alignof(void *) to maintain the
3625 /// alignment of subsequent objects in TrailingObjects. You must update
3626 /// hasExtraBitfields in FunctionProtoType after adding extra data here.
3627 struct alignas(void *) FunctionTypeExtraBitfields {
3628 /// The number of types in the exception specification.
3629 /// A whole unsigned is not needed here and according to
3630 /// [implimits] 8 bits would be enough here.
3631 unsigned NumExceptionType;
3632 };
3633
3634protected:
3635 FunctionType(TypeClass tc, QualType res,
3636 QualType Canonical, bool Dependent,
3637 bool InstantiationDependent,
3638 bool VariablyModified, bool ContainsUnexpandedParameterPack,
3639 ExtInfo Info)
3640 : Type(tc, Canonical, Dependent, InstantiationDependent, VariablyModified,
3641 ContainsUnexpandedParameterPack),
3642 ResultType(res) {
3643 FunctionTypeBits.ExtInfo = Info.Bits;
3644 }
3645
3646 Qualifiers getFastTypeQuals() const {
3647 return Qualifiers::fromFastMask(FunctionTypeBits.FastTypeQuals);
3648 }
3649
3650public:
3651 QualType getReturnType() const { return ResultType; }
3652
3653 bool getHasRegParm() const { return getExtInfo().getHasRegParm(); }
3654 unsigned getRegParmType() const { return getExtInfo().getRegParm(); }
3655
3656 /// Determine whether this function type includes the GNU noreturn
3657 /// attribute. The C++11 [[noreturn]] attribute does not affect the function
3658 /// type.
3659 bool getNoReturnAttr() const { return getExtInfo().getNoReturn(); }
3660
3661 CallingConv getCallConv() const { return getExtInfo().getCC(); }
3662 ExtInfo getExtInfo() const { return ExtInfo(FunctionTypeBits.ExtInfo); }
3663
3664 static_assert((~Qualifiers::FastMask & Qualifiers::CVRMask) == 0,
3665 "Const, volatile and restrict are assumed to be a subset of "
3666 "the fast qualifiers.");
3667
3668 bool isConst() const { return getFastTypeQuals().hasConst(); }
3669 bool isVolatile() const { return getFastTypeQuals().hasVolatile(); }
3670 bool isRestrict() const { return getFastTypeQuals().hasRestrict(); }
3671
3672 /// Determine the type of an expression that calls a function of
3673 /// this type.
3674 QualType getCallResultType(const ASTContext &Context) const {
3675 return getReturnType().getNonLValueExprType(Context);
3676 }
3677
3678 static StringRef getNameForCallConv(CallingConv CC);
3679
3680 static bool classof(const Type *T) {
3681 return T->getTypeClass() == FunctionNoProto ||
3682 T->getTypeClass() == FunctionProto;
3683 }
3684};
3685
3686/// Represents a K&R-style 'int foo()' function, which has
3687/// no information available about its arguments.
3688class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode {
3689 friend class ASTContext; // ASTContext creates these.
3690
3691 FunctionNoProtoType(QualType Result, QualType Canonical, ExtInfo Info)
3692 : FunctionType(FunctionNoProto, Result, Canonical,
3693 /*Dependent=*/false, /*InstantiationDependent=*/false,
3694 Result->isVariablyModifiedType(),
3695 /*ContainsUnexpandedParameterPack=*/false, Info) {}
3696
3697public:
3698 // No additional state past what FunctionType provides.
3699
3700 bool isSugared() const { return false; }
3701 QualType desugar() const { return QualType(this, 0); }
3702
3703 void Profile(llvm::FoldingSetNodeID &ID) {
3704 Profile(ID, getReturnType(), getExtInfo());
3705 }
3706
3707 static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType,
3708 ExtInfo Info) {
3709 Info.Profile(ID);
3710 ID.AddPointer(ResultType.getAsOpaquePtr());
3711 }
3712
3713 static bool classof(const Type *T) {
3714 return T->getTypeClass() == FunctionNoProto;
3715 }
3716};
3717
3718/// Represents a prototype with parameter type info, e.g.
3719/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no
3720/// parameters, not as having a single void parameter. Such a type can have
3721/// an exception specification, but this specification is not part of the
3722/// canonical type. FunctionProtoType has several trailing objects, some of
3723/// which optional. For more information about the trailing objects see
3724/// the first comment inside FunctionProtoType.
3725class FunctionProtoType final
3726 : public FunctionType,
3727 public llvm::FoldingSetNode,
3728 private llvm::TrailingObjects<
3729 FunctionProtoType, QualType, FunctionType::FunctionTypeExtraBitfields,
3730 FunctionType::ExceptionType, Expr *, FunctionDecl *,
3731 FunctionType::ExtParameterInfo, Qualifiers> {
3732 friend class ASTContext; // ASTContext creates these.
3733 friend TrailingObjects;
3734
3735 // FunctionProtoType is followed by several trailing objects, some of
3736 // which optional. They are in order:
3737 //
3738 // * An array of getNumParams() QualType holding the parameter types.
3739 // Always present. Note that for the vast majority of FunctionProtoType,
3740 // these will be the only trailing objects.
3741 //
3742 // * Optionally if some extra data is stored in FunctionTypeExtraBitfields
3743 // (see FunctionTypeExtraBitfields and FunctionTypeBitfields):
3744 // a single FunctionTypeExtraBitfields. Present if and only if
3745 // hasExtraBitfields() is true.
3746 //
3747 // * Optionally exactly one of:
3748 // * an array of getNumExceptions() ExceptionType,
3749 // * a single Expr *,
3750 // * a pair of FunctionDecl *,
3751 // * a single FunctionDecl *
3752 // used to store information about the various types of exception
3753 // specification. See getExceptionSpecSize for the details.
3754 //
3755 // * Optionally an array of getNumParams() ExtParameterInfo holding
3756 // an ExtParameterInfo for each of the parameters. Present if and
3757 // only if hasExtParameterInfos() is true.
3758 //
3759 // * Optionally a Qualifiers object to represent extra qualifiers that can't
3760 // be represented by FunctionTypeBitfields.FastTypeQuals. Present if and only
3761 // if hasExtQualifiers() is true.
3762 //
3763 // The optional FunctionTypeExtraBitfields has to be before the data
3764 // related to the exception specification since it contains the number
3765 // of exception types.
3766 //
3767 // We put the ExtParameterInfos last. If all were equal, it would make
3768 // more sense to put these before the exception specification, because
3769 // it's much easier to skip past them compared to the elaborate switch
3770 // required to skip the exception specification. However, all is not
3771 // equal; ExtParameterInfos are used to model very uncommon features,
3772 // and it's better not to burden the more common paths.
3773
3774public:
3775 /// Holds information about the various types of exception specification.
3776 /// ExceptionSpecInfo is not stored as such in FunctionProtoType but is
3777 /// used to group together the various bits of information about the
3778 /// exception specification.
3779 struct ExceptionSpecInfo {
3780 /// The kind of exception specification this is.
3781 ExceptionSpecificationType Type = EST_None;
3782
3783 /// Explicitly-specified list of exception types.
3784 ArrayRef<QualType> Exceptions;
3785
3786 /// Noexcept expression, if this is a computed noexcept specification.
3787 Expr *NoexceptExpr = nullptr;
3788
3789 /// The function whose exception specification this is, for
3790 /// EST_Unevaluated and EST_Uninstantiated.
3791 FunctionDecl *SourceDecl = nullptr;
3792
3793 /// The function template whose exception specification this is instantiated
3794 /// from, for EST_Uninstantiated.
3795 FunctionDecl *SourceTemplate = nullptr;
3796
3797