1 //===--- TypePrinter.cpp - Pretty-Print Clang Types -----------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This contains code to print types from Clang's type system.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "clang/AST/Decl.h"
15 #include "clang/AST/DeclObjC.h"
16 #include "clang/AST/DeclTemplate.h"
17 #include "clang/AST/Expr.h"
18 #include "clang/AST/Type.h"
19 #include "clang/AST/PrettyPrinter.h"
20 #include "clang/Basic/LangOptions.h"
21 #include "clang/Basic/SourceManager.h"
22 #include "llvm/ADT/StringExtras.h"
23 #include "llvm/Support/raw_ostream.h"
24 using namespace clang;
25
26 namespace {
27 /// \brief RAII object that enables printing of the ARC __strong lifetime
28 /// qualifier.
29 class IncludeStrongLifetimeRAII {
30 PrintingPolicy &Policy;
31 bool Old;
32
33 public:
IncludeStrongLifetimeRAII(PrintingPolicy & Policy)34 explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy)
35 : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
36 Policy.SuppressStrongLifetime = false;
37 }
38
~IncludeStrongLifetimeRAII()39 ~IncludeStrongLifetimeRAII() {
40 Policy.SuppressStrongLifetime = Old;
41 }
42 };
43
44 class TypePrinter {
45 PrintingPolicy Policy;
46
47 public:
TypePrinter(const PrintingPolicy & Policy)48 explicit TypePrinter(const PrintingPolicy &Policy) : Policy(Policy) { }
49
50 void print(const Type *ty, Qualifiers qs, std::string &buffer);
51 void print(QualType T, std::string &S);
52 void AppendScope(DeclContext *DC, std::string &S);
53 void printTag(TagDecl *T, std::string &S);
54 #define ABSTRACT_TYPE(CLASS, PARENT)
55 #define TYPE(CLASS, PARENT) \
56 void print##CLASS(const CLASS##Type *T, std::string &S);
57 #include "clang/AST/TypeNodes.def"
58 };
59 }
60
AppendTypeQualList(std::string & S,unsigned TypeQuals)61 static void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
62 if (TypeQuals & Qualifiers::Const) {
63 if (!S.empty()) S += ' ';
64 S += "const";
65 }
66 if (TypeQuals & Qualifiers::Volatile) {
67 if (!S.empty()) S += ' ';
68 S += "volatile";
69 }
70 if (TypeQuals & Qualifiers::Restrict) {
71 if (!S.empty()) S += ' ';
72 S += "restrict";
73 }
74 }
75
print(QualType t,std::string & buffer)76 void TypePrinter::print(QualType t, std::string &buffer) {
77 SplitQualType split = t.split();
78 print(split.first, split.second, buffer);
79 }
80
print(const Type * T,Qualifiers Quals,std::string & buffer)81 void TypePrinter::print(const Type *T, Qualifiers Quals, std::string &buffer) {
82 if (!T) {
83 buffer += "NULL TYPE";
84 return;
85 }
86
87 if (Policy.SuppressSpecifiers && T->isSpecifierType())
88 return;
89
90 // Print qualifiers as appropriate.
91
92 // CanPrefixQualifiers - We prefer to print type qualifiers before the type,
93 // so that we get "const int" instead of "int const", but we can't do this if
94 // the type is complex. For example if the type is "int*", we *must* print
95 // "int * const", printing "const int *" is different. Only do this when the
96 // type expands to a simple string.
97 bool CanPrefixQualifiers = false;
98 bool NeedARCStrongQualifier = false;
99 Type::TypeClass TC = T->getTypeClass();
100 if (const AutoType *AT = dyn_cast<AutoType>(T))
101 TC = AT->desugar()->getTypeClass();
102 if (const SubstTemplateTypeParmType *Subst
103 = dyn_cast<SubstTemplateTypeParmType>(T))
104 TC = Subst->getReplacementType()->getTypeClass();
105
106 switch (TC) {
107 case Type::Builtin:
108 case Type::Complex:
109 case Type::UnresolvedUsing:
110 case Type::Typedef:
111 case Type::TypeOfExpr:
112 case Type::TypeOf:
113 case Type::Decltype:
114 case Type::UnaryTransform:
115 case Type::Record:
116 case Type::Enum:
117 case Type::Elaborated:
118 case Type::TemplateTypeParm:
119 case Type::SubstTemplateTypeParmPack:
120 case Type::TemplateSpecialization:
121 case Type::InjectedClassName:
122 case Type::DependentName:
123 case Type::DependentTemplateSpecialization:
124 case Type::ObjCObject:
125 case Type::ObjCInterface:
126 CanPrefixQualifiers = true;
127 break;
128
129 case Type::ObjCObjectPointer:
130 CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() ||
131 T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType();
132 break;
133
134 case Type::ConstantArray:
135 case Type::IncompleteArray:
136 case Type::VariableArray:
137 case Type::DependentSizedArray:
138 NeedARCStrongQualifier = true;
139 // Fall through
140
141 case Type::Pointer:
142 case Type::BlockPointer:
143 case Type::LValueReference:
144 case Type::RValueReference:
145 case Type::MemberPointer:
146 case Type::DependentSizedExtVector:
147 case Type::Vector:
148 case Type::ExtVector:
149 case Type::FunctionProto:
150 case Type::FunctionNoProto:
151 case Type::Paren:
152 case Type::Attributed:
153 case Type::PackExpansion:
154 case Type::SubstTemplateTypeParm:
155 case Type::Auto:
156 CanPrefixQualifiers = false;
157 break;
158 }
159
160 if (!CanPrefixQualifiers && !Quals.empty()) {
161 std::string qualsBuffer;
162 if (NeedARCStrongQualifier) {
163 IncludeStrongLifetimeRAII Strong(Policy);
164 Quals.getAsStringInternal(qualsBuffer, Policy);
165 } else {
166 Quals.getAsStringInternal(qualsBuffer, Policy);
167 }
168
169 if (!qualsBuffer.empty()) {
170 if (!buffer.empty()) {
171 qualsBuffer += ' ';
172 qualsBuffer += buffer;
173 }
174 std::swap(buffer, qualsBuffer);
175 }
176 }
177
178 switch (T->getTypeClass()) {
179 #define ABSTRACT_TYPE(CLASS, PARENT)
180 #define TYPE(CLASS, PARENT) case Type::CLASS: \
181 print##CLASS(cast<CLASS##Type>(T), buffer); \
182 break;
183 #include "clang/AST/TypeNodes.def"
184 }
185
186 // If we're adding the qualifiers as a prefix, do it now.
187 if (CanPrefixQualifiers && !Quals.empty()) {
188 std::string qualsBuffer;
189 if (NeedARCStrongQualifier) {
190 IncludeStrongLifetimeRAII Strong(Policy);
191 Quals.getAsStringInternal(qualsBuffer, Policy);
192 } else {
193 Quals.getAsStringInternal(qualsBuffer, Policy);
194 }
195
196 if (!qualsBuffer.empty()) {
197 if (!buffer.empty()) {
198 qualsBuffer += ' ';
199 qualsBuffer += buffer;
200 }
201 std::swap(buffer, qualsBuffer);
202 }
203 }
204 }
205
printBuiltin(const BuiltinType * T,std::string & S)206 void TypePrinter::printBuiltin(const BuiltinType *T, std::string &S) {
207 if (S.empty()) {
208 S = T->getName(Policy.LangOpts);
209 } else {
210 // Prefix the basic type, e.g. 'int X'.
211 S = ' ' + S;
212 S = T->getName(Policy.LangOpts) + S;
213 }
214 }
215
printComplex(const ComplexType * T,std::string & S)216 void TypePrinter::printComplex(const ComplexType *T, std::string &S) {
217 print(T->getElementType(), S);
218 S = "_Complex " + S;
219 }
220
printPointer(const PointerType * T,std::string & S)221 void TypePrinter::printPointer(const PointerType *T, std::string &S) {
222 S = '*' + S;
223
224 // Handle things like 'int (*A)[4];' correctly.
225 // FIXME: this should include vectors, but vectors use attributes I guess.
226 if (isa<ArrayType>(T->getPointeeType()))
227 S = '(' + S + ')';
228
229 IncludeStrongLifetimeRAII Strong(Policy);
230 print(T->getPointeeType(), S);
231 }
232
printBlockPointer(const BlockPointerType * T,std::string & S)233 void TypePrinter::printBlockPointer(const BlockPointerType *T, std::string &S) {
234 S = '^' + S;
235 print(T->getPointeeType(), S);
236 }
237
printLValueReference(const LValueReferenceType * T,std::string & S)238 void TypePrinter::printLValueReference(const LValueReferenceType *T,
239 std::string &S) {
240 S = '&' + S;
241
242 // Handle things like 'int (&A)[4];' correctly.
243 // FIXME: this should include vectors, but vectors use attributes I guess.
244 if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
245 S = '(' + S + ')';
246
247 IncludeStrongLifetimeRAII Strong(Policy);
248 print(T->getPointeeTypeAsWritten(), S);
249 }
250
printRValueReference(const RValueReferenceType * T,std::string & S)251 void TypePrinter::printRValueReference(const RValueReferenceType *T,
252 std::string &S) {
253 S = "&&" + S;
254
255 // Handle things like 'int (&&A)[4];' correctly.
256 // FIXME: this should include vectors, but vectors use attributes I guess.
257 if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
258 S = '(' + S + ')';
259
260 IncludeStrongLifetimeRAII Strong(Policy);
261 print(T->getPointeeTypeAsWritten(), S);
262 }
263
printMemberPointer(const MemberPointerType * T,std::string & S)264 void TypePrinter::printMemberPointer(const MemberPointerType *T,
265 std::string &S) {
266 std::string C;
267 print(QualType(T->getClass(), 0), C);
268 C += "::*";
269 S = C + S;
270
271 // Handle things like 'int (Cls::*A)[4];' correctly.
272 // FIXME: this should include vectors, but vectors use attributes I guess.
273 if (isa<ArrayType>(T->getPointeeType()))
274 S = '(' + S + ')';
275
276 IncludeStrongLifetimeRAII Strong(Policy);
277 print(T->getPointeeType(), S);
278 }
279
printConstantArray(const ConstantArrayType * T,std::string & S)280 void TypePrinter::printConstantArray(const ConstantArrayType *T,
281 std::string &S) {
282 S += '[';
283 S += llvm::utostr(T->getSize().getZExtValue());
284 S += ']';
285
286 IncludeStrongLifetimeRAII Strong(Policy);
287 print(T->getElementType(), S);
288 }
289
printIncompleteArray(const IncompleteArrayType * T,std::string & S)290 void TypePrinter::printIncompleteArray(const IncompleteArrayType *T,
291 std::string &S) {
292 S += "[]";
293 IncludeStrongLifetimeRAII Strong(Policy);
294 print(T->getElementType(), S);
295 }
296
printVariableArray(const VariableArrayType * T,std::string & S)297 void TypePrinter::printVariableArray(const VariableArrayType *T,
298 std::string &S) {
299 S += '[';
300
301 if (T->getIndexTypeQualifiers().hasQualifiers()) {
302 AppendTypeQualList(S, T->getIndexTypeCVRQualifiers());
303 S += ' ';
304 }
305
306 if (T->getSizeModifier() == VariableArrayType::Static)
307 S += "static";
308 else if (T->getSizeModifier() == VariableArrayType::Star)
309 S += '*';
310
311 if (T->getSizeExpr()) {
312 std::string SStr;
313 llvm::raw_string_ostream s(SStr);
314 T->getSizeExpr()->printPretty(s, 0, Policy);
315 S += s.str();
316 }
317 S += ']';
318
319 IncludeStrongLifetimeRAII Strong(Policy);
320 print(T->getElementType(), S);
321 }
322
printDependentSizedArray(const DependentSizedArrayType * T,std::string & S)323 void TypePrinter::printDependentSizedArray(const DependentSizedArrayType *T,
324 std::string &S) {
325 S += '[';
326
327 if (T->getSizeExpr()) {
328 std::string SStr;
329 llvm::raw_string_ostream s(SStr);
330 T->getSizeExpr()->printPretty(s, 0, Policy);
331 S += s.str();
332 }
333 S += ']';
334
335 IncludeStrongLifetimeRAII Strong(Policy);
336 print(T->getElementType(), S);
337 }
338
printDependentSizedExtVector(const DependentSizedExtVectorType * T,std::string & S)339 void TypePrinter::printDependentSizedExtVector(
340 const DependentSizedExtVectorType *T,
341 std::string &S) {
342 print(T->getElementType(), S);
343
344 S += " __attribute__((ext_vector_type(";
345 if (T->getSizeExpr()) {
346 std::string SStr;
347 llvm::raw_string_ostream s(SStr);
348 T->getSizeExpr()->printPretty(s, 0, Policy);
349 S += s.str();
350 }
351 S += ")))";
352 }
353
printVector(const VectorType * T,std::string & S)354 void TypePrinter::printVector(const VectorType *T, std::string &S) {
355 switch (T->getVectorKind()) {
356 case VectorType::AltiVecPixel:
357 S = "__vector __pixel " + S;
358 break;
359 case VectorType::AltiVecBool:
360 print(T->getElementType(), S);
361 S = "__vector __bool " + S;
362 break;
363 case VectorType::AltiVecVector:
364 print(T->getElementType(), S);
365 S = "__vector " + S;
366 break;
367 case VectorType::NeonVector:
368 print(T->getElementType(), S);
369 S = ("__attribute__((neon_vector_type(" +
370 llvm::utostr_32(T->getNumElements()) + "))) " + S);
371 break;
372 case VectorType::NeonPolyVector:
373 print(T->getElementType(), S);
374 S = ("__attribute__((neon_polyvector_type(" +
375 llvm::utostr_32(T->getNumElements()) + "))) " + S);
376 break;
377 case VectorType::GenericVector: {
378 // FIXME: We prefer to print the size directly here, but have no way
379 // to get the size of the type.
380 print(T->getElementType(), S);
381 std::string V = "__attribute__((__vector_size__(";
382 V += llvm::utostr_32(T->getNumElements()); // convert back to bytes.
383 std::string ET;
384 print(T->getElementType(), ET);
385 V += " * sizeof(" + ET + ")))) ";
386 S = V + S;
387 break;
388 }
389 }
390 }
391
printExtVector(const ExtVectorType * T,std::string & S)392 void TypePrinter::printExtVector(const ExtVectorType *T, std::string &S) {
393 S += " __attribute__((ext_vector_type(";
394 S += llvm::utostr_32(T->getNumElements());
395 S += ")))";
396 print(T->getElementType(), S);
397 }
398
printFunctionProto(const FunctionProtoType * T,std::string & S)399 void TypePrinter::printFunctionProto(const FunctionProtoType *T,
400 std::string &S) {
401 // If needed for precedence reasons, wrap the inner part in grouping parens.
402 if (!S.empty())
403 S = "(" + S + ")";
404
405 S += "(";
406 std::string Tmp;
407 PrintingPolicy ParamPolicy(Policy);
408 ParamPolicy.SuppressSpecifiers = false;
409 for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
410 if (i) S += ", ";
411 print(T->getArgType(i), Tmp);
412 S += Tmp;
413 Tmp.clear();
414 }
415
416 if (T->isVariadic()) {
417 if (T->getNumArgs())
418 S += ", ";
419 S += "...";
420 } else if (T->getNumArgs() == 0 && !Policy.LangOpts.CPlusPlus) {
421 // Do not emit int() if we have a proto, emit 'int(void)'.
422 S += "void";
423 }
424
425 S += ")";
426
427 FunctionType::ExtInfo Info = T->getExtInfo();
428 switch(Info.getCC()) {
429 case CC_Default:
430 default: break;
431 case CC_C:
432 S += " __attribute__((cdecl))";
433 break;
434 case CC_X86StdCall:
435 S += " __attribute__((stdcall))";
436 break;
437 case CC_X86FastCall:
438 S += " __attribute__((fastcall))";
439 break;
440 case CC_X86ThisCall:
441 S += " __attribute__((thiscall))";
442 break;
443 case CC_X86Pascal:
444 S += " __attribute__((pascal))";
445 break;
446 case CC_AAPCS:
447 S += " __attribute__((pcs(\"aapcs\")))";
448 break;
449 case CC_AAPCS_VFP:
450 S += " __attribute__((pcs(\"aapcs-vfp\")))";
451 break;
452 }
453 if (Info.getNoReturn())
454 S += " __attribute__((noreturn))";
455 if (Info.getRegParm())
456 S += " __attribute__((regparm (" +
457 llvm::utostr_32(Info.getRegParm()) + ")))";
458
459 AppendTypeQualList(S, T->getTypeQuals());
460
461 switch (T->getRefQualifier()) {
462 case RQ_None:
463 break;
464
465 case RQ_LValue:
466 S += " &";
467 break;
468
469 case RQ_RValue:
470 S += " &&";
471 break;
472 }
473
474 if (T->hasDynamicExceptionSpec()) {
475 S += " throw(";
476 if (T->getExceptionSpecType() == EST_MSAny)
477 S += "...";
478 else
479 for (unsigned I = 0, N = T->getNumExceptions(); I != N; ++I) {
480 if (I)
481 S += ", ";
482
483 std::string ExceptionType;
484 print(T->getExceptionType(I), ExceptionType);
485 S += ExceptionType;
486 }
487 S += ")";
488 } else if (isNoexceptExceptionSpec(T->getExceptionSpecType())) {
489 S += " noexcept";
490 if (T->getExceptionSpecType() == EST_ComputedNoexcept) {
491 S += "(";
492 llvm::raw_string_ostream EOut(S);
493 T->getNoexceptExpr()->printPretty(EOut, 0, Policy);
494 EOut.flush();
495 S += EOut.str();
496 S += ")";
497 }
498 }
499
500 print(T->getResultType(), S);
501 }
502
printFunctionNoProto(const FunctionNoProtoType * T,std::string & S)503 void TypePrinter::printFunctionNoProto(const FunctionNoProtoType *T,
504 std::string &S) {
505 // If needed for precedence reasons, wrap the inner part in grouping parens.
506 if (!S.empty())
507 S = "(" + S + ")";
508
509 S += "()";
510 if (T->getNoReturnAttr())
511 S += " __attribute__((noreturn))";
512 print(T->getResultType(), S);
513 }
514
printTypeSpec(const NamedDecl * D,std::string & S)515 static void printTypeSpec(const NamedDecl *D, std::string &S) {
516 IdentifierInfo *II = D->getIdentifier();
517 if (S.empty())
518 S = II->getName().str();
519 else
520 S = II->getName().str() + ' ' + S;
521 }
522
printUnresolvedUsing(const UnresolvedUsingType * T,std::string & S)523 void TypePrinter::printUnresolvedUsing(const UnresolvedUsingType *T,
524 std::string &S) {
525 printTypeSpec(T->getDecl(), S);
526 }
527
printTypedef(const TypedefType * T,std::string & S)528 void TypePrinter::printTypedef(const TypedefType *T, std::string &S) {
529 printTypeSpec(T->getDecl(), S);
530 }
531
printTypeOfExpr(const TypeOfExprType * T,std::string & S)532 void TypePrinter::printTypeOfExpr(const TypeOfExprType *T, std::string &S) {
533 if (!S.empty()) // Prefix the basic type, e.g. 'typeof(e) X'.
534 S = ' ' + S;
535 std::string Str;
536 llvm::raw_string_ostream s(Str);
537 T->getUnderlyingExpr()->printPretty(s, 0, Policy);
538 S = "typeof " + s.str() + S;
539 }
540
printTypeOf(const TypeOfType * T,std::string & S)541 void TypePrinter::printTypeOf(const TypeOfType *T, std::string &S) {
542 if (!S.empty()) // Prefix the basic type, e.g. 'typeof(t) X'.
543 S = ' ' + S;
544 std::string Tmp;
545 print(T->getUnderlyingType(), Tmp);
546 S = "typeof(" + Tmp + ")" + S;
547 }
548
printDecltype(const DecltypeType * T,std::string & S)549 void TypePrinter::printDecltype(const DecltypeType *T, std::string &S) {
550 if (!S.empty()) // Prefix the basic type, e.g. 'decltype(t) X'.
551 S = ' ' + S;
552 std::string Str;
553 llvm::raw_string_ostream s(Str);
554 T->getUnderlyingExpr()->printPretty(s, 0, Policy);
555 S = "decltype(" + s.str() + ")" + S;
556 }
557
printUnaryTransform(const UnaryTransformType * T,std::string & S)558 void TypePrinter::printUnaryTransform(const UnaryTransformType *T,
559 std::string &S) {
560 if (!S.empty())
561 S = ' ' + S;
562 std::string Str;
563 IncludeStrongLifetimeRAII Strong(Policy);
564 print(T->getBaseType(), Str);
565
566 switch (T->getUTTKind()) {
567 case UnaryTransformType::EnumUnderlyingType:
568 S = "__underlying_type(" + Str + ")" + S;
569 break;
570 }
571 }
572
printAuto(const AutoType * T,std::string & S)573 void TypePrinter::printAuto(const AutoType *T, std::string &S) {
574 // If the type has been deduced, do not print 'auto'.
575 if (T->isDeduced()) {
576 print(T->getDeducedType(), S);
577 } else {
578 if (!S.empty()) // Prefix the basic type, e.g. 'auto X'.
579 S = ' ' + S;
580 S = "auto" + S;
581 }
582 }
583
584 /// Appends the given scope to the end of a string.
AppendScope(DeclContext * DC,std::string & Buffer)585 void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) {
586 if (DC->isTranslationUnit()) return;
587 AppendScope(DC->getParent(), Buffer);
588
589 unsigned OldSize = Buffer.size();
590
591 if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
592 if (NS->getIdentifier())
593 Buffer += NS->getNameAsString();
594 else
595 Buffer += "<anonymous>";
596 } else if (ClassTemplateSpecializationDecl *Spec
597 = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
598 IncludeStrongLifetimeRAII Strong(Policy);
599 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
600 std::string TemplateArgsStr
601 = TemplateSpecializationType::PrintTemplateArgumentList(
602 TemplateArgs.data(),
603 TemplateArgs.size(),
604 Policy);
605 Buffer += Spec->getIdentifier()->getName();
606 Buffer += TemplateArgsStr;
607 } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
608 if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
609 Buffer += Typedef->getIdentifier()->getName();
610 else if (Tag->getIdentifier())
611 Buffer += Tag->getIdentifier()->getName();
612 }
613
614 if (Buffer.size() != OldSize)
615 Buffer += "::";
616 }
617
printTag(TagDecl * D,std::string & InnerString)618 void TypePrinter::printTag(TagDecl *D, std::string &InnerString) {
619 if (Policy.SuppressTag)
620 return;
621
622 std::string Buffer;
623 bool HasKindDecoration = false;
624
625 // bool SuppressTagKeyword
626 // = Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword;
627
628 // We don't print tags unless this is an elaborated type.
629 // In C, we just assume every RecordType is an elaborated type.
630 if (!(Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword ||
631 D->getTypedefNameForAnonDecl())) {
632 HasKindDecoration = true;
633 Buffer += D->getKindName();
634 Buffer += ' ';
635 }
636
637 // Compute the full nested-name-specifier for this type.
638 // In C, this will always be empty except when the type
639 // being printed is anonymous within other Record.
640 if (!Policy.SuppressScope)
641 AppendScope(D->getDeclContext(), Buffer);
642
643 if (const IdentifierInfo *II = D->getIdentifier())
644 Buffer += II->getNameStart();
645 else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
646 assert(Typedef->getIdentifier() && "Typedef without identifier?");
647 Buffer += Typedef->getIdentifier()->getNameStart();
648 } else {
649 // Make an unambiguous representation for anonymous types, e.g.
650 // <anonymous enum at /usr/include/string.h:120:9>
651 llvm::raw_string_ostream OS(Buffer);
652 OS << "<anonymous";
653
654 if (Policy.AnonymousTagLocations) {
655 // Suppress the redundant tag keyword if we just printed one.
656 // We don't have to worry about ElaboratedTypes here because you can't
657 // refer to an anonymous type with one.
658 if (!HasKindDecoration)
659 OS << " " << D->getKindName();
660
661 PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
662 D->getLocation());
663 if (PLoc.isValid()) {
664 OS << " at " << PLoc.getFilename()
665 << ':' << PLoc.getLine()
666 << ':' << PLoc.getColumn();
667 }
668 }
669
670 OS << '>';
671 }
672
673 // If this is a class template specialization, print the template
674 // arguments.
675 if (ClassTemplateSpecializationDecl *Spec
676 = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
677 const TemplateArgument *Args;
678 unsigned NumArgs;
679 if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
680 const TemplateSpecializationType *TST =
681 cast<TemplateSpecializationType>(TAW->getType());
682 Args = TST->getArgs();
683 NumArgs = TST->getNumArgs();
684 } else {
685 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
686 Args = TemplateArgs.data();
687 NumArgs = TemplateArgs.size();
688 }
689 IncludeStrongLifetimeRAII Strong(Policy);
690 Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args,
691 NumArgs,
692 Policy);
693 }
694
695 if (!InnerString.empty()) {
696 Buffer += ' ';
697 Buffer += InnerString;
698 }
699
700 std::swap(Buffer, InnerString);
701 }
702
printRecord(const RecordType * T,std::string & S)703 void TypePrinter::printRecord(const RecordType *T, std::string &S) {
704 printTag(T->getDecl(), S);
705 }
706
printEnum(const EnumType * T,std::string & S)707 void TypePrinter::printEnum(const EnumType *T, std::string &S) {
708 printTag(T->getDecl(), S);
709 }
710
printTemplateTypeParm(const TemplateTypeParmType * T,std::string & S)711 void TypePrinter::printTemplateTypeParm(const TemplateTypeParmType *T,
712 std::string &S) {
713 if (!S.empty()) // Prefix the basic type, e.g. 'parmname X'.
714 S = ' ' + S;
715
716 if (IdentifierInfo *Id = T->getIdentifier())
717 S = Id->getName().str() + S;
718 else
719 S = "type-parameter-" + llvm::utostr_32(T->getDepth()) + '-' +
720 llvm::utostr_32(T->getIndex()) + S;
721 }
722
printSubstTemplateTypeParm(const SubstTemplateTypeParmType * T,std::string & S)723 void TypePrinter::printSubstTemplateTypeParm(const SubstTemplateTypeParmType *T,
724 std::string &S) {
725 IncludeStrongLifetimeRAII Strong(Policy);
726 print(T->getReplacementType(), S);
727 }
728
printSubstTemplateTypeParmPack(const SubstTemplateTypeParmPackType * T,std::string & S)729 void TypePrinter::printSubstTemplateTypeParmPack(
730 const SubstTemplateTypeParmPackType *T,
731 std::string &S) {
732 IncludeStrongLifetimeRAII Strong(Policy);
733 printTemplateTypeParm(T->getReplacedParameter(), S);
734 }
735
printTemplateSpecialization(const TemplateSpecializationType * T,std::string & S)736 void TypePrinter::printTemplateSpecialization(
737 const TemplateSpecializationType *T,
738 std::string &S) {
739 IncludeStrongLifetimeRAII Strong(Policy);
740 std::string SpecString;
741
742 {
743 llvm::raw_string_ostream OS(SpecString);
744 T->getTemplateName().print(OS, Policy);
745 }
746
747 SpecString += TemplateSpecializationType::PrintTemplateArgumentList(
748 T->getArgs(),
749 T->getNumArgs(),
750 Policy);
751 if (S.empty())
752 S.swap(SpecString);
753 else
754 S = SpecString + ' ' + S;
755 }
756
printInjectedClassName(const InjectedClassNameType * T,std::string & S)757 void TypePrinter::printInjectedClassName(const InjectedClassNameType *T,
758 std::string &S) {
759 printTemplateSpecialization(T->getInjectedTST(), S);
760 }
761
printElaborated(const ElaboratedType * T,std::string & S)762 void TypePrinter::printElaborated(const ElaboratedType *T, std::string &S) {
763 std::string MyString;
764
765 {
766 llvm::raw_string_ostream OS(MyString);
767 OS << TypeWithKeyword::getKeywordName(T->getKeyword());
768 if (T->getKeyword() != ETK_None)
769 OS << " ";
770 NestedNameSpecifier* Qualifier = T->getQualifier();
771 if (Qualifier)
772 Qualifier->print(OS, Policy);
773 }
774
775 std::string TypeStr;
776 PrintingPolicy InnerPolicy(Policy);
777 InnerPolicy.SuppressTagKeyword = true;
778 InnerPolicy.SuppressScope = true;
779 TypePrinter(InnerPolicy).print(T->getNamedType(), TypeStr);
780
781 MyString += TypeStr;
782 if (S.empty())
783 S.swap(MyString);
784 else
785 S = MyString + ' ' + S;
786 }
787
printParen(const ParenType * T,std::string & S)788 void TypePrinter::printParen(const ParenType *T, std::string &S) {
789 if (!S.empty() && !isa<FunctionType>(T->getInnerType()))
790 S = '(' + S + ')';
791 print(T->getInnerType(), S);
792 }
793
printDependentName(const DependentNameType * T,std::string & S)794 void TypePrinter::printDependentName(const DependentNameType *T, std::string &S) {
795 std::string MyString;
796
797 {
798 llvm::raw_string_ostream OS(MyString);
799 OS << TypeWithKeyword::getKeywordName(T->getKeyword());
800 if (T->getKeyword() != ETK_None)
801 OS << " ";
802
803 T->getQualifier()->print(OS, Policy);
804
805 OS << T->getIdentifier()->getName();
806 }
807
808 if (S.empty())
809 S.swap(MyString);
810 else
811 S = MyString + ' ' + S;
812 }
813
printDependentTemplateSpecialization(const DependentTemplateSpecializationType * T,std::string & S)814 void TypePrinter::printDependentTemplateSpecialization(
815 const DependentTemplateSpecializationType *T, std::string &S) {
816 IncludeStrongLifetimeRAII Strong(Policy);
817 std::string MyString;
818 {
819 llvm::raw_string_ostream OS(MyString);
820
821 OS << TypeWithKeyword::getKeywordName(T->getKeyword());
822 if (T->getKeyword() != ETK_None)
823 OS << " ";
824
825 if (T->getQualifier())
826 T->getQualifier()->print(OS, Policy);
827 OS << T->getIdentifier()->getName();
828 OS << TemplateSpecializationType::PrintTemplateArgumentList(
829 T->getArgs(),
830 T->getNumArgs(),
831 Policy);
832 }
833
834 if (S.empty())
835 S.swap(MyString);
836 else
837 S = MyString + ' ' + S;
838 }
839
printPackExpansion(const PackExpansionType * T,std::string & S)840 void TypePrinter::printPackExpansion(const PackExpansionType *T,
841 std::string &S) {
842 print(T->getPattern(), S);
843 S += "...";
844 }
845
printAttributed(const AttributedType * T,std::string & S)846 void TypePrinter::printAttributed(const AttributedType *T,
847 std::string &S) {
848 // Prefer the macro forms of the GC and ownership qualifiers.
849 if (T->getAttrKind() == AttributedType::attr_objc_gc ||
850 T->getAttrKind() == AttributedType::attr_objc_ownership)
851 return print(T->getEquivalentType(), S);
852
853 print(T->getModifiedType(), S);
854
855 // TODO: not all attributes are GCC-style attributes.
856 S += " __attribute__((";
857 switch (T->getAttrKind()) {
858 case AttributedType::attr_address_space:
859 S += "address_space(";
860 S += T->getEquivalentType().getAddressSpace();
861 S += ")";
862 break;
863
864 case AttributedType::attr_vector_size: {
865 S += "__vector_size__(";
866 if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) {
867 S += vector->getNumElements();
868 S += " * sizeof(";
869
870 std::string tmp;
871 print(vector->getElementType(), tmp);
872 S += tmp;
873 S += ")";
874 }
875 S += ")";
876 break;
877 }
878
879 case AttributedType::attr_neon_vector_type:
880 case AttributedType::attr_neon_polyvector_type: {
881 if (T->getAttrKind() == AttributedType::attr_neon_vector_type)
882 S += "neon_vector_type(";
883 else
884 S += "neon_polyvector_type(";
885 const VectorType *vector = T->getEquivalentType()->getAs<VectorType>();
886 S += llvm::utostr_32(vector->getNumElements());
887 S += ")";
888 break;
889 }
890
891 case AttributedType::attr_regparm: {
892 S += "regparm(";
893 QualType t = T->getEquivalentType();
894 while (!t->isFunctionType())
895 t = t->getPointeeType();
896 S += t->getAs<FunctionType>()->getRegParmType();
897 S += ")";
898 break;
899 }
900
901 case AttributedType::attr_objc_gc: {
902 S += "objc_gc(";
903
904 QualType tmp = T->getEquivalentType();
905 while (tmp.getObjCGCAttr() == Qualifiers::GCNone) {
906 QualType next = tmp->getPointeeType();
907 if (next == tmp) break;
908 tmp = next;
909 }
910
911 if (tmp.isObjCGCWeak())
912 S += "weak";
913 else
914 S += "strong";
915 S += ")";
916 break;
917 }
918
919 case AttributedType::attr_objc_ownership:
920 S += "objc_ownership(";
921 switch (T->getEquivalentType().getObjCLifetime()) {
922 case Qualifiers::OCL_None: llvm_unreachable("no ownership!"); break;
923 case Qualifiers::OCL_ExplicitNone: S += "none"; break;
924 case Qualifiers::OCL_Strong: S += "strong"; break;
925 case Qualifiers::OCL_Weak: S += "weak"; break;
926 case Qualifiers::OCL_Autoreleasing: S += "autoreleasing"; break;
927 }
928 S += ")";
929 break;
930
931 case AttributedType::attr_noreturn: S += "noreturn"; break;
932 case AttributedType::attr_cdecl: S += "cdecl"; break;
933 case AttributedType::attr_fastcall: S += "fastcall"; break;
934 case AttributedType::attr_stdcall: S += "stdcall"; break;
935 case AttributedType::attr_thiscall: S += "thiscall"; break;
936 case AttributedType::attr_pascal: S += "pascal"; break;
937 case AttributedType::attr_pcs: {
938 S += "pcs(";
939 QualType t = T->getEquivalentType();
940 while (!t->isFunctionType())
941 t = t->getPointeeType();
942 S += (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ?
943 "\"aapcs\"" : "\"aapcs-vfp\"");
944 S += ")";
945 break;
946 }
947 }
948 S += "))";
949 }
950
printObjCInterface(const ObjCInterfaceType * T,std::string & S)951 void TypePrinter::printObjCInterface(const ObjCInterfaceType *T,
952 std::string &S) {
953 if (!S.empty()) // Prefix the basic type, e.g. 'typedefname X'.
954 S = ' ' + S;
955
956 std::string ObjCQIString = T->getDecl()->getNameAsString();
957 S = ObjCQIString + S;
958 }
959
printObjCObject(const ObjCObjectType * T,std::string & S)960 void TypePrinter::printObjCObject(const ObjCObjectType *T,
961 std::string &S) {
962 if (T->qual_empty())
963 return print(T->getBaseType(), S);
964
965 std::string tmp;
966 print(T->getBaseType(), tmp);
967 tmp += '<';
968 bool isFirst = true;
969 for (ObjCObjectType::qual_iterator
970 I = T->qual_begin(), E = T->qual_end(); I != E; ++I) {
971 if (isFirst)
972 isFirst = false;
973 else
974 tmp += ',';
975 tmp += (*I)->getNameAsString();
976 }
977 tmp += '>';
978
979 if (!S.empty()) {
980 tmp += ' ';
981 tmp += S;
982 }
983 std::swap(tmp, S);
984 }
985
printObjCObjectPointer(const ObjCObjectPointerType * T,std::string & S)986 void TypePrinter::printObjCObjectPointer(const ObjCObjectPointerType *T,
987 std::string &S) {
988 std::string ObjCQIString;
989
990 T->getPointeeType().getLocalQualifiers().getAsStringInternal(ObjCQIString,
991 Policy);
992 if (!ObjCQIString.empty())
993 ObjCQIString += ' ';
994
995 if (T->isObjCIdType() || T->isObjCQualifiedIdType())
996 ObjCQIString += "id";
997 else if (T->isObjCClassType() || T->isObjCQualifiedClassType())
998 ObjCQIString += "Class";
999 else if (T->isObjCSelType())
1000 ObjCQIString += "SEL";
1001 else
1002 ObjCQIString += T->getInterfaceDecl()->getNameAsString();
1003
1004 if (!T->qual_empty()) {
1005 ObjCQIString += '<';
1006 for (ObjCObjectPointerType::qual_iterator I = T->qual_begin(),
1007 E = T->qual_end();
1008 I != E; ++I) {
1009 ObjCQIString += (*I)->getNameAsString();
1010 if (I+1 != E)
1011 ObjCQIString += ',';
1012 }
1013 ObjCQIString += '>';
1014 }
1015
1016 if (!T->isObjCIdType() && !T->isObjCQualifiedIdType())
1017 ObjCQIString += " *"; // Don't forget the implicit pointer.
1018 else if (!S.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1019 S = ' ' + S;
1020
1021 S = ObjCQIString + S;
1022 }
1023
1024 std::string TemplateSpecializationType::
PrintTemplateArgumentList(const TemplateArgumentListInfo & Args,const PrintingPolicy & Policy)1025 PrintTemplateArgumentList(const TemplateArgumentListInfo &Args,
1026 const PrintingPolicy &Policy) {
1027 return PrintTemplateArgumentList(Args.getArgumentArray(),
1028 Args.size(),
1029 Policy);
1030 }
1031
1032 std::string
PrintTemplateArgumentList(const TemplateArgument * Args,unsigned NumArgs,const PrintingPolicy & Policy,bool SkipBrackets)1033 TemplateSpecializationType::PrintTemplateArgumentList(
1034 const TemplateArgument *Args,
1035 unsigned NumArgs,
1036 const PrintingPolicy &Policy,
1037 bool SkipBrackets) {
1038 std::string SpecString;
1039 if (!SkipBrackets)
1040 SpecString += '<';
1041
1042 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1043 if (SpecString.size() > unsigned(!SkipBrackets))
1044 SpecString += ", ";
1045
1046 // Print the argument into a string.
1047 std::string ArgString;
1048 if (Args[Arg].getKind() == TemplateArgument::Pack) {
1049 ArgString = PrintTemplateArgumentList(Args[Arg].pack_begin(),
1050 Args[Arg].pack_size(),
1051 Policy, true);
1052 } else {
1053 llvm::raw_string_ostream ArgOut(ArgString);
1054 Args[Arg].print(Policy, ArgOut);
1055 }
1056
1057 // If this is the first argument and its string representation
1058 // begins with the global scope specifier ('::foo'), add a space
1059 // to avoid printing the diagraph '<:'.
1060 if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1061 SpecString += ' ';
1062
1063 SpecString += ArgString;
1064 }
1065
1066 // If the last character of our string is '>', add another space to
1067 // keep the two '>''s separate tokens. We don't *have* to do this in
1068 // C++0x, but it's still good hygiene.
1069 if (!SpecString.empty() && SpecString[SpecString.size() - 1] == '>')
1070 SpecString += ' ';
1071
1072 if (!SkipBrackets)
1073 SpecString += '>';
1074
1075 return SpecString;
1076 }
1077
1078 // Sadly, repeat all that with TemplateArgLoc.
1079 std::string TemplateSpecializationType::
PrintTemplateArgumentList(const TemplateArgumentLoc * Args,unsigned NumArgs,const PrintingPolicy & Policy)1080 PrintTemplateArgumentList(const TemplateArgumentLoc *Args, unsigned NumArgs,
1081 const PrintingPolicy &Policy) {
1082 std::string SpecString;
1083 SpecString += '<';
1084 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1085 if (SpecString.size() > 1)
1086 SpecString += ", ";
1087
1088 // Print the argument into a string.
1089 std::string ArgString;
1090 if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) {
1091 ArgString = PrintTemplateArgumentList(
1092 Args[Arg].getArgument().pack_begin(),
1093 Args[Arg].getArgument().pack_size(),
1094 Policy, true);
1095 } else {
1096 llvm::raw_string_ostream ArgOut(ArgString);
1097 Args[Arg].getArgument().print(Policy, ArgOut);
1098 }
1099
1100 // If this is the first argument and its string representation
1101 // begins with the global scope specifier ('::foo'), add a space
1102 // to avoid printing the diagraph '<:'.
1103 if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1104 SpecString += ' ';
1105
1106 SpecString += ArgString;
1107 }
1108
1109 // If the last character of our string is '>', add another space to
1110 // keep the two '>''s separate tokens. We don't *have* to do this in
1111 // C++0x, but it's still good hygiene.
1112 if (SpecString[SpecString.size() - 1] == '>')
1113 SpecString += ' ';
1114
1115 SpecString += '>';
1116
1117 return SpecString;
1118 }
1119
dump(const char * msg) const1120 void QualType::dump(const char *msg) const {
1121 std::string R = "identifier";
1122 LangOptions LO;
1123 getAsStringInternal(R, PrintingPolicy(LO));
1124 if (msg)
1125 llvm::errs() << msg << ": ";
1126 llvm::errs() << R << "\n";
1127 }
dump() const1128 void QualType::dump() const {
1129 dump("");
1130 }
1131
dump() const1132 void Type::dump() const {
1133 QualType(this, 0).dump();
1134 }
1135
getAsString() const1136 std::string Qualifiers::getAsString() const {
1137 LangOptions LO;
1138 return getAsString(PrintingPolicy(LO));
1139 }
1140
1141 // Appends qualifiers to the given string, separated by spaces. Will
1142 // prefix a space if the string is non-empty. Will not append a final
1143 // space.
getAsStringInternal(std::string & S,const PrintingPolicy & Policy) const1144 void Qualifiers::getAsStringInternal(std::string &S,
1145 const PrintingPolicy& Policy) const {
1146 AppendTypeQualList(S, getCVRQualifiers());
1147 if (unsigned addrspace = getAddressSpace()) {
1148 if (!S.empty()) S += ' ';
1149 S += "__attribute__((address_space(";
1150 S += llvm::utostr_32(addrspace);
1151 S += ")))";
1152 }
1153 if (Qualifiers::GC gc = getObjCGCAttr()) {
1154 if (!S.empty()) S += ' ';
1155 if (gc == Qualifiers::Weak)
1156 S += "__weak";
1157 else
1158 S += "__strong";
1159 }
1160 if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
1161 if (!S.empty() &&
1162 !(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
1163 S += ' ';
1164
1165 switch (lifetime) {
1166 case Qualifiers::OCL_None: llvm_unreachable("none but true");
1167 case Qualifiers::OCL_ExplicitNone: S += "__unsafe_unretained"; break;
1168 case Qualifiers::OCL_Strong:
1169 if (!Policy.SuppressStrongLifetime)
1170 S += "__strong";
1171 break;
1172
1173 case Qualifiers::OCL_Weak: S += "__weak"; break;
1174 case Qualifiers::OCL_Autoreleasing: S += "__autoreleasing"; break;
1175 }
1176 }
1177 }
1178
getAsString(const Type * ty,Qualifiers qs)1179 std::string QualType::getAsString(const Type *ty, Qualifiers qs) {
1180 std::string buffer;
1181 LangOptions options;
1182 getAsStringInternal(ty, qs, buffer, PrintingPolicy(options));
1183 return buffer;
1184 }
1185
getAsStringInternal(const Type * ty,Qualifiers qs,std::string & buffer,const PrintingPolicy & policy)1186 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
1187 std::string &buffer,
1188 const PrintingPolicy &policy) {
1189 TypePrinter(policy).print(ty, qs, buffer);
1190 }
1191