xref: /llvm-project/clang/tools/libclang/CXType.cpp (revision 1682deed0fd02c6aca98154e8e9cf6c573ff6d45)
1 //===- CXType.cpp - Implements 'CXTypes' aspect of libclang ---------------===//
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 the 'CXTypes' API hooks in the Clang-C library.
10 //
11 //===--------------------------------------------------------------------===//
12 
13 #include "CXType.h"
14 #include "CIndexer.h"
15 #include "CXCursor.h"
16 #include "CXString.h"
17 #include "CXTranslationUnit.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/RecordLayout.h"
23 #include "clang/AST/Type.h"
24 #include "clang/Basic/AddressSpaces.h"
25 #include "clang/Frontend/ASTUnit.h"
26 #include <optional>
27 
28 using namespace clang;
29 
30 static CXTypeKind GetBuiltinTypeKind(const BuiltinType *BT) {
31 #define BTCASE(K) case BuiltinType::K: return CXType_##K
32   switch (BT->getKind()) {
33     BTCASE(Void);
34     BTCASE(Bool);
35     BTCASE(Char_U);
36     BTCASE(UChar);
37     BTCASE(Char16);
38     BTCASE(Char32);
39     BTCASE(UShort);
40     BTCASE(UInt);
41     BTCASE(ULong);
42     BTCASE(ULongLong);
43     BTCASE(UInt128);
44     BTCASE(Char_S);
45     BTCASE(SChar);
46     case BuiltinType::WChar_S: return CXType_WChar;
47     case BuiltinType::WChar_U: return CXType_WChar;
48     BTCASE(Short);
49     BTCASE(Int);
50     BTCASE(Long);
51     BTCASE(LongLong);
52     BTCASE(Int128);
53     BTCASE(Half);
54     BTCASE(Float);
55     BTCASE(Double);
56     BTCASE(LongDouble);
57     BTCASE(ShortAccum);
58     BTCASE(Accum);
59     BTCASE(LongAccum);
60     BTCASE(UShortAccum);
61     BTCASE(UAccum);
62     BTCASE(ULongAccum);
63     BTCASE(Float16);
64     BTCASE(Float128);
65     BTCASE(Ibm128);
66     BTCASE(NullPtr);
67     BTCASE(Overload);
68     BTCASE(Dependent);
69     BTCASE(ObjCId);
70     BTCASE(ObjCClass);
71     BTCASE(ObjCSel);
72 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) BTCASE(Id);
73 #include "clang/Basic/OpenCLImageTypes.def"
74 #undef IMAGE_TYPE
75 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) BTCASE(Id);
76 #include "clang/Basic/OpenCLExtensionTypes.def"
77     BTCASE(OCLSampler);
78     BTCASE(OCLEvent);
79     BTCASE(OCLQueue);
80     BTCASE(OCLReserveID);
81 #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) BTCASE(Id);
82 #include "clang/Basic/HLSLIntangibleTypes.def"
83     default:
84       return CXType_Unexposed;
85     }
86 #undef BTCASE
87 }
88 
89 static CXTypeKind GetTypeKind(QualType T) {
90   const Type *TP = T.getTypePtrOrNull();
91   if (!TP)
92     return CXType_Invalid;
93 
94 #define TKCASE(K) case Type::K: return CXType_##K
95   switch (TP->getTypeClass()) {
96     case Type::Builtin:
97       return GetBuiltinTypeKind(cast<BuiltinType>(TP));
98     TKCASE(Complex);
99     TKCASE(Pointer);
100     TKCASE(BlockPointer);
101     TKCASE(LValueReference);
102     TKCASE(RValueReference);
103     TKCASE(Record);
104     TKCASE(Enum);
105     TKCASE(Typedef);
106     TKCASE(ObjCInterface);
107     TKCASE(ObjCObject);
108     TKCASE(ObjCObjectPointer);
109     TKCASE(ObjCTypeParam);
110     TKCASE(FunctionNoProto);
111     TKCASE(FunctionProto);
112     TKCASE(ConstantArray);
113     TKCASE(IncompleteArray);
114     TKCASE(VariableArray);
115     TKCASE(DependentSizedArray);
116     TKCASE(Vector);
117     TKCASE(ExtVector);
118     TKCASE(MemberPointer);
119     TKCASE(Auto);
120     TKCASE(Elaborated);
121     TKCASE(Pipe);
122     TKCASE(Attributed);
123     TKCASE(BTFTagAttributed);
124     TKCASE(Atomic);
125     default:
126       return CXType_Unexposed;
127   }
128 #undef TKCASE
129 }
130 
131 
132 CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
133   CXTypeKind TK = CXType_Invalid;
134 
135   if (TU && !T.isNull()) {
136     // Handle attributed types as the original type
137     if (auto *ATT = T->getAs<AttributedType>()) {
138       if (!(TU->ParsingOptions & CXTranslationUnit_IncludeAttributedTypes)) {
139         // Return the equivalent type which represents the canonically
140         // equivalent type.
141         return MakeCXType(ATT->getEquivalentType(), TU);
142       }
143     }
144     if (auto *ATT = T->getAs<BTFTagAttributedType>()) {
145       if (!(TU->ParsingOptions & CXTranslationUnit_IncludeAttributedTypes))
146         return MakeCXType(ATT->getWrappedType(), TU);
147     }
148     // Handle paren types as the original type
149     if (auto *PTT = T->getAs<ParenType>()) {
150       return MakeCXType(PTT->getInnerType(), TU);
151     }
152 
153     ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext();
154     if (Ctx.getLangOpts().ObjC) {
155       QualType UnqualT = T.getUnqualifiedType();
156       if (Ctx.isObjCIdType(UnqualT))
157         TK = CXType_ObjCId;
158       else if (Ctx.isObjCClassType(UnqualT))
159         TK = CXType_ObjCClass;
160       else if (Ctx.isObjCSelType(UnqualT))
161         TK = CXType_ObjCSel;
162     }
163 
164     /* Handle decayed types as the original type */
165     if (const DecayedType *DT = T->getAs<DecayedType>()) {
166       return MakeCXType(DT->getOriginalType(), TU);
167     }
168   }
169   if (TK == CXType_Invalid)
170     TK = GetTypeKind(T);
171 
172   CXType CT = { TK, { TK == CXType_Invalid ? nullptr
173                                            : T.getAsOpaquePtr(), TU } };
174   return CT;
175 }
176 
177 using cxtype::MakeCXType;
178 
179 static inline QualType GetQualType(CXType CT) {
180   return QualType::getFromOpaquePtr(CT.data[0]);
181 }
182 
183 static inline CXTranslationUnit GetTU(CXType CT) {
184   return static_cast<CXTranslationUnit>(CT.data[1]);
185 }
186 
187 static std::optional<ArrayRef<TemplateArgument>>
188 GetTemplateArguments(QualType Type) {
189   assert(!Type.isNull());
190   if (const auto *Specialization = Type->getAs<TemplateSpecializationType>())
191     return Specialization->template_arguments();
192 
193   if (const auto *RecordDecl = Type->getAsCXXRecordDecl()) {
194     const auto *TemplateDecl =
195       dyn_cast<ClassTemplateSpecializationDecl>(RecordDecl);
196     if (TemplateDecl)
197       return TemplateDecl->getTemplateArgs().asArray();
198   }
199 
200   return std::nullopt;
201 }
202 
203 static std::optional<QualType>
204 TemplateArgumentToQualType(const TemplateArgument &A) {
205   if (A.getKind() == TemplateArgument::Type)
206     return A.getAsType();
207   return std::nullopt;
208 }
209 
210 static std::optional<QualType>
211 FindTemplateArgumentTypeAt(ArrayRef<TemplateArgument> TA, unsigned index) {
212   unsigned current = 0;
213   for (const auto &A : TA) {
214     if (A.getKind() == TemplateArgument::Pack) {
215       if (index < current + A.pack_size())
216         return TemplateArgumentToQualType(A.getPackAsArray()[index - current]);
217       current += A.pack_size();
218       continue;
219     }
220     if (current == index)
221       return TemplateArgumentToQualType(A);
222     current++;
223   }
224   return std::nullopt;
225 }
226 
227 CXType clang_getCursorType(CXCursor C) {
228   using namespace cxcursor;
229 
230   CXTranslationUnit TU = cxcursor::getCursorTU(C);
231   if (!TU)
232     return MakeCXType(QualType(), TU);
233 
234   ASTContext &Context = cxtu::getASTUnit(TU)->getASTContext();
235   if (clang_isExpression(C.kind)) {
236     QualType T = cxcursor::getCursorExpr(C)->getType();
237     return MakeCXType(T, TU);
238   }
239 
240   if (clang_isDeclaration(C.kind)) {
241     const Decl *D = cxcursor::getCursorDecl(C);
242     if (!D)
243       return MakeCXType(QualType(), TU);
244 
245     if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
246       return MakeCXType(Context.getTypeDeclType(TD), TU);
247     if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
248       return MakeCXType(Context.getObjCInterfaceType(ID), TU);
249     if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D))
250       return MakeCXType(DD->getType(), TU);
251     if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
252       return MakeCXType(VD->getType(), TU);
253     if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
254       return MakeCXType(PD->getType(), TU);
255     if (const FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D))
256       return MakeCXType(FTD->getTemplatedDecl()->getType(), TU);
257     return MakeCXType(QualType(), TU);
258   }
259 
260   if (clang_isReference(C.kind)) {
261     switch (C.kind) {
262     case CXCursor_ObjCSuperClassRef: {
263       QualType T
264         = Context.getObjCInterfaceType(getCursorObjCSuperClassRef(C).first);
265       return MakeCXType(T, TU);
266     }
267 
268     case CXCursor_ObjCClassRef: {
269       QualType T = Context.getObjCInterfaceType(getCursorObjCClassRef(C).first);
270       return MakeCXType(T, TU);
271     }
272 
273     case CXCursor_TypeRef: {
274       QualType T = Context.getTypeDeclType(getCursorTypeRef(C).first);
275       return MakeCXType(T, TU);
276 
277     }
278 
279     case CXCursor_CXXBaseSpecifier:
280       return cxtype::MakeCXType(getCursorCXXBaseSpecifier(C)->getType(), TU);
281 
282     case CXCursor_MemberRef:
283       return cxtype::MakeCXType(getCursorMemberRef(C).first->getType(), TU);
284 
285     case CXCursor_VariableRef:
286       return cxtype::MakeCXType(getCursorVariableRef(C).first->getType(), TU);
287 
288     case CXCursor_ObjCProtocolRef:
289     case CXCursor_TemplateRef:
290     case CXCursor_NamespaceRef:
291     case CXCursor_OverloadedDeclRef:
292     default:
293       break;
294     }
295 
296     return MakeCXType(QualType(), TU);
297   }
298 
299   return MakeCXType(QualType(), TU);
300 }
301 
302 CXString clang_getTypeSpelling(CXType CT) {
303   QualType T = GetQualType(CT);
304   if (T.isNull())
305     return cxstring::createEmpty();
306 
307   CXTranslationUnit TU = GetTU(CT);
308   SmallString<64> Str;
309   llvm::raw_svector_ostream OS(Str);
310   PrintingPolicy PP(cxtu::getASTUnit(TU)->getASTContext().getLangOpts());
311 
312   T.print(OS, PP);
313 
314   return cxstring::createDup(OS.str());
315 }
316 
317 CXString clang_getTypePrettyPrinted(CXType CT, CXPrintingPolicy cxPolicy) {
318   QualType T = GetQualType(CT);
319   if (T.isNull())
320     return cxstring::createEmpty();
321 
322   SmallString<64> Str;
323   llvm::raw_svector_ostream OS(Str);
324   PrintingPolicy *UserPolicy = static_cast<PrintingPolicy *>(cxPolicy);
325 
326   T.print(OS, *UserPolicy);
327 
328   return cxstring::createDup(OS.str());
329 }
330 
331 CXType clang_getTypedefDeclUnderlyingType(CXCursor C) {
332   using namespace cxcursor;
333   CXTranslationUnit TU = cxcursor::getCursorTU(C);
334 
335   if (clang_isDeclaration(C.kind)) {
336     const Decl *D = cxcursor::getCursorDecl(C);
337 
338     if (const TypedefNameDecl *TD = dyn_cast_or_null<TypedefNameDecl>(D)) {
339       QualType T = TD->getUnderlyingType();
340       return MakeCXType(T, TU);
341     }
342   }
343 
344   return MakeCXType(QualType(), TU);
345 }
346 
347 CXType clang_getEnumDeclIntegerType(CXCursor C) {
348   using namespace cxcursor;
349   CXTranslationUnit TU = cxcursor::getCursorTU(C);
350 
351   if (clang_isDeclaration(C.kind)) {
352     const Decl *D = cxcursor::getCursorDecl(C);
353 
354     if (const EnumDecl *TD = dyn_cast_or_null<EnumDecl>(D)) {
355       QualType T = TD->getIntegerType();
356       return MakeCXType(T, TU);
357     }
358   }
359 
360   return MakeCXType(QualType(), TU);
361 }
362 
363 long long clang_getEnumConstantDeclValue(CXCursor C) {
364   using namespace cxcursor;
365 
366   if (clang_isDeclaration(C.kind)) {
367     const Decl *D = cxcursor::getCursorDecl(C);
368 
369     if (const EnumConstantDecl *TD = dyn_cast_or_null<EnumConstantDecl>(D)) {
370       return TD->getInitVal().getSExtValue();
371     }
372   }
373 
374   return LLONG_MIN;
375 }
376 
377 unsigned long long clang_getEnumConstantDeclUnsignedValue(CXCursor C) {
378   using namespace cxcursor;
379 
380   if (clang_isDeclaration(C.kind)) {
381     const Decl *D = cxcursor::getCursorDecl(C);
382 
383     if (const EnumConstantDecl *TD = dyn_cast_or_null<EnumConstantDecl>(D)) {
384       return TD->getInitVal().getZExtValue();
385     }
386   }
387 
388   return ULLONG_MAX;
389 }
390 
391 int clang_getFieldDeclBitWidth(CXCursor C) {
392   using namespace cxcursor;
393 
394   if (clang_isDeclaration(C.kind)) {
395     const Decl *D = getCursorDecl(C);
396 
397     if (const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
398       if (FD->isBitField() && !FD->getBitWidth()->isValueDependent())
399         return FD->getBitWidthValue();
400     }
401   }
402 
403   return -1;
404 }
405 
406 CXType clang_getCanonicalType(CXType CT) {
407   if (CT.kind == CXType_Invalid)
408     return CT;
409 
410   QualType T = GetQualType(CT);
411   CXTranslationUnit TU = GetTU(CT);
412 
413   if (T.isNull())
414     return MakeCXType(QualType(), GetTU(CT));
415 
416   return MakeCXType(cxtu::getASTUnit(TU)->getASTContext()
417                         .getCanonicalType(T),
418                     TU);
419 }
420 
421 unsigned clang_isConstQualifiedType(CXType CT) {
422   QualType T = GetQualType(CT);
423   return T.isLocalConstQualified();
424 }
425 
426 unsigned clang_isVolatileQualifiedType(CXType CT) {
427   QualType T = GetQualType(CT);
428   return T.isLocalVolatileQualified();
429 }
430 
431 unsigned clang_isRestrictQualifiedType(CXType CT) {
432   QualType T = GetQualType(CT);
433   return T.isLocalRestrictQualified();
434 }
435 
436 unsigned clang_getAddressSpace(CXType CT) {
437   QualType T = GetQualType(CT);
438 
439   // For non language-specific address space, use separate helper function.
440   if (T.getAddressSpace() >= LangAS::FirstTargetAddressSpace) {
441     return T.getQualifiers().getAddressSpaceAttributePrintValue();
442   }
443   // FIXME: this function returns either a LangAS or a target AS
444   // Those values can overlap which makes this function rather unpredictable
445   // for any caller
446   return (unsigned)T.getAddressSpace();
447 }
448 
449 CXString clang_getTypedefName(CXType CT) {
450   QualType T = GetQualType(CT);
451   const TypedefType *TT = T->getAs<TypedefType>();
452   if (TT) {
453     TypedefNameDecl *TD = TT->getDecl();
454     if (TD)
455       return cxstring::createDup(TD->getNameAsString().c_str());
456   }
457   return cxstring::createEmpty();
458 }
459 
460 CXType clang_getPointeeType(CXType CT) {
461   QualType T = GetQualType(CT);
462   const Type *TP = T.getTypePtrOrNull();
463 
464   if (!TP)
465     return MakeCXType(QualType(), GetTU(CT));
466 
467 try_again:
468   switch (TP->getTypeClass()) {
469     case Type::Pointer:
470       T = cast<PointerType>(TP)->getPointeeType();
471       break;
472     case Type::BlockPointer:
473       T = cast<BlockPointerType>(TP)->getPointeeType();
474       break;
475     case Type::LValueReference:
476     case Type::RValueReference:
477       T = cast<ReferenceType>(TP)->getPointeeType();
478       break;
479     case Type::ObjCObjectPointer:
480       T = cast<ObjCObjectPointerType>(TP)->getPointeeType();
481       break;
482     case Type::MemberPointer:
483       T = cast<MemberPointerType>(TP)->getPointeeType();
484       break;
485     case Type::Auto:
486     case Type::DeducedTemplateSpecialization:
487       TP = cast<DeducedType>(TP)->getDeducedType().getTypePtrOrNull();
488       if (TP)
489         goto try_again;
490       break;
491     default:
492       T = QualType();
493       break;
494   }
495   return MakeCXType(T, GetTU(CT));
496 }
497 
498 CXType clang_getUnqualifiedType(CXType CT) {
499   return MakeCXType(GetQualType(CT).getUnqualifiedType(), GetTU(CT));
500 }
501 
502 CXType clang_getNonReferenceType(CXType CT) {
503   return MakeCXType(GetQualType(CT).getNonReferenceType(), GetTU(CT));
504 }
505 
506 CXCursor clang_getTypeDeclaration(CXType CT) {
507   if (CT.kind == CXType_Invalid)
508     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
509 
510   QualType T = GetQualType(CT);
511   const Type *TP = T.getTypePtrOrNull();
512 
513   if (!TP)
514     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
515 
516   Decl *D = nullptr;
517 
518 try_again:
519   switch (TP->getTypeClass()) {
520   case Type::Typedef:
521     D = cast<TypedefType>(TP)->getDecl();
522     break;
523   case Type::ObjCObject:
524     D = cast<ObjCObjectType>(TP)->getInterface();
525     break;
526   case Type::ObjCInterface:
527     D = cast<ObjCInterfaceType>(TP)->getDecl();
528     break;
529   case Type::Record:
530   case Type::Enum:
531     D = cast<TagType>(TP)->getDecl();
532     break;
533   case Type::TemplateSpecialization:
534     if (const RecordType *Record = TP->getAs<RecordType>())
535       D = Record->getDecl();
536     else
537       D = cast<TemplateSpecializationType>(TP)->getTemplateName()
538                                                          .getAsTemplateDecl();
539     break;
540 
541   case Type::Auto:
542   case Type::DeducedTemplateSpecialization:
543     TP = cast<DeducedType>(TP)->getDeducedType().getTypePtrOrNull();
544     if (TP)
545       goto try_again;
546     break;
547 
548   case Type::InjectedClassName:
549     D = cast<InjectedClassNameType>(TP)->getDecl();
550     break;
551 
552   // FIXME: Template type parameters!
553 
554   case Type::Elaborated:
555     TP = cast<ElaboratedType>(TP)->getNamedType().getTypePtrOrNull();
556     goto try_again;
557 
558   default:
559     break;
560   }
561 
562   if (!D)
563     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
564 
565   return cxcursor::MakeCXCursor(D, GetTU(CT));
566 }
567 
568 CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
569   const char *s = nullptr;
570 #define TKIND(X) case CXType_##X: s = ""  #X  ""; break
571   switch (K) {
572     TKIND(Invalid);
573     TKIND(Unexposed);
574     TKIND(Void);
575     TKIND(Bool);
576     TKIND(Char_U);
577     TKIND(UChar);
578     TKIND(Char16);
579     TKIND(Char32);
580     TKIND(UShort);
581     TKIND(UInt);
582     TKIND(ULong);
583     TKIND(ULongLong);
584     TKIND(UInt128);
585     TKIND(Char_S);
586     TKIND(SChar);
587     case CXType_WChar: s = "WChar"; break;
588     TKIND(Short);
589     TKIND(Int);
590     TKIND(Long);
591     TKIND(LongLong);
592     TKIND(Int128);
593     TKIND(Half);
594     TKIND(Float);
595     TKIND(Double);
596     TKIND(LongDouble);
597     TKIND(ShortAccum);
598     TKIND(Accum);
599     TKIND(LongAccum);
600     TKIND(UShortAccum);
601     TKIND(UAccum);
602     TKIND(ULongAccum);
603     TKIND(Float16);
604     TKIND(Float128);
605     TKIND(Ibm128);
606     TKIND(NullPtr);
607     TKIND(Overload);
608     TKIND(Dependent);
609     TKIND(ObjCId);
610     TKIND(ObjCClass);
611     TKIND(ObjCSel);
612     TKIND(Complex);
613     TKIND(Pointer);
614     TKIND(BlockPointer);
615     TKIND(LValueReference);
616     TKIND(RValueReference);
617     TKIND(Record);
618     TKIND(Enum);
619     TKIND(Typedef);
620     TKIND(ObjCInterface);
621     TKIND(ObjCObject);
622     TKIND(ObjCObjectPointer);
623     TKIND(ObjCTypeParam);
624     TKIND(FunctionNoProto);
625     TKIND(FunctionProto);
626     TKIND(ConstantArray);
627     TKIND(IncompleteArray);
628     TKIND(VariableArray);
629     TKIND(DependentSizedArray);
630     TKIND(Vector);
631     TKIND(ExtVector);
632     TKIND(MemberPointer);
633     TKIND(Auto);
634     TKIND(Elaborated);
635     TKIND(Pipe);
636     TKIND(Attributed);
637     TKIND(BTFTagAttributed);
638     TKIND(HLSLAttributedResource);
639     TKIND(BFloat16);
640 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) TKIND(Id);
641 #include "clang/Basic/OpenCLImageTypes.def"
642 #undef IMAGE_TYPE
643 #define EXT_OPAQUE_TYPE(ExtTYpe, Id, Ext) TKIND(Id);
644 #include "clang/Basic/OpenCLExtensionTypes.def"
645     TKIND(OCLSampler);
646     TKIND(OCLEvent);
647     TKIND(OCLQueue);
648     TKIND(OCLReserveID);
649 #define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) TKIND(Id);
650 #include "clang/Basic/HLSLIntangibleTypes.def"
651     TKIND(Atomic);
652   }
653 #undef TKIND
654   return cxstring::createRef(s);
655 }
656 
657 unsigned clang_equalTypes(CXType A, CXType B) {
658   return A.data[0] == B.data[0] && A.data[1] == B.data[1];
659 }
660 
661 unsigned clang_isFunctionTypeVariadic(CXType X) {
662   QualType T = GetQualType(X);
663   if (T.isNull())
664     return 0;
665 
666   if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>())
667     return (unsigned)FD->isVariadic();
668 
669   if (T->getAs<FunctionNoProtoType>())
670     return 1;
671 
672   return 0;
673 }
674 
675 CXCallingConv clang_getFunctionTypeCallingConv(CXType X) {
676   QualType T = GetQualType(X);
677   if (T.isNull())
678     return CXCallingConv_Invalid;
679 
680   if (const FunctionType *FD = T->getAs<FunctionType>()) {
681 #define TCALLINGCONV(X) case CC_##X: return CXCallingConv_##X
682     switch (FD->getCallConv()) {
683       TCALLINGCONV(C);
684       TCALLINGCONV(X86StdCall);
685       TCALLINGCONV(X86FastCall);
686       TCALLINGCONV(X86ThisCall);
687       TCALLINGCONV(X86Pascal);
688       TCALLINGCONV(X86RegCall);
689       TCALLINGCONV(X86VectorCall);
690       TCALLINGCONV(AArch64VectorCall);
691       TCALLINGCONV(AArch64SVEPCS);
692       TCALLINGCONV(Win64);
693       TCALLINGCONV(X86_64SysV);
694       TCALLINGCONV(AAPCS);
695       TCALLINGCONV(AAPCS_VFP);
696       TCALLINGCONV(IntelOclBicc);
697       TCALLINGCONV(Swift);
698       TCALLINGCONV(SwiftAsync);
699       TCALLINGCONV(PreserveMost);
700       TCALLINGCONV(PreserveAll);
701       TCALLINGCONV(M68kRTD);
702       TCALLINGCONV(PreserveNone);
703       TCALLINGCONV(RISCVVectorCall);
704     case CC_SpirFunction: return CXCallingConv_Unexposed;
705     case CC_AMDGPUKernelCall: return CXCallingConv_Unexposed;
706     case CC_OpenCLKernel: return CXCallingConv_Unexposed;
707       break;
708     }
709 #undef TCALLINGCONV
710   }
711 
712   return CXCallingConv_Invalid;
713 }
714 
715 int clang_getNumArgTypes(CXType X) {
716   QualType T = GetQualType(X);
717   if (T.isNull())
718     return -1;
719 
720   if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) {
721     return FD->getNumParams();
722   }
723 
724   if (T->getAs<FunctionNoProtoType>()) {
725     return 0;
726   }
727 
728   return -1;
729 }
730 
731 CXType clang_getArgType(CXType X, unsigned i) {
732   QualType T = GetQualType(X);
733   if (T.isNull())
734     return MakeCXType(QualType(), GetTU(X));
735 
736   if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) {
737     unsigned numParams = FD->getNumParams();
738     if (i >= numParams)
739       return MakeCXType(QualType(), GetTU(X));
740 
741     return MakeCXType(FD->getParamType(i), GetTU(X));
742   }
743 
744   return MakeCXType(QualType(), GetTU(X));
745 }
746 
747 CXType clang_getResultType(CXType X) {
748   QualType T = GetQualType(X);
749   if (T.isNull())
750     return MakeCXType(QualType(), GetTU(X));
751 
752   if (const FunctionType *FD = T->getAs<FunctionType>())
753     return MakeCXType(FD->getReturnType(), GetTU(X));
754 
755   return MakeCXType(QualType(), GetTU(X));
756 }
757 
758 CXType clang_getCursorResultType(CXCursor C) {
759   if (clang_isDeclaration(C.kind)) {
760     const Decl *D = cxcursor::getCursorDecl(C);
761     if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
762       return MakeCXType(MD->getReturnType(), cxcursor::getCursorTU(C));
763 
764     return clang_getResultType(clang_getCursorType(C));
765   }
766 
767   return MakeCXType(QualType(), cxcursor::getCursorTU(C));
768 }
769 
770 // FIXME: We should expose the canThrow(...) result instead of the EST.
771 static CXCursor_ExceptionSpecificationKind
772 getExternalExceptionSpecificationKind(ExceptionSpecificationType EST) {
773   switch (EST) {
774   case EST_None:
775     return CXCursor_ExceptionSpecificationKind_None;
776   case EST_DynamicNone:
777     return CXCursor_ExceptionSpecificationKind_DynamicNone;
778   case EST_Dynamic:
779     return CXCursor_ExceptionSpecificationKind_Dynamic;
780   case EST_MSAny:
781     return CXCursor_ExceptionSpecificationKind_MSAny;
782   case EST_BasicNoexcept:
783     return CXCursor_ExceptionSpecificationKind_BasicNoexcept;
784   case EST_NoThrow:
785     return CXCursor_ExceptionSpecificationKind_NoThrow;
786   case EST_NoexceptFalse:
787   case EST_NoexceptTrue:
788   case EST_DependentNoexcept:
789     return CXCursor_ExceptionSpecificationKind_ComputedNoexcept;
790   case EST_Unevaluated:
791     return CXCursor_ExceptionSpecificationKind_Unevaluated;
792   case EST_Uninstantiated:
793     return CXCursor_ExceptionSpecificationKind_Uninstantiated;
794   case EST_Unparsed:
795     return CXCursor_ExceptionSpecificationKind_Unparsed;
796   }
797   llvm_unreachable("invalid EST value");
798 }
799 
800 int clang_getExceptionSpecificationType(CXType X) {
801   QualType T = GetQualType(X);
802   if (T.isNull())
803     return -1;
804 
805   if (const auto *FD = T->getAs<FunctionProtoType>())
806     return getExternalExceptionSpecificationKind(FD->getExceptionSpecType());
807 
808   return -1;
809 }
810 
811 int clang_getCursorExceptionSpecificationType(CXCursor C) {
812   if (clang_isDeclaration(C.kind))
813     return clang_getExceptionSpecificationType(clang_getCursorType(C));
814 
815   return -1;
816 }
817 
818 unsigned clang_isPODType(CXType X) {
819   QualType T = GetQualType(X);
820   if (T.isNull())
821     return 0;
822 
823   CXTranslationUnit TU = GetTU(X);
824 
825   return T.isPODType(cxtu::getASTUnit(TU)->getASTContext()) ? 1 : 0;
826 }
827 
828 CXType clang_getElementType(CXType CT) {
829   QualType ET = QualType();
830   QualType T = GetQualType(CT);
831   const Type *TP = T.getTypePtrOrNull();
832 
833   if (TP) {
834     switch (TP->getTypeClass()) {
835     case Type::ConstantArray:
836       ET = cast<ConstantArrayType> (TP)->getElementType();
837       break;
838     case Type::IncompleteArray:
839       ET = cast<IncompleteArrayType> (TP)->getElementType();
840       break;
841     case Type::VariableArray:
842       ET = cast<VariableArrayType> (TP)->getElementType();
843       break;
844     case Type::DependentSizedArray:
845       ET = cast<DependentSizedArrayType> (TP)->getElementType();
846       break;
847     case Type::Vector:
848       ET = cast<VectorType> (TP)->getElementType();
849       break;
850     case Type::ExtVector:
851       ET = cast<ExtVectorType>(TP)->getElementType();
852       break;
853     case Type::Complex:
854       ET = cast<ComplexType> (TP)->getElementType();
855       break;
856     default:
857       break;
858     }
859   }
860   return MakeCXType(ET, GetTU(CT));
861 }
862 
863 long long clang_getNumElements(CXType CT) {
864   long long result = -1;
865   QualType T = GetQualType(CT);
866   const Type *TP = T.getTypePtrOrNull();
867 
868   if (TP) {
869     switch (TP->getTypeClass()) {
870     case Type::ConstantArray:
871       result = cast<ConstantArrayType> (TP)->getSize().getSExtValue();
872       break;
873     case Type::Vector:
874       result = cast<VectorType> (TP)->getNumElements();
875       break;
876     case Type::ExtVector:
877       result = cast<ExtVectorType>(TP)->getNumElements();
878       break;
879     default:
880       break;
881     }
882   }
883   return result;
884 }
885 
886 CXType clang_getArrayElementType(CXType CT) {
887   QualType ET = QualType();
888   QualType T = GetQualType(CT);
889   const Type *TP = T.getTypePtrOrNull();
890 
891   if (TP) {
892     switch (TP->getTypeClass()) {
893     case Type::ConstantArray:
894       ET = cast<ConstantArrayType> (TP)->getElementType();
895       break;
896     case Type::IncompleteArray:
897       ET = cast<IncompleteArrayType> (TP)->getElementType();
898       break;
899     case Type::VariableArray:
900       ET = cast<VariableArrayType> (TP)->getElementType();
901       break;
902     case Type::DependentSizedArray:
903       ET = cast<DependentSizedArrayType> (TP)->getElementType();
904       break;
905     default:
906       break;
907     }
908   }
909   return MakeCXType(ET, GetTU(CT));
910 }
911 
912 long long clang_getArraySize(CXType CT) {
913   long long result = -1;
914   QualType T = GetQualType(CT);
915   const Type *TP = T.getTypePtrOrNull();
916 
917   if (TP) {
918     switch (TP->getTypeClass()) {
919     case Type::ConstantArray:
920       result = cast<ConstantArrayType> (TP)->getSize().getSExtValue();
921       break;
922     default:
923       break;
924     }
925   }
926   return result;
927 }
928 
929 static bool isIncompleteTypeWithAlignment(QualType QT) {
930   return QT->isIncompleteArrayType() || !QT->isIncompleteType();
931 }
932 
933 long long clang_Type_getAlignOf(CXType T) {
934   if (T.kind == CXType_Invalid)
935     return CXTypeLayoutError_Invalid;
936   ASTContext &Ctx = cxtu::getASTUnit(GetTU(T))->getASTContext();
937   QualType QT = GetQualType(T);
938   // [expr.alignof] p1: return size_t value for complete object type, reference
939   //                    or array.
940   // [expr.alignof] p3: if reference type, return size of referenced type
941   if (QT->isReferenceType())
942     QT = QT.getNonReferenceType();
943   if (!isIncompleteTypeWithAlignment(QT))
944     return CXTypeLayoutError_Incomplete;
945   if (QT->isDependentType())
946     return CXTypeLayoutError_Dependent;
947   if (const auto *Deduced = dyn_cast<DeducedType>(QT))
948     if (Deduced->getDeducedType().isNull())
949       return CXTypeLayoutError_Undeduced;
950   // Exceptions by GCC extension - see ASTContext.cpp:1313 getTypeInfoImpl
951   // if (QT->isFunctionType()) return 4; // Bug #15511 - should be 1
952   // if (QT->isVoidType()) return 1;
953   return Ctx.getTypeAlignInChars(QT).getQuantity();
954 }
955 
956 CXType clang_Type_getClassType(CXType CT) {
957   QualType ET = QualType();
958   QualType T = GetQualType(CT);
959   const Type *TP = T.getTypePtrOrNull();
960 
961   if (TP && TP->getTypeClass() == Type::MemberPointer) {
962     ET = QualType(cast<MemberPointerType> (TP)->getClass(), 0);
963   }
964   return MakeCXType(ET, GetTU(CT));
965 }
966 
967 long long clang_Type_getSizeOf(CXType T) {
968   if (T.kind == CXType_Invalid)
969     return CXTypeLayoutError_Invalid;
970   ASTContext &Ctx = cxtu::getASTUnit(GetTU(T))->getASTContext();
971   QualType QT = GetQualType(T);
972   // [expr.sizeof] p2: if reference type, return size of referenced type
973   if (QT->isReferenceType())
974     QT = QT.getNonReferenceType();
975   // [expr.sizeof] p1: return -1 on: func, incomplete, bitfield, incomplete
976   //                   enumeration
977   // Note: We get the cxtype, not the cxcursor, so we can't call
978   //       FieldDecl->isBitField()
979   // [expr.sizeof] p3: pointer ok, function not ok.
980   // [gcc extension] lib/AST/ExprConstant.cpp:1372 HandleSizeof : vla == error
981   if (QT->isIncompleteType())
982     return CXTypeLayoutError_Incomplete;
983   if (QT->isDependentType())
984     return CXTypeLayoutError_Dependent;
985   if (!QT->isConstantSizeType())
986     return CXTypeLayoutError_NotConstantSize;
987   if (const auto *Deduced = dyn_cast<DeducedType>(QT))
988     if (Deduced->getDeducedType().isNull())
989       return CXTypeLayoutError_Undeduced;
990   // [gcc extension] lib/AST/ExprConstant.cpp:1372
991   //                 HandleSizeof : {voidtype,functype} == 1
992   // not handled by ASTContext.cpp:1313 getTypeInfoImpl
993   if (QT->isVoidType() || QT->isFunctionType())
994     return 1;
995   return Ctx.getTypeSizeInChars(QT).getQuantity();
996 }
997 
998 static bool isTypeIncompleteForLayout(QualType QT) {
999   return QT->isIncompleteType() && !QT->isIncompleteArrayType();
1000 }
1001 
1002 static long long visitRecordForValidation(const RecordDecl *RD) {
1003   for (const auto *I : RD->fields()){
1004     QualType FQT = I->getType();
1005     if (isTypeIncompleteForLayout(FQT))
1006       return CXTypeLayoutError_Incomplete;
1007     if (FQT->isDependentType())
1008       return CXTypeLayoutError_Dependent;
1009     // recurse
1010     if (const RecordType *ChildType = I->getType()->getAs<RecordType>()) {
1011       if (const RecordDecl *Child = ChildType->getDecl()) {
1012         long long ret = visitRecordForValidation(Child);
1013         if (ret < 0)
1014           return ret;
1015       }
1016     }
1017     // else try next field
1018   }
1019   return 0;
1020 }
1021 
1022 static long long validateFieldParentType(CXCursor PC, CXType PT){
1023   if (clang_isInvalid(PC.kind))
1024     return CXTypeLayoutError_Invalid;
1025   const RecordDecl *RD =
1026         dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
1027   // validate parent declaration
1028   if (!RD || RD->isInvalidDecl())
1029     return CXTypeLayoutError_Invalid;
1030   RD = RD->getDefinition();
1031   if (!RD)
1032     return CXTypeLayoutError_Incomplete;
1033   if (RD->isInvalidDecl())
1034     return CXTypeLayoutError_Invalid;
1035   // validate parent type
1036   QualType RT = GetQualType(PT);
1037   if (RT->isIncompleteType())
1038     return CXTypeLayoutError_Incomplete;
1039   if (RT->isDependentType())
1040     return CXTypeLayoutError_Dependent;
1041   // We recurse into all record fields to detect incomplete and dependent types.
1042   long long Error = visitRecordForValidation(RD);
1043   if (Error < 0)
1044     return Error;
1045   return 0;
1046 }
1047 
1048 long long clang_Type_getOffsetOf(CXType PT, const char *S) {
1049   // check that PT is not incomplete/dependent
1050   CXCursor PC = clang_getTypeDeclaration(PT);
1051   long long Error = validateFieldParentType(PC,PT);
1052   if (Error < 0)
1053     return Error;
1054   if (!S)
1055     return CXTypeLayoutError_InvalidFieldName;
1056   // lookup field
1057   ASTContext &Ctx = cxtu::getASTUnit(GetTU(PT))->getASTContext();
1058   IdentifierInfo *II = &Ctx.Idents.get(S);
1059   DeclarationName FieldName(II);
1060   const RecordDecl *RD =
1061         dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
1062   // verified in validateFieldParentType
1063   RD = RD->getDefinition();
1064   RecordDecl::lookup_result Res = RD->lookup(FieldName);
1065   // If a field of the parent record is incomplete, lookup will fail.
1066   // and we would return InvalidFieldName instead of Incomplete.
1067   // But this erroneous results does protects again a hidden assertion failure
1068   // in the RecordLayoutBuilder
1069   if (!Res.isSingleResult())
1070     return CXTypeLayoutError_InvalidFieldName;
1071   if (const FieldDecl *FD = dyn_cast<FieldDecl>(Res.front()))
1072     return Ctx.getFieldOffset(FD);
1073   if (const IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(Res.front()))
1074     return Ctx.getFieldOffset(IFD);
1075   // we don't want any other Decl Type.
1076   return CXTypeLayoutError_InvalidFieldName;
1077 }
1078 
1079 CXType clang_Type_getModifiedType(CXType CT) {
1080   QualType T = GetQualType(CT);
1081   if (T.isNull())
1082     return MakeCXType(QualType(), GetTU(CT));
1083 
1084   if (auto *ATT = T->getAs<AttributedType>())
1085     return MakeCXType(ATT->getModifiedType(), GetTU(CT));
1086 
1087   if (auto *ATT = T->getAs<BTFTagAttributedType>())
1088     return MakeCXType(ATT->getWrappedType(), GetTU(CT));
1089 
1090   return MakeCXType(QualType(), GetTU(CT));
1091 }
1092 
1093 long long clang_Cursor_getOffsetOfField(CXCursor C) {
1094   if (clang_isDeclaration(C.kind)) {
1095     // we need to validate the parent type
1096     CXCursor PC = clang_getCursorSemanticParent(C);
1097     CXType PT = clang_getCursorType(PC);
1098     long long Error = validateFieldParentType(PC,PT);
1099     if (Error < 0)
1100       return Error;
1101     // proceed with the offset calculation
1102     const Decl *D = cxcursor::getCursorDecl(C);
1103     ASTContext &Ctx = cxcursor::getCursorContext(C);
1104     if (const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D))
1105       return Ctx.getFieldOffset(FD);
1106     if (const IndirectFieldDecl *IFD = dyn_cast_or_null<IndirectFieldDecl>(D))
1107       return Ctx.getFieldOffset(IFD);
1108   }
1109   return -1;
1110 }
1111 
1112 long long clang_getOffsetOfBase(CXCursor Parent, CXCursor Base) {
1113   if (Base.kind != CXCursor_CXXBaseSpecifier)
1114     return -1;
1115 
1116   if (!clang_isDeclaration(Parent.kind))
1117     return -1;
1118 
1119   // we need to validate the parent type
1120   CXType PT = clang_getCursorType(Parent);
1121   long long Error = validateFieldParentType(Parent, PT);
1122   if (Error < 0)
1123     return Error;
1124 
1125   const CXXRecordDecl *ParentRD =
1126       dyn_cast<CXXRecordDecl>(cxcursor::getCursorDecl(Parent));
1127   if (!ParentRD)
1128     return -1;
1129 
1130   ASTContext &Ctx = cxcursor::getCursorContext(Base);
1131   const CXXBaseSpecifier *B = cxcursor::getCursorCXXBaseSpecifier(Base);
1132   if (ParentRD->bases_begin() > B || ParentRD->bases_end() <= B)
1133     return -1;
1134 
1135   const CXXRecordDecl *BaseRD = B->getType()->getAsCXXRecordDecl();
1136   if (!BaseRD)
1137     return -1;
1138 
1139   const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(ParentRD);
1140   if (B->isVirtual())
1141     return Ctx.toBits(Layout.getVBaseClassOffset(BaseRD));
1142   return Ctx.toBits(Layout.getBaseClassOffset(BaseRD));
1143 }
1144 
1145 enum CXRefQualifierKind clang_Type_getCXXRefQualifier(CXType T) {
1146   QualType QT = GetQualType(T);
1147   if (QT.isNull())
1148     return CXRefQualifier_None;
1149   const FunctionProtoType *FD = QT->getAs<FunctionProtoType>();
1150   if (!FD)
1151     return CXRefQualifier_None;
1152   switch (FD->getRefQualifier()) {
1153     case RQ_None:
1154       return CXRefQualifier_None;
1155     case RQ_LValue:
1156       return CXRefQualifier_LValue;
1157     case RQ_RValue:
1158       return CXRefQualifier_RValue;
1159   }
1160   return CXRefQualifier_None;
1161 }
1162 
1163 unsigned clang_Cursor_isBitField(CXCursor C) {
1164   if (!clang_isDeclaration(C.kind))
1165     return 0;
1166   const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(cxcursor::getCursorDecl(C));
1167   if (!FD)
1168     return 0;
1169   return FD->isBitField();
1170 }
1171 
1172 CXString clang_getDeclObjCTypeEncoding(CXCursor C) {
1173   if (!clang_isDeclaration(C.kind))
1174     return cxstring::createEmpty();
1175 
1176   const Decl *D = cxcursor::getCursorDecl(C);
1177   ASTContext &Ctx = cxcursor::getCursorContext(C);
1178   std::string encoding;
1179 
1180   if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D))  {
1181     encoding = Ctx.getObjCEncodingForMethodDecl(OMD);
1182   } else if (const ObjCPropertyDecl *OPD = dyn_cast<ObjCPropertyDecl>(D))
1183     encoding = Ctx.getObjCEncodingForPropertyDecl(OPD, nullptr);
1184   else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
1185     encoding = Ctx.getObjCEncodingForFunctionDecl(FD);
1186   else {
1187     QualType Ty;
1188     if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
1189       Ty = Ctx.getTypeDeclType(TD);
1190     if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
1191       Ty = VD->getType();
1192     else return cxstring::createRef("?");
1193     Ctx.getObjCEncodingForType(Ty, encoding);
1194   }
1195 
1196   return cxstring::createDup(encoding);
1197 }
1198 
1199 static unsigned GetTemplateArgumentArraySize(ArrayRef<TemplateArgument> TA) {
1200   unsigned size = TA.size();
1201   for (const auto &Arg : TA)
1202     if (Arg.getKind() == TemplateArgument::Pack)
1203       size += Arg.pack_size() - 1;
1204   return size;
1205 }
1206 
1207 int clang_Type_getNumTemplateArguments(CXType CT) {
1208   QualType T = GetQualType(CT);
1209   if (T.isNull())
1210     return -1;
1211 
1212   auto TA = GetTemplateArguments(T);
1213   if (!TA)
1214     return -1;
1215 
1216   return GetTemplateArgumentArraySize(*TA);
1217 }
1218 
1219 CXType clang_Type_getTemplateArgumentAsType(CXType CT, unsigned index) {
1220   QualType T = GetQualType(CT);
1221   if (T.isNull())
1222     return MakeCXType(QualType(), GetTU(CT));
1223 
1224   auto TA = GetTemplateArguments(T);
1225   if (!TA)
1226     return MakeCXType(QualType(), GetTU(CT));
1227 
1228   std::optional<QualType> QT = FindTemplateArgumentTypeAt(*TA, index);
1229   return MakeCXType(QT.value_or(QualType()), GetTU(CT));
1230 }
1231 
1232 CXType clang_Type_getObjCObjectBaseType(CXType CT) {
1233   QualType T = GetQualType(CT);
1234   if (T.isNull())
1235     return MakeCXType(QualType(), GetTU(CT));
1236 
1237   const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
1238   if (!OT)
1239     return MakeCXType(QualType(), GetTU(CT));
1240 
1241   return MakeCXType(OT->getBaseType(), GetTU(CT));
1242 }
1243 
1244 unsigned clang_Type_getNumObjCProtocolRefs(CXType CT) {
1245   QualType T = GetQualType(CT);
1246   if (T.isNull())
1247     return 0;
1248 
1249   const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
1250   if (!OT)
1251     return 0;
1252 
1253   return OT->getNumProtocols();
1254 }
1255 
1256 CXCursor clang_Type_getObjCProtocolDecl(CXType CT, unsigned i) {
1257   QualType T = GetQualType(CT);
1258   if (T.isNull())
1259     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
1260 
1261   const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
1262   if (!OT)
1263     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
1264 
1265   const ObjCProtocolDecl *PD = OT->getProtocol(i);
1266   if (!PD)
1267     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
1268 
1269   return cxcursor::MakeCXCursor(PD, GetTU(CT));
1270 }
1271 
1272 unsigned clang_Type_getNumObjCTypeArgs(CXType CT) {
1273   QualType T = GetQualType(CT);
1274   if (T.isNull())
1275     return 0;
1276 
1277   const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
1278   if (!OT)
1279     return 0;
1280 
1281   return OT->getTypeArgs().size();
1282 }
1283 
1284 CXType clang_Type_getObjCTypeArg(CXType CT, unsigned i) {
1285   QualType T = GetQualType(CT);
1286   if (T.isNull())
1287     return MakeCXType(QualType(), GetTU(CT));
1288 
1289   const ObjCObjectType *OT = dyn_cast<ObjCObjectType>(T);
1290   if (!OT)
1291     return MakeCXType(QualType(), GetTU(CT));
1292 
1293   const ArrayRef<QualType> TA = OT->getTypeArgs();
1294   if ((size_t)i >= TA.size())
1295     return MakeCXType(QualType(), GetTU(CT));
1296 
1297   return MakeCXType(TA[i], GetTU(CT));
1298 }
1299 
1300 unsigned clang_Type_visitFields(CXType PT,
1301                                 CXFieldVisitor visitor,
1302                                 CXClientData client_data){
1303   CXCursor PC = clang_getTypeDeclaration(PT);
1304   if (clang_isInvalid(PC.kind))
1305     return false;
1306   const RecordDecl *RD =
1307         dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
1308   if (!RD || RD->isInvalidDecl())
1309     return false;
1310   RD = RD->getDefinition();
1311   if (!RD || RD->isInvalidDecl())
1312     return false;
1313 
1314   for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
1315        I != E; ++I){
1316     const FieldDecl *FD = dyn_cast_or_null<FieldDecl>((*I));
1317     // Callback to the client.
1318     switch (visitor(cxcursor::MakeCXCursor(FD, GetTU(PT)), client_data)){
1319     case CXVisit_Break:
1320       return true;
1321     case CXVisit_Continue:
1322       break;
1323     }
1324   }
1325   return true;
1326 }
1327 
1328 unsigned clang_Cursor_isAnonymous(CXCursor C){
1329   if (!clang_isDeclaration(C.kind))
1330     return 0;
1331   const Decl *D = cxcursor::getCursorDecl(C);
1332   if (const NamespaceDecl *ND = dyn_cast_or_null<NamespaceDecl>(D)) {
1333     return ND->isAnonymousNamespace();
1334   } else if (const TagDecl *TD = dyn_cast_or_null<TagDecl>(D)) {
1335     return TD->getTypedefNameForAnonDecl() == nullptr &&
1336            TD->getIdentifier() == nullptr;
1337   }
1338 
1339   return 0;
1340 }
1341 
1342 unsigned clang_Cursor_isAnonymousRecordDecl(CXCursor C){
1343   if (!clang_isDeclaration(C.kind))
1344     return 0;
1345   const Decl *D = cxcursor::getCursorDecl(C);
1346   if (const RecordDecl *FD = dyn_cast_or_null<RecordDecl>(D))
1347     return FD->isAnonymousStructOrUnion();
1348   return 0;
1349 }
1350 
1351 unsigned clang_Cursor_isInlineNamespace(CXCursor C) {
1352   if (!clang_isDeclaration(C.kind))
1353     return 0;
1354   const Decl *D = cxcursor::getCursorDecl(C);
1355   const NamespaceDecl *ND = dyn_cast_or_null<NamespaceDecl>(D);
1356   return ND ? ND->isInline() : 0;
1357 }
1358 
1359 CXType clang_Type_getNamedType(CXType CT){
1360   QualType T = GetQualType(CT);
1361   const Type *TP = T.getTypePtrOrNull();
1362 
1363   if (TP && TP->getTypeClass() == Type::Elaborated)
1364     return MakeCXType(cast<ElaboratedType>(TP)->getNamedType(), GetTU(CT));
1365 
1366   return MakeCXType(QualType(), GetTU(CT));
1367 }
1368 
1369 unsigned clang_Type_isTransparentTagTypedef(CXType TT){
1370   QualType T = GetQualType(TT);
1371   if (auto *TT = dyn_cast_or_null<TypedefType>(T.getTypePtrOrNull())) {
1372     if (auto *D = TT->getDecl())
1373       return D->isTransparentTag();
1374   }
1375   return false;
1376 }
1377 
1378 enum CXTypeNullabilityKind clang_Type_getNullability(CXType CT) {
1379   QualType T = GetQualType(CT);
1380   if (T.isNull())
1381     return CXTypeNullability_Invalid;
1382 
1383   if (auto nullability = T->getNullability()) {
1384     switch (*nullability) {
1385       case NullabilityKind::NonNull:
1386         return CXTypeNullability_NonNull;
1387       case NullabilityKind::Nullable:
1388         return CXTypeNullability_Nullable;
1389       case NullabilityKind::NullableResult:
1390         return CXTypeNullability_NullableResult;
1391       case NullabilityKind::Unspecified:
1392         return CXTypeNullability_Unspecified;
1393     }
1394   }
1395   return CXTypeNullability_Invalid;
1396 }
1397 
1398 CXType clang_Type_getValueType(CXType CT) {
1399   QualType T = GetQualType(CT);
1400 
1401   if (T.isNull() || !T->isAtomicType())
1402       return MakeCXType(QualType(), GetTU(CT));
1403 
1404   const auto *AT = T->castAs<AtomicType>();
1405   return MakeCXType(AT->getValueType(), GetTU(CT));
1406 }
1407