From 56a6380cb734a98e489940933ed590396f8e7402 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 27 Jan 2011 16:27:11 +0000 Subject: [PATCH] Add libclang functions to determine the const/volatile/restrict qualifiers on a CXType. Patch from Stefan Seefeld, test by me. llvm-svn: 124377 --- clang/include/clang-c/Index.h | 18 ++++++++++++++++++ clang/test/Index/print-typekind.c | 4 ++-- clang/tools/c-index-test/c-index-test.c | 6 ++++++ clang/tools/libclang/CXType.cpp | 15 +++++++++++++++ clang/tools/libclang/libclang.darwin.exports | 3 +++ clang/tools/libclang/libclang.exports | 3 +++ 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 46b429dda244..b3b49c79c3a9 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -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. * diff --git a/clang/test/Index/print-typekind.c b/clang/test/Index/print-typekind.c index fad3a2dc2523..30bd409b090f 100644 --- a/clang/test/Index/print-typekind.c +++ b/clang/test/Index/print-typekind.c @@ -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] diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 7238f4a2d0f6..be3a0795984d 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -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. */ { diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp index 7b603c0f9329..93326724de84 100644 --- a/clang/tools/libclang/CXType.cpp +++ b/clang/tools/libclang/CXType.cpp @@ -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(); diff --git a/clang/tools/libclang/libclang.darwin.exports b/clang/tools/libclang/libclang.darwin.exports index 1792312de27d..7614544ca3bc 100644 --- a/clang/tools/libclang/libclang.darwin.exports +++ b/clang/tools/libclang/libclang.darwin.exports @@ -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 diff --git a/clang/tools/libclang/libclang.exports b/clang/tools/libclang/libclang.exports index c5415e361409..c2f0587b9ae8 100644 --- a/clang/tools/libclang/libclang.exports +++ b/clang/tools/libclang/libclang.exports @@ -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