]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/libclang/CXType.cpp
Vendor import of clang trunk r306956:
[FreeBSD/FreeBSD.git] / tools / libclang / CXType.cpp
1 //===- CXTypes.cpp - Implements 'CXTypes' aspect of libclang ------------===//
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 file implements the 'CXTypes' API hooks in the Clang-C library.
11 //
12 //===--------------------------------------------------------------------===//
13
14 #include "CIndexer.h"
15 #include "CXCursor.h"
16 #include "CXString.h"
17 #include "CXTranslationUnit.h"
18 #include "CXType.h"
19 #include "clang/AST/Decl.h"
20 #include "clang/AST/DeclObjC.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/Expr.h"
23 #include "clang/AST/Type.h"
24 #include "clang/Basic/AddressSpaces.h"
25 #include "clang/Frontend/ASTUnit.h"
26
27 using namespace clang;
28
29 static CXTypeKind GetBuiltinTypeKind(const BuiltinType *BT) {
30 #define BTCASE(K) case BuiltinType::K: return CXType_##K
31   switch (BT->getKind()) {
32     BTCASE(Void);
33     BTCASE(Bool);
34     BTCASE(Char_U);
35     BTCASE(UChar);
36     BTCASE(Char16);
37     BTCASE(Char32);
38     BTCASE(UShort);
39     BTCASE(UInt);
40     BTCASE(ULong);
41     BTCASE(ULongLong);
42     BTCASE(UInt128);
43     BTCASE(Char_S);
44     BTCASE(SChar);
45     case BuiltinType::WChar_S: return CXType_WChar;
46     case BuiltinType::WChar_U: return CXType_WChar;
47     BTCASE(Short);
48     BTCASE(Int);
49     BTCASE(Long);
50     BTCASE(LongLong);
51     BTCASE(Int128);
52     BTCASE(Half);
53     BTCASE(Float);
54     BTCASE(Double);
55     BTCASE(LongDouble);
56     BTCASE(Float128);
57     BTCASE(NullPtr);
58     BTCASE(Overload);
59     BTCASE(Dependent);
60     BTCASE(ObjCId);
61     BTCASE(ObjCClass);
62     BTCASE(ObjCSel);
63 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) BTCASE(Id);
64 #include "clang/Basic/OpenCLImageTypes.def"
65 #undef IMAGE_TYPE
66     BTCASE(OCLSampler);
67     BTCASE(OCLEvent);
68     BTCASE(OCLQueue);
69     BTCASE(OCLReserveID);
70   default:
71     return CXType_Unexposed;
72   }
73 #undef BTCASE
74 }
75
76 static CXTypeKind GetTypeKind(QualType T) {
77   const Type *TP = T.getTypePtrOrNull();
78   if (!TP)
79     return CXType_Invalid;
80
81 #define TKCASE(K) case Type::K: return CXType_##K
82   switch (TP->getTypeClass()) {
83     case Type::Builtin:
84       return GetBuiltinTypeKind(cast<BuiltinType>(TP));
85     TKCASE(Complex);
86     TKCASE(Pointer);
87     TKCASE(BlockPointer);
88     TKCASE(LValueReference);
89     TKCASE(RValueReference);
90     TKCASE(Record);
91     TKCASE(Enum);
92     TKCASE(Typedef);
93     TKCASE(ObjCInterface);
94     TKCASE(ObjCObjectPointer);
95     TKCASE(FunctionNoProto);
96     TKCASE(FunctionProto);
97     TKCASE(ConstantArray);
98     TKCASE(IncompleteArray);
99     TKCASE(VariableArray);
100     TKCASE(DependentSizedArray);
101     TKCASE(Vector);
102     TKCASE(MemberPointer);
103     TKCASE(Auto);
104     TKCASE(Elaborated);
105     TKCASE(Pipe);
106     default:
107       return CXType_Unexposed;
108   }
109 #undef TKCASE
110 }
111
112
113 CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
114   CXTypeKind TK = CXType_Invalid;
115
116   if (TU && !T.isNull()) {
117     // Handle attributed types as the original type
118     if (auto *ATT = T->getAs<AttributedType>()) {
119       return MakeCXType(ATT->getModifiedType(), TU);
120     }
121
122     ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext();
123     if (Ctx.getLangOpts().ObjC1) {
124       QualType UnqualT = T.getUnqualifiedType();
125       if (Ctx.isObjCIdType(UnqualT))
126         TK = CXType_ObjCId;
127       else if (Ctx.isObjCClassType(UnqualT))
128         TK = CXType_ObjCClass;
129       else if (Ctx.isObjCSelType(UnqualT))
130         TK = CXType_ObjCSel;
131     }
132
133     /* Handle decayed types as the original type */
134     if (const DecayedType *DT = T->getAs<DecayedType>()) {
135       return MakeCXType(DT->getOriginalType(), TU);
136     }
137   }
138   if (TK == CXType_Invalid)
139     TK = GetTypeKind(T);
140
141   CXType CT = { TK, { TK == CXType_Invalid ? nullptr
142                                            : T.getAsOpaquePtr(), TU } };
143   return CT;
144 }
145
146 using cxtype::MakeCXType;
147
148 static inline QualType GetQualType(CXType CT) {
149   return QualType::getFromOpaquePtr(CT.data[0]);
150 }
151
152 static inline CXTranslationUnit GetTU(CXType CT) {
153   return static_cast<CXTranslationUnit>(CT.data[1]);
154 }
155
156 static Optional<ArrayRef<TemplateArgument>>
157 GetTemplateArguments(QualType Type) {
158   assert(!Type.isNull());
159   if (const auto *Specialization = Type->getAs<TemplateSpecializationType>())
160     return Specialization->template_arguments();
161
162   if (const auto *RecordDecl = Type->getAsCXXRecordDecl()) {
163     const auto *TemplateDecl =
164       dyn_cast<ClassTemplateSpecializationDecl>(RecordDecl);
165     if (TemplateDecl)
166       return TemplateDecl->getTemplateArgs().asArray();
167   }
168
169   return None;
170 }
171
172 static Optional<QualType> TemplateArgumentToQualType(const TemplateArgument &A) {
173   if (A.getKind() == TemplateArgument::Type)
174     return A.getAsType();
175   return None;
176 }
177
178 static Optional<QualType>
179 FindTemplateArgumentTypeAt(ArrayRef<TemplateArgument> TA, unsigned index) {
180   unsigned current = 0;
181   for (const auto &A : TA) {
182     if (A.getKind() == TemplateArgument::Pack) {
183       if (index < current + A.pack_size())
184         return TemplateArgumentToQualType(A.getPackAsArray()[index - current]);
185       current += A.pack_size();
186       continue;
187     }
188     if (current == index)
189       return TemplateArgumentToQualType(A);
190     current++;
191   }
192   return None;
193 }
194
195 CXType clang_getCursorType(CXCursor C) {
196   using namespace cxcursor;
197
198   CXTranslationUnit TU = cxcursor::getCursorTU(C);
199   if (!TU)
200     return MakeCXType(QualType(), TU);
201
202   ASTContext &Context = cxtu::getASTUnit(TU)->getASTContext();
203   if (clang_isExpression(C.kind)) {
204     QualType T = cxcursor::getCursorExpr(C)->getType();
205     return MakeCXType(T, TU);
206   }
207
208   if (clang_isDeclaration(C.kind)) {
209     const Decl *D = cxcursor::getCursorDecl(C);
210     if (!D)
211       return MakeCXType(QualType(), TU);
212
213     if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
214       return MakeCXType(Context.getTypeDeclType(TD), TU);
215     if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
216       return MakeCXType(Context.getObjCInterfaceType(ID), TU);
217     if (const DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D))
218       return MakeCXType(DD->getType(), TU);
219     if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
220       return MakeCXType(VD->getType(), TU);
221     if (const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(D))
222       return MakeCXType(PD->getType(), TU);
223     if (const FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D))
224       return MakeCXType(FTD->getTemplatedDecl()->getType(), TU);
225     return MakeCXType(QualType(), TU);
226   }
227
228   if (clang_isReference(C.kind)) {
229     switch (C.kind) {
230     case CXCursor_ObjCSuperClassRef: {
231       QualType T
232         = Context.getObjCInterfaceType(getCursorObjCSuperClassRef(C).first);
233       return MakeCXType(T, TU);
234     }
235
236     case CXCursor_ObjCClassRef: {
237       QualType T = Context.getObjCInterfaceType(getCursorObjCClassRef(C).first);
238       return MakeCXType(T, TU);
239     }
240
241     case CXCursor_TypeRef: {
242       QualType T = Context.getTypeDeclType(getCursorTypeRef(C).first);
243       return MakeCXType(T, TU);
244
245     }
246
247     case CXCursor_CXXBaseSpecifier:
248       return cxtype::MakeCXType(getCursorCXXBaseSpecifier(C)->getType(), TU);
249
250     case CXCursor_MemberRef:
251       return cxtype::MakeCXType(getCursorMemberRef(C).first->getType(), TU);
252
253     case CXCursor_VariableRef:
254       return cxtype::MakeCXType(getCursorVariableRef(C).first->getType(), TU);
255
256     case CXCursor_ObjCProtocolRef:
257     case CXCursor_TemplateRef:
258     case CXCursor_NamespaceRef:
259     case CXCursor_OverloadedDeclRef:
260     default:
261       break;
262     }
263
264     return MakeCXType(QualType(), TU);
265   }
266
267   return MakeCXType(QualType(), TU);
268 }
269
270 CXString clang_getTypeSpelling(CXType CT) {
271   QualType T = GetQualType(CT);
272   if (T.isNull())
273     return cxstring::createEmpty();
274
275   CXTranslationUnit TU = GetTU(CT);
276   SmallString<64> Str;
277   llvm::raw_svector_ostream OS(Str);
278   PrintingPolicy PP(cxtu::getASTUnit(TU)->getASTContext().getLangOpts());
279
280   T.print(OS, PP);
281
282   return cxstring::createDup(OS.str());
283 }
284
285 CXType clang_getTypedefDeclUnderlyingType(CXCursor C) {
286   using namespace cxcursor;
287   CXTranslationUnit TU = cxcursor::getCursorTU(C);
288
289   if (clang_isDeclaration(C.kind)) {
290     const Decl *D = cxcursor::getCursorDecl(C);
291
292     if (const TypedefNameDecl *TD = dyn_cast_or_null<TypedefNameDecl>(D)) {
293       QualType T = TD->getUnderlyingType();
294       return MakeCXType(T, TU);
295     }
296
297     return MakeCXType(QualType(), TU);
298   }
299
300   return MakeCXType(QualType(), TU);
301 }
302
303 CXType clang_getEnumDeclIntegerType(CXCursor C) {
304   using namespace cxcursor;
305   CXTranslationUnit TU = cxcursor::getCursorTU(C);
306
307   if (clang_isDeclaration(C.kind)) {
308     const Decl *D = cxcursor::getCursorDecl(C);
309
310     if (const EnumDecl *TD = dyn_cast_or_null<EnumDecl>(D)) {
311       QualType T = TD->getIntegerType();
312       return MakeCXType(T, TU);
313     }
314
315     return MakeCXType(QualType(), TU);
316   }
317
318   return MakeCXType(QualType(), TU);
319 }
320
321 long long clang_getEnumConstantDeclValue(CXCursor C) {
322   using namespace cxcursor;
323
324   if (clang_isDeclaration(C.kind)) {
325     const Decl *D = cxcursor::getCursorDecl(C);
326
327     if (const EnumConstantDecl *TD = dyn_cast_or_null<EnumConstantDecl>(D)) {
328       return TD->getInitVal().getSExtValue();
329     }
330
331     return LLONG_MIN;
332   }
333
334   return LLONG_MIN;
335 }
336
337 unsigned long long clang_getEnumConstantDeclUnsignedValue(CXCursor C) {
338   using namespace cxcursor;
339
340   if (clang_isDeclaration(C.kind)) {
341     const Decl *D = cxcursor::getCursorDecl(C);
342
343     if (const EnumConstantDecl *TD = dyn_cast_or_null<EnumConstantDecl>(D)) {
344       return TD->getInitVal().getZExtValue();
345     }
346
347     return ULLONG_MAX;
348   }
349
350   return ULLONG_MAX;
351 }
352
353 int clang_getFieldDeclBitWidth(CXCursor C) {
354   using namespace cxcursor;
355
356   if (clang_isDeclaration(C.kind)) {
357     const Decl *D = getCursorDecl(C);
358
359     if (const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D)) {
360       if (FD->isBitField())
361         return FD->getBitWidthValue(getCursorContext(C));
362     }
363   }
364
365   return -1;
366 }
367
368 CXType clang_getCanonicalType(CXType CT) {
369   if (CT.kind == CXType_Invalid)
370     return CT;
371
372   QualType T = GetQualType(CT);
373   CXTranslationUnit TU = GetTU(CT);
374
375   if (T.isNull())
376     return MakeCXType(QualType(), GetTU(CT));
377
378   return MakeCXType(cxtu::getASTUnit(TU)->getASTContext()
379                         .getCanonicalType(T),
380                     TU);
381 }
382
383 unsigned clang_isConstQualifiedType(CXType CT) {
384   QualType T = GetQualType(CT);
385   return T.isLocalConstQualified();
386 }
387
388 unsigned clang_isVolatileQualifiedType(CXType CT) {
389   QualType T = GetQualType(CT);
390   return T.isLocalVolatileQualified();
391 }
392
393 unsigned clang_isRestrictQualifiedType(CXType CT) {
394   QualType T = GetQualType(CT);
395   return T.isLocalRestrictQualified();
396 }
397
398 unsigned clang_getAddressSpace(CXType CT) {
399   QualType T = GetQualType(CT);
400
401   // For non language-specific address space, use separate helper function.
402   if (T.getAddressSpace() >= LangAS::FirstTargetAddressSpace) {
403     return T.getQualifiers().getAddressSpaceAttributePrintValue();
404   }
405   return T.getAddressSpace();
406 }
407
408 CXString clang_getTypedefName(CXType CT) {
409   QualType T = GetQualType(CT);
410   const TypedefType *TT = T->getAs<TypedefType>();
411   if (TT) {
412     TypedefNameDecl *TD = TT->getDecl();
413     if (TD)
414       return cxstring::createDup(TD->getNameAsString().c_str());
415   }
416   return cxstring::createEmpty();
417 }
418
419 CXType clang_getPointeeType(CXType CT) {
420   QualType T = GetQualType(CT);
421   const Type *TP = T.getTypePtrOrNull();
422
423   if (!TP)
424     return MakeCXType(QualType(), GetTU(CT));
425
426   switch (TP->getTypeClass()) {
427     case Type::Pointer:
428       T = cast<PointerType>(TP)->getPointeeType();
429       break;
430     case Type::BlockPointer:
431       T = cast<BlockPointerType>(TP)->getPointeeType();
432       break;
433     case Type::LValueReference:
434     case Type::RValueReference:
435       T = cast<ReferenceType>(TP)->getPointeeType();
436       break;
437     case Type::ObjCObjectPointer:
438       T = cast<ObjCObjectPointerType>(TP)->getPointeeType();
439       break;
440     case Type::MemberPointer:
441       T = cast<MemberPointerType>(TP)->getPointeeType();
442       break;
443     default:
444       T = QualType();
445       break;
446   }
447   return MakeCXType(T, GetTU(CT));
448 }
449
450 CXCursor clang_getTypeDeclaration(CXType CT) {
451   if (CT.kind == CXType_Invalid)
452     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
453
454   QualType T = GetQualType(CT);
455   const Type *TP = T.getTypePtrOrNull();
456
457   if (!TP)
458     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
459
460   Decl *D = nullptr;
461
462 try_again:
463   switch (TP->getTypeClass()) {
464   case Type::Typedef:
465     D = cast<TypedefType>(TP)->getDecl();
466     break;
467   case Type::ObjCObject:
468     D = cast<ObjCObjectType>(TP)->getInterface();
469     break;
470   case Type::ObjCInterface:
471     D = cast<ObjCInterfaceType>(TP)->getDecl();
472     break;
473   case Type::Record:
474   case Type::Enum:
475     D = cast<TagType>(TP)->getDecl();
476     break;
477   case Type::TemplateSpecialization:
478     if (const RecordType *Record = TP->getAs<RecordType>())
479       D = Record->getDecl();
480     else
481       D = cast<TemplateSpecializationType>(TP)->getTemplateName()
482                                                          .getAsTemplateDecl();
483     break;
484
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
492   case Type::InjectedClassName:
493     D = cast<InjectedClassNameType>(TP)->getDecl();
494     break;
495
496   // FIXME: Template type parameters!      
497
498   case Type::Elaborated:
499     TP = cast<ElaboratedType>(TP)->getNamedType().getTypePtrOrNull();
500     goto try_again;
501
502   default:
503     break;
504   }
505
506   if (!D)
507     return cxcursor::MakeCXCursorInvalid(CXCursor_NoDeclFound);
508
509   return cxcursor::MakeCXCursor(D, GetTU(CT));
510 }
511
512 CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
513   const char *s = nullptr;
514 #define TKIND(X) case CXType_##X: s = ""  #X  ""; break
515   switch (K) {
516     TKIND(Invalid);
517     TKIND(Unexposed);
518     TKIND(Void);
519     TKIND(Bool);
520     TKIND(Char_U);
521     TKIND(UChar);
522     TKIND(Char16);
523     TKIND(Char32);  
524     TKIND(UShort);
525     TKIND(UInt);
526     TKIND(ULong);
527     TKIND(ULongLong);
528     TKIND(UInt128);
529     TKIND(Char_S);
530     TKIND(SChar);
531     case CXType_WChar: s = "WChar"; break;
532     TKIND(Short);
533     TKIND(Int);
534     TKIND(Long);
535     TKIND(LongLong);
536     TKIND(Int128);
537     TKIND(Half);
538     TKIND(Float);
539     TKIND(Double);
540     TKIND(LongDouble);
541     TKIND(Float128);
542     TKIND(NullPtr);
543     TKIND(Overload);
544     TKIND(Dependent);
545     TKIND(ObjCId);
546     TKIND(ObjCClass);
547     TKIND(ObjCSel);
548     TKIND(Complex);
549     TKIND(Pointer);
550     TKIND(BlockPointer);
551     TKIND(LValueReference);
552     TKIND(RValueReference);
553     TKIND(Record);
554     TKIND(Enum);
555     TKIND(Typedef);
556     TKIND(ObjCInterface);
557     TKIND(ObjCObjectPointer);
558     TKIND(FunctionNoProto);
559     TKIND(FunctionProto);
560     TKIND(ConstantArray);
561     TKIND(IncompleteArray);
562     TKIND(VariableArray);
563     TKIND(DependentSizedArray);
564     TKIND(Vector);
565     TKIND(MemberPointer);
566     TKIND(Auto);
567     TKIND(Elaborated);
568     TKIND(Pipe);
569 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) TKIND(Id);
570 #include "clang/Basic/OpenCLImageTypes.def"
571 #undef IMAGE_TYPE
572     TKIND(OCLSampler);
573     TKIND(OCLEvent);
574     TKIND(OCLQueue);
575     TKIND(OCLReserveID);
576   }
577 #undef TKIND
578   return cxstring::createRef(s);
579 }
580
581 unsigned clang_equalTypes(CXType A, CXType B) {
582   return A.data[0] == B.data[0] && A.data[1] == B.data[1];
583 }
584
585 unsigned clang_isFunctionTypeVariadic(CXType X) {
586   QualType T = GetQualType(X);
587   if (T.isNull())
588     return 0;
589
590   if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>())
591     return (unsigned)FD->isVariadic();
592
593   if (T->getAs<FunctionNoProtoType>())
594     return 1;
595   
596   return 0;
597 }
598
599 CXCallingConv clang_getFunctionTypeCallingConv(CXType X) {
600   QualType T = GetQualType(X);
601   if (T.isNull())
602     return CXCallingConv_Invalid;
603   
604   if (const FunctionType *FD = T->getAs<FunctionType>()) {
605 #define TCALLINGCONV(X) case CC_##X: return CXCallingConv_##X
606     switch (FD->getCallConv()) {
607       TCALLINGCONV(C);
608       TCALLINGCONV(X86StdCall);
609       TCALLINGCONV(X86FastCall);
610       TCALLINGCONV(X86ThisCall);
611       TCALLINGCONV(X86Pascal);
612       TCALLINGCONV(X86RegCall);
613       TCALLINGCONV(X86VectorCall);
614       TCALLINGCONV(X86_64Win64);
615       TCALLINGCONV(X86_64SysV);
616       TCALLINGCONV(AAPCS);
617       TCALLINGCONV(AAPCS_VFP);
618       TCALLINGCONV(IntelOclBicc);
619       TCALLINGCONV(Swift);
620       TCALLINGCONV(PreserveMost);
621       TCALLINGCONV(PreserveAll);
622     case CC_SpirFunction: return CXCallingConv_Unexposed;
623     case CC_OpenCLKernel: return CXCallingConv_Unexposed;
624       break;
625     }
626 #undef TCALLINGCONV
627   }
628   
629   return CXCallingConv_Invalid;
630 }
631
632 int clang_getNumArgTypes(CXType X) {
633   QualType T = GetQualType(X);
634   if (T.isNull())
635     return -1;
636   
637   if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) {
638     return FD->getNumParams();
639   }
640   
641   if (T->getAs<FunctionNoProtoType>()) {
642     return 0;
643   }
644   
645   return -1;
646 }
647
648 CXType clang_getArgType(CXType X, unsigned i) {
649   QualType T = GetQualType(X);
650   if (T.isNull())
651     return MakeCXType(QualType(), GetTU(X));
652
653   if (const FunctionProtoType *FD = T->getAs<FunctionProtoType>()) {
654     unsigned numParams = FD->getNumParams();
655     if (i >= numParams)
656       return MakeCXType(QualType(), GetTU(X));
657
658     return MakeCXType(FD->getParamType(i), GetTU(X));
659   }
660   
661   return MakeCXType(QualType(), GetTU(X));
662 }
663
664 CXType clang_getResultType(CXType X) {
665   QualType T = GetQualType(X);
666   if (T.isNull())
667     return MakeCXType(QualType(), GetTU(X));
668   
669   if (const FunctionType *FD = T->getAs<FunctionType>())
670     return MakeCXType(FD->getReturnType(), GetTU(X));
671
672   return MakeCXType(QualType(), GetTU(X));
673 }
674
675 CXType clang_getCursorResultType(CXCursor C) {
676   if (clang_isDeclaration(C.kind)) {
677     const Decl *D = cxcursor::getCursorDecl(C);
678     if (const ObjCMethodDecl *MD = dyn_cast_or_null<ObjCMethodDecl>(D))
679       return MakeCXType(MD->getReturnType(), cxcursor::getCursorTU(C));
680
681     return clang_getResultType(clang_getCursorType(C));
682   }
683
684   return MakeCXType(QualType(), cxcursor::getCursorTU(C));
685 }
686
687 int clang_getExceptionSpecificationType(CXType X) {
688   QualType T = GetQualType(X);
689   if (T.isNull())
690     return -1;
691
692   if (const auto *FD = T->getAs<FunctionProtoType>())
693     return static_cast<int>(FD->getExceptionSpecType());
694
695   return -1;
696 }
697
698 int clang_getCursorExceptionSpecificationType(CXCursor C) {
699   if (clang_isDeclaration(C.kind))
700     return clang_getExceptionSpecificationType(clang_getCursorType(C));
701
702   return -1;
703 }
704
705 unsigned clang_isPODType(CXType X) {
706   QualType T = GetQualType(X);
707   if (T.isNull())
708     return 0;
709   
710   CXTranslationUnit TU = GetTU(X);
711
712   return T.isPODType(cxtu::getASTUnit(TU)->getASTContext()) ? 1 : 0;
713 }
714
715 CXType clang_getElementType(CXType CT) {
716   QualType ET = QualType();
717   QualType T = GetQualType(CT);
718   const Type *TP = T.getTypePtrOrNull();
719
720   if (TP) {
721     switch (TP->getTypeClass()) {
722     case Type::ConstantArray:
723       ET = cast<ConstantArrayType> (TP)->getElementType();
724       break;
725     case Type::IncompleteArray:
726       ET = cast<IncompleteArrayType> (TP)->getElementType();
727       break;
728     case Type::VariableArray:
729       ET = cast<VariableArrayType> (TP)->getElementType();
730       break;
731     case Type::DependentSizedArray:
732       ET = cast<DependentSizedArrayType> (TP)->getElementType();
733       break;
734     case Type::Vector:
735       ET = cast<VectorType> (TP)->getElementType();
736       break;
737     case Type::Complex:
738       ET = cast<ComplexType> (TP)->getElementType();
739       break;
740     default:
741       break;
742     }
743   }
744   return MakeCXType(ET, GetTU(CT));
745 }
746
747 long long clang_getNumElements(CXType CT) {
748   long long result = -1;
749   QualType T = GetQualType(CT);
750   const Type *TP = T.getTypePtrOrNull();
751
752   if (TP) {
753     switch (TP->getTypeClass()) {
754     case Type::ConstantArray:
755       result = cast<ConstantArrayType> (TP)->getSize().getSExtValue();
756       break;
757     case Type::Vector:
758       result = cast<VectorType> (TP)->getNumElements();
759       break;
760     default:
761       break;
762     }
763   }
764   return result;
765 }
766
767 CXType clang_getArrayElementType(CXType CT) {
768   QualType ET = QualType();
769   QualType T = GetQualType(CT);
770   const Type *TP = T.getTypePtrOrNull();
771
772   if (TP) {
773     switch (TP->getTypeClass()) {
774     case Type::ConstantArray:
775       ET = cast<ConstantArrayType> (TP)->getElementType();
776       break;
777     case Type::IncompleteArray:
778       ET = cast<IncompleteArrayType> (TP)->getElementType();
779       break;
780     case Type::VariableArray:
781       ET = cast<VariableArrayType> (TP)->getElementType();
782       break;
783     case Type::DependentSizedArray:
784       ET = cast<DependentSizedArrayType> (TP)->getElementType();
785       break;
786     default:
787       break;
788     }
789   }
790   return MakeCXType(ET, GetTU(CT));
791 }
792
793 long long clang_getArraySize(CXType CT) {
794   long long result = -1;
795   QualType T = GetQualType(CT);
796   const Type *TP = T.getTypePtrOrNull();
797
798   if (TP) {
799     switch (TP->getTypeClass()) {
800     case Type::ConstantArray:
801       result = cast<ConstantArrayType> (TP)->getSize().getSExtValue();
802       break;
803     default:
804       break;
805     }
806   }
807   return result;
808 }
809
810 long long clang_Type_getAlignOf(CXType T) {
811   if (T.kind == CXType_Invalid)
812     return CXTypeLayoutError_Invalid;
813   ASTContext &Ctx = cxtu::getASTUnit(GetTU(T))->getASTContext();
814   QualType QT = GetQualType(T);
815   // [expr.alignof] p1: return size_t value for complete object type, reference
816   //                    or array.
817   // [expr.alignof] p3: if reference type, return size of referenced type
818   if (QT->isReferenceType())
819     QT = QT.getNonReferenceType();
820   if (QT->isIncompleteType())
821     return CXTypeLayoutError_Incomplete;
822   if (QT->isDependentType())
823     return CXTypeLayoutError_Dependent;
824   // Exceptions by GCC extension - see ASTContext.cpp:1313 getTypeInfoImpl
825   // if (QT->isFunctionType()) return 4; // Bug #15511 - should be 1
826   // if (QT->isVoidType()) return 1;
827   return Ctx.getTypeAlignInChars(QT).getQuantity();
828 }
829
830 CXType clang_Type_getClassType(CXType CT) {
831   QualType ET = QualType();
832   QualType T = GetQualType(CT);
833   const Type *TP = T.getTypePtrOrNull();
834
835   if (TP && TP->getTypeClass() == Type::MemberPointer) {
836     ET = QualType(cast<MemberPointerType> (TP)->getClass(), 0);
837   }
838   return MakeCXType(ET, GetTU(CT));
839 }
840
841 long long clang_Type_getSizeOf(CXType T) {
842   if (T.kind == CXType_Invalid)
843     return CXTypeLayoutError_Invalid;
844   ASTContext &Ctx = cxtu::getASTUnit(GetTU(T))->getASTContext();
845   QualType QT = GetQualType(T);
846   // [expr.sizeof] p2: if reference type, return size of referenced type
847   if (QT->isReferenceType())
848     QT = QT.getNonReferenceType();
849   // [expr.sizeof] p1: return -1 on: func, incomplete, bitfield, incomplete
850   //                   enumeration
851   // Note: We get the cxtype, not the cxcursor, so we can't call
852   //       FieldDecl->isBitField()
853   // [expr.sizeof] p3: pointer ok, function not ok.
854   // [gcc extension] lib/AST/ExprConstant.cpp:1372 HandleSizeof : vla == error
855   if (QT->isIncompleteType())
856     return CXTypeLayoutError_Incomplete;
857   if (QT->isDependentType())
858     return CXTypeLayoutError_Dependent;
859   if (!QT->isConstantSizeType())
860     return CXTypeLayoutError_NotConstantSize;
861   // [gcc extension] lib/AST/ExprConstant.cpp:1372
862   //                 HandleSizeof : {voidtype,functype} == 1
863   // not handled by ASTContext.cpp:1313 getTypeInfoImpl
864   if (QT->isVoidType() || QT->isFunctionType())
865     return 1;
866   return Ctx.getTypeSizeInChars(QT).getQuantity();
867 }
868
869 static long long visitRecordForValidation(const RecordDecl *RD) {
870   for (const auto *I : RD->fields()){
871     QualType FQT = I->getType();
872     if (FQT->isIncompleteType())
873       return CXTypeLayoutError_Incomplete;
874     if (FQT->isDependentType())
875       return CXTypeLayoutError_Dependent;
876     // recurse
877     if (const RecordType *ChildType = I->getType()->getAs<RecordType>()) {
878       if (const RecordDecl *Child = ChildType->getDecl()) {
879         long long ret = visitRecordForValidation(Child);
880         if (ret < 0)
881           return ret;
882       }
883     }
884     // else try next field
885   }
886   return 0;
887 }
888
889 static long long validateFieldParentType(CXCursor PC, CXType PT){
890   if (clang_isInvalid(PC.kind))
891     return CXTypeLayoutError_Invalid;
892   const RecordDecl *RD =
893         dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
894   // validate parent declaration
895   if (!RD || RD->isInvalidDecl())
896     return CXTypeLayoutError_Invalid;
897   RD = RD->getDefinition();
898   if (!RD)
899     return CXTypeLayoutError_Incomplete;
900   if (RD->isInvalidDecl())
901     return CXTypeLayoutError_Invalid;
902   // validate parent type
903   QualType RT = GetQualType(PT);
904   if (RT->isIncompleteType())
905     return CXTypeLayoutError_Incomplete;
906   if (RT->isDependentType())
907     return CXTypeLayoutError_Dependent;
908   // We recurse into all record fields to detect incomplete and dependent types.
909   long long Error = visitRecordForValidation(RD);
910   if (Error < 0)
911     return Error;
912   return 0;
913 }
914
915 long long clang_Type_getOffsetOf(CXType PT, const char *S) {
916   // check that PT is not incomplete/dependent
917   CXCursor PC = clang_getTypeDeclaration(PT);
918   long long Error = validateFieldParentType(PC,PT);
919   if (Error < 0)
920     return Error;
921   if (!S)
922     return CXTypeLayoutError_InvalidFieldName;
923   // lookup field
924   ASTContext &Ctx = cxtu::getASTUnit(GetTU(PT))->getASTContext();
925   IdentifierInfo *II = &Ctx.Idents.get(S);
926   DeclarationName FieldName(II);
927   const RecordDecl *RD =
928         dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
929   // verified in validateFieldParentType
930   RD = RD->getDefinition();
931   RecordDecl::lookup_result Res = RD->lookup(FieldName);
932   // If a field of the parent record is incomplete, lookup will fail.
933   // and we would return InvalidFieldName instead of Incomplete.
934   // But this erroneous results does protects again a hidden assertion failure
935   // in the RecordLayoutBuilder
936   if (Res.size() != 1)
937     return CXTypeLayoutError_InvalidFieldName;
938   if (const FieldDecl *FD = dyn_cast<FieldDecl>(Res.front()))
939     return Ctx.getFieldOffset(FD);
940   if (const IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(Res.front()))
941     return Ctx.getFieldOffset(IFD);
942   // we don't want any other Decl Type.
943   return CXTypeLayoutError_InvalidFieldName;
944 }
945
946 long long clang_Cursor_getOffsetOfField(CXCursor C) {
947   if (clang_isDeclaration(C.kind)) {
948     // we need to validate the parent type
949     CXCursor PC = clang_getCursorSemanticParent(C);
950     CXType PT = clang_getCursorType(PC);
951     long long Error = validateFieldParentType(PC,PT);
952     if (Error < 0)
953       return Error;
954     // proceed with the offset calculation
955     const Decl *D = cxcursor::getCursorDecl(C);
956     ASTContext &Ctx = cxcursor::getCursorContext(C);
957     if (const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(D))
958       return Ctx.getFieldOffset(FD);
959     if (const IndirectFieldDecl *IFD = dyn_cast_or_null<IndirectFieldDecl>(D))
960       return Ctx.getFieldOffset(IFD);
961   }
962   return -1;
963 }
964
965 enum CXRefQualifierKind clang_Type_getCXXRefQualifier(CXType T) {
966   QualType QT = GetQualType(T);
967   if (QT.isNull())
968     return CXRefQualifier_None;
969   const FunctionProtoType *FD = QT->getAs<FunctionProtoType>();
970   if (!FD)
971     return CXRefQualifier_None;
972   switch (FD->getRefQualifier()) {
973     case RQ_None:
974       return CXRefQualifier_None;
975     case RQ_LValue:
976       return CXRefQualifier_LValue;
977     case RQ_RValue:
978       return CXRefQualifier_RValue;
979   }
980   return CXRefQualifier_None;
981 }
982
983 unsigned clang_Cursor_isBitField(CXCursor C) {
984   if (!clang_isDeclaration(C.kind))
985     return 0;
986   const FieldDecl *FD = dyn_cast_or_null<FieldDecl>(cxcursor::getCursorDecl(C));
987   if (!FD)
988     return 0;
989   return FD->isBitField();
990 }
991
992 CXString clang_getDeclObjCTypeEncoding(CXCursor C) {
993   if (!clang_isDeclaration(C.kind))
994     return cxstring::createEmpty();
995
996   const Decl *D = cxcursor::getCursorDecl(C);
997   ASTContext &Ctx = cxcursor::getCursorContext(C);
998   std::string encoding;
999
1000   if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D))  {
1001     encoding = Ctx.getObjCEncodingForMethodDecl(OMD);
1002   } else if (const ObjCPropertyDecl *OPD = dyn_cast<ObjCPropertyDecl>(D))
1003     encoding = Ctx.getObjCEncodingForPropertyDecl(OPD, nullptr);
1004   else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
1005     encoding = Ctx.getObjCEncodingForFunctionDecl(FD);
1006   else {
1007     QualType Ty;
1008     if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
1009       Ty = Ctx.getTypeDeclType(TD);
1010     if (const ValueDecl *VD = dyn_cast<ValueDecl>(D))
1011       Ty = VD->getType();
1012     else return cxstring::createRef("?");
1013     Ctx.getObjCEncodingForType(Ty, encoding);
1014   }
1015
1016   return cxstring::createDup(encoding);
1017 }
1018
1019 static unsigned GetTemplateArgumentArraySize(ArrayRef<TemplateArgument> TA) {
1020   unsigned size = TA.size();
1021   for (const auto &Arg : TA)
1022     if (Arg.getKind() == TemplateArgument::Pack)
1023       size += Arg.pack_size() - 1;
1024   return size;
1025 }
1026
1027 int clang_Type_getNumTemplateArguments(CXType CT) {
1028   QualType T = GetQualType(CT);
1029   if (T.isNull())
1030     return -1;
1031
1032   auto TA = GetTemplateArguments(T);
1033   if (!TA)
1034     return -1;
1035
1036   return GetTemplateArgumentArraySize(TA.getValue());
1037 }
1038
1039 CXType clang_Type_getTemplateArgumentAsType(CXType CT, unsigned index) {
1040   QualType T = GetQualType(CT);
1041   if (T.isNull())
1042     return MakeCXType(QualType(), GetTU(CT));
1043
1044   auto TA = GetTemplateArguments(T);
1045   if (!TA)
1046     return MakeCXType(QualType(), GetTU(CT));
1047
1048   Optional<QualType> QT = FindTemplateArgumentTypeAt(TA.getValue(), index);
1049   return MakeCXType(QT.getValueOr(QualType()), GetTU(CT));
1050 }
1051
1052 unsigned clang_Type_visitFields(CXType PT,
1053                                 CXFieldVisitor visitor,
1054                                 CXClientData client_data){
1055   CXCursor PC = clang_getTypeDeclaration(PT);
1056   if (clang_isInvalid(PC.kind))
1057     return false;
1058   const RecordDecl *RD =
1059         dyn_cast_or_null<RecordDecl>(cxcursor::getCursorDecl(PC));
1060   if (!RD || RD->isInvalidDecl())
1061     return false;
1062   RD = RD->getDefinition();
1063   if (!RD || RD->isInvalidDecl())
1064     return false;
1065
1066   for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
1067        I != E; ++I){
1068     const FieldDecl *FD = dyn_cast_or_null<FieldDecl>((*I));
1069     // Callback to the client.
1070     switch (visitor(cxcursor::MakeCXCursor(FD, GetTU(PT)), client_data)){
1071     case CXVisit_Break:
1072       return true;
1073     case CXVisit_Continue:
1074       break;
1075     }
1076   }
1077   return true;
1078 }
1079
1080 unsigned clang_Cursor_isAnonymous(CXCursor C){
1081   if (!clang_isDeclaration(C.kind))
1082     return 0;
1083   const Decl *D = cxcursor::getCursorDecl(C);
1084   if (const RecordDecl *FD = dyn_cast_or_null<RecordDecl>(D))
1085     return FD->isAnonymousStructOrUnion();
1086   return 0;
1087 }
1088
1089 CXType clang_Type_getNamedType(CXType CT){
1090   QualType T = GetQualType(CT);
1091   const Type *TP = T.getTypePtrOrNull();
1092
1093   if (TP && TP->getTypeClass() == Type::Elaborated)
1094     return MakeCXType(cast<ElaboratedType>(TP)->getNamedType(), GetTU(CT));
1095
1096   return MakeCXType(QualType(), GetTU(CT));
1097 }
1098
1099 unsigned clang_Type_isTransparentTagTypedef(CXType TT){
1100   QualType T = GetQualType(TT);
1101   if (auto *TT = dyn_cast_or_null<TypedefType>(T.getTypePtrOrNull())) {
1102     if (auto *D = TT->getDecl())
1103       return D->isTransparentTag();
1104   }
1105   return false;
1106 }