Update Clang for 3.5 rebase (r209713).
Change-Id: I8c9133b0f8f776dc915f270b60f94962e771bc83
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index f6b5510..dcae670 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -3,6 +3,7 @@
#include "clang-c/Index.h"
#include "clang-c/CXCompilationDatabase.h"
#include "clang-c/BuildSystem.h"
+#include "clang-c/Documentation.h"
#include "llvm/Config/config.h"
#include <ctype.h>
#include <stdlib.h>
@@ -541,33 +542,23 @@
printf("]");
}
-typedef struct {
- const char *CommentSchemaFile;
+static void ValidateCommentXML(const char *Str, const char *CommentSchemaFile) {
#ifdef CLANG_HAVE_LIBXML
xmlRelaxNGParserCtxtPtr RNGParser;
xmlRelaxNGPtr Schema;
-#endif
-} CommentXMLValidationData;
-
-static void ValidateCommentXML(const char *Str,
- CommentXMLValidationData *ValidationData) {
-#ifdef CLANG_HAVE_LIBXML
xmlDocPtr Doc;
xmlRelaxNGValidCtxtPtr ValidationCtxt;
int status;
- if (!ValidationData || !ValidationData->CommentSchemaFile)
+ if (!CommentSchemaFile)
return;
- if (!ValidationData->RNGParser) {
- ValidationData->RNGParser =
- xmlRelaxNGNewParserCtxt(ValidationData->CommentSchemaFile);
- ValidationData->Schema = xmlRelaxNGParse(ValidationData->RNGParser);
- }
- if (!ValidationData->RNGParser) {
+ RNGParser = xmlRelaxNGNewParserCtxt(CommentSchemaFile);
+ if (!RNGParser) {
printf(" libXMLError");
return;
}
+ Schema = xmlRelaxNGParse(RNGParser);
Doc = xmlParseDoc((const xmlChar *) Str);
@@ -577,7 +568,7 @@
return;
}
- ValidationCtxt = xmlRelaxNGNewValidCtxt(ValidationData->Schema);
+ ValidationCtxt = xmlRelaxNGNewValidCtxt(Schema);
status = xmlRelaxNGValidateDoc(ValidationCtxt, Doc);
if (!status)
printf(" CommentXMLValid");
@@ -589,11 +580,13 @@
xmlRelaxNGFreeValidCtxt(ValidationCtxt);
xmlFreeDoc(Doc);
+ xmlRelaxNGFree(Schema);
+ xmlRelaxNGFreeParserCtxt(RNGParser);
#endif
}
static void PrintCursorComments(CXCursor Cursor,
- CommentXMLValidationData *ValidationData) {
+ const char *CommentSchemaFile) {
{
CXString RawComment;
const char *RawCommentCString;
@@ -624,7 +617,7 @@
CXString XML;
XML = clang_FullComment_getAsXML(Comment);
PrintCXStringWithPrefix("FullCommentAsXML", XML);
- ValidateCommentXML(clang_getCString(XML), ValidationData);
+ ValidateCommentXML(clang_getCString(XML), CommentSchemaFile);
clang_disposeString(XML);
}
@@ -646,8 +639,7 @@
return (int)lhs->col - (int)rhs->col;
}
-static void PrintCursor(CXCursor Cursor,
- CommentXMLValidationData *ValidationData) {
+static void PrintCursor(CXCursor Cursor, const char *CommentSchemaFile) {
CXTranslationUnit TU = clang_Cursor_getTranslationUnit(Cursor);
if (clang_isInvalid(Cursor.kind)) {
CXString ks = clang_getCursorKindSpelling(Cursor.kind);
@@ -768,6 +760,8 @@
printf(" (static)");
if (clang_CXXMethod_isVirtual(Cursor))
printf(" (virtual)");
+ if (clang_CXXMethod_isConst(Cursor))
+ printf(" (const)");
if (clang_CXXMethod_isPureVirtual(Cursor))
printf(" (pure)");
if (clang_Cursor_isVariadic(Cursor))
@@ -866,7 +860,7 @@
PrintRange(RefNameRange, "RefName");
}
- PrintCursorComments(Cursor, ValidationData);
+ PrintCursorComments(Cursor, CommentSchemaFile);
{
unsigned PropAttrs = clang_Cursor_getObjCPropertyAttributes(Cursor, 0);
@@ -983,7 +977,6 @@
PrintExtent(out, start_line, start_column, end_line, end_column);
fprintf(out, " with \"%s\"\n", clang_getCString(insertion_text));
}
- break;
}
clang_disposeString(insertion_text);
}
@@ -1036,7 +1029,7 @@
typedef struct {
CXTranslationUnit TU;
enum CXCursorKind *Filter;
- CommentXMLValidationData ValidationData;
+ const char *CommentSchemaFile;
} VisitorData;
@@ -1050,7 +1043,7 @@
clang_getSpellingLocation(Loc, 0, &line, &column, 0);
printf("// %s: %s:%d:%d: ", FileCheckPrefix,
GetCursorSource(Cursor), line, column);
- PrintCursor(Cursor, &Data->ValidationData);
+ PrintCursor(Cursor, Data->CommentSchemaFile);
PrintCursorExtent(Cursor);
if (clang_isDeclaration(Cursor.kind)) {
enum CX_CXXAccessSpecifier access = clang_getCXXAccessSpecifier(Cursor);
@@ -1120,7 +1113,7 @@
} else if (Ref.kind != CXCursor_FunctionDecl) {
printf("// %s: %s:%d:%d: ", FileCheckPrefix, GetCursorSource(Ref),
curLine, curColumn);
- PrintCursor(Ref, &Data->ValidationData);
+ PrintCursor(Ref, Data->CommentSchemaFile);
printf("\n");
}
}
@@ -1293,6 +1286,13 @@
}
/* Print if this is a non-POD type. */
printf(" [isPOD=%d]", clang_isPODType(T));
+ /* Print the pointee type. */
+ {
+ CXType PT = clang_getPointeeType(T);
+ if (PT.kind != CXType_Invalid) {
+ PrintTypeAndTypeKind(PT, " [pointeetype=%s] [pointeekind=%s]");
+ }
+ }
printf("\n");
}
@@ -1324,18 +1324,25 @@
}
/* Print the record field offset if applicable. */
{
- const char *FieldName = clang_getCString(clang_getCursorSpelling(cursor));
+ CXString FieldSpelling = clang_getCursorSpelling(cursor);
+ const char *FieldName = clang_getCString(FieldSpelling);
/* recurse to get the root anonymous record parent */
CXCursor Parent, Root;
- if (clang_getCursorKind(cursor) == CXCursor_FieldDecl ) {
- const char *RootParentName;
+ if (clang_getCursorKind(cursor) == CXCursor_FieldDecl) {
+ CXString RootParentSpelling;
+ const char *RootParentName = 0;
Parent = p;
do {
+ if (RootParentName != 0)
+ clang_disposeString(RootParentSpelling);
+
Root = Parent;
- RootParentName = clang_getCString(clang_getCursorSpelling(Root));
+ RootParentSpelling = clang_getCursorSpelling(Root);
+ RootParentName = clang_getCString(RootParentSpelling);
Parent = clang_getCursorSemanticParent(Root);
- } while ( clang_getCursorType(Parent).kind == CXType_Record &&
- !strcmp(RootParentName, "") );
+ } while (clang_getCursorType(Parent).kind == CXType_Record &&
+ !strcmp(RootParentName, ""));
+ clang_disposeString(RootParentSpelling);
/* if RootParentName is "", record is anonymous. */
{
long long Offset = clang_Type_getOffsetOf(clang_getCursorType(Root),
@@ -1343,6 +1350,7 @@
printf(" [offsetof=%lld]", Offset);
}
}
+ clang_disposeString(FieldSpelling);
}
/* Print if its a bitfield */
{
@@ -1412,11 +1420,7 @@
Data.TU = TU;
Data.Filter = ck;
- Data.ValidationData.CommentSchemaFile = CommentSchemaFile;
-#ifdef CLANG_HAVE_LIBXML
- Data.ValidationData.RNGParser = NULL;
- Data.ValidationData.Schema = NULL;
-#endif
+ Data.CommentSchemaFile = CommentSchemaFile;
clang_visitChildren(clang_getTranslationUnitCursor(TU), Visitor, &Data);
}
@@ -1783,7 +1787,8 @@
return 0;
}
-void print_completion_string(CXCompletionString completion_string, FILE *file) {
+static void print_completion_string(CXCompletionString completion_string,
+ FILE *file) {
int I, N;
N = clang_getNumCompletionChunks(completion_string);
@@ -1817,9 +1822,8 @@
}
-void print_completion_result(CXCompletionResult *completion_result,
- CXClientData client_data) {
- FILE *file = (FILE *)client_data;
+static void print_completion_result(CXCompletionResult *completion_result,
+ FILE *file) {
CXString ks = clang_getCursorKindSpelling(completion_result->CursorKind);
unsigned annotationCount;
enum CXCursorKind ParentKind;
@@ -2226,7 +2230,8 @@
}
clang_disposeString(Spelling);
if (clang_Cursor_getObjCSelectorIndex(Cursor) != -1)
- printf(" Selector index=%d",clang_Cursor_getObjCSelectorIndex(Cursor));
+ printf(" Selector index=%d",
+ clang_Cursor_getObjCSelectorIndex(Cursor));
if (clang_Cursor_isDynamicCall(Cursor))
printf(" Dynamic-call");
if (Cursor.kind == CXCursor_ObjCMessageExpr) {
@@ -2246,9 +2251,9 @@
astFilename = clang_getFileName(astFile);
name = clang_Module_getFullName(mod);
numHeaders = clang_Module_getNumTopLevelHeaders(TU, mod);
- printf(" ModuleName=%s (%s) Headers(%d):",
+ printf(" ModuleName=%s (%s) system=%d Headers(%d):",
clang_getCString(name), clang_getCString(astFilename),
- numHeaders);
+ clang_Module_isSystem(mod), numHeaders);
clang_disposeString(name);
clang_disposeString(astFilename);
for (i = 0; i < numHeaders; ++i) {
@@ -2526,6 +2531,11 @@
p->filenames[p->num_files++] = strdup(file);
}
+typedef struct IndexDataStringList_ {
+ struct IndexDataStringList_ *next;
+ char data[1]; /* Dynamically sized. */
+} IndexDataStringList;
+
typedef struct {
const char *check_prefix;
int first_check_printed;
@@ -2533,8 +2543,20 @@
int abort;
const char *main_filename;
ImportedASTFilesData *importedASTs;
+ IndexDataStringList *strings;
+ CXTranslationUnit TU;
} IndexData;
+static void free_client_data(IndexData *index_data) {
+ IndexDataStringList *node = index_data->strings;
+ while (node) {
+ IndexDataStringList *next = node->next;
+ free(node);
+ node = next;
+ }
+ index_data->strings = NULL;
+}
+
static void printCheck(IndexData *data) {
if (data->check_prefix) {
if (data->first_check_printed) {
@@ -2595,8 +2617,11 @@
}
}
-static CXIdxClientContainer makeClientContainer(const CXIdxEntityInfo *info,
+static CXIdxClientContainer makeClientContainer(CXClientData *client_data,
+ const CXIdxEntityInfo *info,
CXIdxLoc loc) {
+ IndexData *index_data;
+ IndexDataStringList *node;
const char *name;
char *newStr;
CXIdxClientFile file;
@@ -2607,10 +2632,18 @@
name = "<anon-tag>";
clang_indexLoc_getFileLocation(loc, &file, 0, &line, &column, 0);
- /* FIXME: free these.*/
- newStr = (char *)malloc(strlen(name) +
- digitCount(line) + digitCount(column) + 3);
+
+ node =
+ (IndexDataStringList *)malloc(sizeof(IndexDataStringList) + strlen(name) +
+ digitCount(line) + digitCount(column) + 2);
+ newStr = node->data;
sprintf(newStr, "%s:%d:%d", name, line, column);
+
+ /* Remember string so it can be freed later. */
+ index_data = (IndexData *)client_data;
+ node->next = index_data->strings;
+ index_data->strings = node;
+
return (CXIdxClientContainer)newStr;
}
@@ -2781,6 +2814,7 @@
static CXIdxClientFile index_ppIncludedFile(CXClientData client_data,
const CXIdxIncludedFileInfo *info) {
IndexData *index_data;
+ CXModule Mod;
index_data = (IndexData *)client_data;
printCheck(index_data);
@@ -2789,8 +2823,18 @@
printf(" | name: \"%s\"", info->filename);
printf(" | hash loc: ");
printCXIndexLoc(info->hashLoc, client_data);
- printf(" | isImport: %d | isAngled: %d | isModule: %d\n",
+ printf(" | isImport: %d | isAngled: %d | isModule: %d",
info->isImport, info->isAngled, info->isModuleImport);
+
+ Mod = clang_getModuleForFile(index_data->TU, (CXFile)info->file);
+ if (Mod) {
+ CXString str = clang_Module_getFullName(Mod);
+ const char *cstr = clang_getCString(str);
+ printf(" | module: %s", cstr);
+ clang_disposeString(str);
+ }
+
+ printf("\n");
return (CXIdxClientFile)info->file;
}
@@ -2824,8 +2868,8 @@
return (CXIdxClientFile)info->file;
}
-static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_data,
- void *reserved) {
+static CXIdxClientContainer
+index_startedTranslationUnit(CXClientData client_data, void *reserved) {
IndexData *index_data;
index_data = (IndexData *)client_data;
printCheck(index_data);
@@ -2926,13 +2970,15 @@
}
if (info->declAsContainer)
- clang_index_setClientContainer(info->declAsContainer,
- makeClientContainer(info->entityInfo, info->loc));
+ clang_index_setClientContainer(
+ info->declAsContainer,
+ makeClientContainer(client_data, info->entityInfo, info->loc));
}
static void index_indexEntityReference(CXClientData client_data,
const CXIdxEntityRefInfo *info) {
- printEntityInfo("[indexEntityReference]", client_data, info->referencedEntity);
+ printEntityInfo("[indexEntityReference]", client_data,
+ info->referencedEntity);
printf(" | cursor: ");
PrintCursor(info->cursor, NULL);
printf(" | loc: ");
@@ -2997,6 +3043,8 @@
index_data.abort = 0;
index_data.main_filename = "";
index_data.importedASTs = importedASTs;
+ index_data.strings = NULL;
+ index_data.TU = NULL;
index_opts = getIndexOptions();
result = clang_indexSourceFile(idxAction, &index_data,
@@ -3009,6 +3057,7 @@
if (index_data.fail_for_error)
result = -1;
+ free_client_data(&index_data);
return result;
}
@@ -3031,6 +3080,8 @@
index_data.abort = 0;
index_data.main_filename = "";
index_data.importedASTs = importedASTs;
+ index_data.strings = NULL;
+ index_data.TU = TU;
index_opts = getIndexOptions();
result = clang_indexTranslationUnit(idxAction, &index_data,
@@ -3040,6 +3091,7 @@
result = -1;
clang_disposeTranslationUnit(TU);
+ free_client_data(&index_data);
return result;
}
@@ -3736,7 +3788,6 @@
static const char *getSeverityString(enum CXDiagnosticSeverity severity) {
switch (severity) {
case CXDiagnostic_Note: return "note";
- case CXDiagnostic_Remark: return "remark";
case CXDiagnostic_Error: return "error";
case CXDiagnostic_Fatal: return "fatal";
case CXDiagnostic_Ignored: return "ignored";
@@ -3857,6 +3908,7 @@
clang_disposeString(FileName);
clang_disposeString(DiagSpelling);
clang_disposeString(DiagOption);
+ clang_disposeString(DiagCat);
}
}