]> granicus.if.org Git - clang/commitdiff
Add libclang functions to determine the const/volatile/restrict
authorDouglas Gregor <dgregor@apple.com>
Thu, 27 Jan 2011 16:27:11 +0000 (16:27 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 27 Jan 2011 16:27:11 +0000 (16:27 +0000)
qualifiers on a CXType. Patch from Stefan Seefeld, test by me.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124377 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang-c/Index.h
test/Index/print-typekind.c
tools/c-index-test/c-index-test.c
tools/libclang/CXType.cpp
tools/libclang/libclang.darwin.exports
tools/libclang/libclang.exports

index 46b429dda2448f380ba542b8e3bb5f1e7eb5d0c1..b3b49c79c3a9777c4a4a477ce7599f94e6720b7b 100644 (file)
@@ -1781,6 +1781,24 @@ CINDEX_LINKAGE unsigned clang_equalTypes(CXType A, CXType B);
  */
 CINDEX_LINKAGE CXType clang_getCanonicalType(CXType T);
 
+/**
+ *  \determine Determine whether a CXType has the "const" qualifier set, 
+ *  without looking through typedefs that may have added "const" at a different level.
+ */
+CINDEX_LINKAGE unsigned clang_isConstQualifiedType(CXType T);
+
+/**
+ *  \determine Determine whether a CXType has the "volatile" qualifier set,
+ *  without looking through typedefs that may have added "volatile" at a different level.
+ */
+CINDEX_LINKAGE unsigned clang_isVolatileQualifiedType(CXType T);
+
+/**
+ *  \determine Determine whether a CXType has the "restrict" qualifier set,
+ *  without looking through typedefs that may have added "restrict" at a different level.
+ */
+CINDEX_LINKAGE unsigned clang_isRestrictQualifiedType(CXType T);
+
 /**
  * \brief For pointer types, returns the type of the pointee.
  *
index fad3a2dc252384a3a3d02031baa114d89e3e1389..30bd409b090f0bb0ead70cb8ce4f7bc72b0f3c69 100644 (file)
@@ -1,7 +1,7 @@
 typedef int FooType;
 int *p;
 int *f(int *p, char *x, FooType z) {
-  FooType w = z;
+  const FooType w = z;
   return p + z;
 }
 typedef double OtherType;
@@ -16,7 +16,7 @@ typedef double OtherType;
 // CHECK: TypeRef=FooType:1:13 typekind=Typedef [canonical=Int] [isPOD=1]
 // CHECK: UnexposedStmt= typekind=Invalid [isPOD=0]
 // CHECK: UnexposedStmt= typekind=Invalid [isPOD=0]
-// CHECK: VarDecl=w:4:11 (Definition) typekind=Typedef [canonical=Int] [isPOD=1]
+// CHECK: VarDecl=w:4:17 (Definition) typekind=Typedef const [canonical=Int] [isPOD=1]
 // CHECK: TypeRef=FooType:1:13 typekind=Typedef [canonical=Int] [isPOD=1]
 // CHECK: DeclRefExpr=z:3:33 typekind=Typedef [canonical=Int] [isPOD=1]
 // CHECK: UnexposedStmt= typekind=Invalid [isPOD=0]
index 7238f4a2d0f6dfebb10df0802e2e6d9d4f716f66..be3a0795984d860052d59567d9937db22f02ade9 100644 (file)
@@ -568,6 +568,12 @@ static enum CXChildVisitResult PrintTypeKind(CXCursor cursor, CXCursor p,
     CXString S = clang_getTypeKindSpelling(T.kind);
     PrintCursor(cursor);
     printf(" typekind=%s", clang_getCString(S));
+    if (clang_isConstQualifiedType(T))
+      printf(" const");
+    if (clang_isVolatileQualifiedType(T))
+      printf(" volatile");
+    if (clang_isRestrictQualifiedType(T))
+      printf(" restrict");
     clang_disposeString(S);
     /* Print the canonical type if it is different. */
     {
index 7b603c0f93294b1836e3f8f199f21e802dc510dd..93326724de84601ff9b90800132f5682436ac4c6 100644 (file)
@@ -186,6 +186,21 @@ CXType clang_getCanonicalType(CXType CT) {
   return MakeCXType(AU->getASTContext().getCanonicalType(T), TU);
 }
 
+unsigned clang_isConstQualifiedType(CXType CT) {
+  QualType T = GetQualType(CT);
+  return T.isLocalConstQualified();
+}
+
+unsigned clang_isVolatileQualifiedType(CXType CT) {
+  QualType T = GetQualType(CT);
+  return T.isLocalVolatileQualified();
+}
+
+unsigned clang_isRestrictQualifiedType(CXType CT) {
+  QualType T = GetQualType(CT);
+  return T.isLocalRestrictQualified();
+}
+
 CXType clang_getPointeeType(CXType CT) {
   QualType T = GetQualType(CT);
   const Type *TP = T.getTypePtrOrNull();
index 1792312de27dfe3a57cb85389f839e03a40a7311..7614544ca3bc91345e116fb3ffc63500d646f593 100644 (file)
@@ -109,16 +109,19 @@ _clang_getTypeDeclaration
 _clang_getTypeKindSpelling
 _clang_hashCursor
 _clang_isCursorDefinition
+_clang_isConstQualifiedType
 _clang_isDeclaration
 _clang_isExpression
 _clang_isInvalid
 _clang_isPODType
 _clang_isPreprocessing
 _clang_isReference
+_clang_isRestrictQualifiedType
 _clang_isStatement
 _clang_isTranslationUnit
 _clang_isUnexposed
 _clang_isVirtualBase
+_clang_isVolatileQualifiedType
 _clang_parseTranslationUnit
 _clang_reparseTranslationUnit
 _clang_saveTranslationUnit
index c5415e36140916b952afe16af96bcaeade9b9a01..c2f0587b9ae805fad4cb3ca3466e091ae0c31b54 100644 (file)
@@ -108,6 +108,7 @@ clang_getTranslationUnitSpelling
 clang_getTypeDeclaration
 clang_getTypeKindSpelling
 clang_hashCursor
+clang_isConstQualifiedType
 clang_isCursorDefinition
 clang_isDeclaration
 clang_isExpression
@@ -115,10 +116,12 @@ clang_isInvalid
 clang_isPODType
 clang_isPreprocessing
 clang_isReference
+clang_isRestrictQualifiedType
 clang_isStatement
 clang_isTranslationUnit
 clang_isUnexposed
 clang_isVirtualBase
+clang_isVolatileQualifiedType
 clang_parseTranslationUnit
 clang_reparseTranslationUnit
 clang_saveTranslationUnit