diff options
Diffstat (limited to 'tools/c-index-test/c-index-test.c')
| -rw-r--r-- | tools/c-index-test/c-index-test.c | 59 | 
1 files changed, 41 insertions, 18 deletions
| diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 56e4101399a5..56f39c2e12cb 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -1250,6 +1250,12 @@ static void PrintTypeAndTypeKind(CXType T, const char *Format) {    clang_disposeString(TypeKindSpelling);  } +static enum CXVisitorResult FieldVisitor(CXCursor C, +                                         CXClientData client_data) { +    (*(int *) client_data)+=1; +    return CXVisit_Continue; +} +  static enum CXChildVisitResult PrintType(CXCursor cursor, CXCursor p,                                           CXClientData d) {    if (!clang_isInvalid(clang_getCursorKind(cursor))) { @@ -1320,6 +1326,22 @@ static enum CXChildVisitResult PrintType(CXCursor cursor, CXCursor p,          PrintTypeAndTypeKind(PT, " [pointeetype=%s] [pointeekind=%s]");        }      } +    /* Print the number of fields if they exist. */ +    { +      int numFields = 0; +      if (clang_Type_visitFields(T, FieldVisitor, &numFields)){ +        if (numFields != 0) { +          printf(" [nbFields=%d]", numFields); +        } +        /* Print if it is an anonymous record. */ +        { +          unsigned isAnon = clang_Cursor_isAnonymous(cursor); +          if (isAnon != 0) { +            printf(" [isAnon=%d]", isAnon); +          } +        } +      } +    }      printf("\n");    } @@ -1353,28 +1375,29 @@ static enum CXChildVisitResult PrintTypeSize(CXCursor cursor, CXCursor p,    {      CXString FieldSpelling = clang_getCursorSpelling(cursor);      const char *FieldName = clang_getCString(FieldSpelling); -    /* recurse to get the root anonymous record parent */ -    CXCursor Parent, Root; +    /* recurse to get the first parent record that is not anonymous. */ +    CXCursor Parent, Record; +    unsigned RecordIsAnonymous = 0;      if (clang_getCursorKind(cursor) == CXCursor_FieldDecl) { -      CXString RootParentSpelling; -      const char *RootParentName = 0; -      Parent = p; +      Record = Parent = p;        do { -        if (RootParentName != 0) -          clang_disposeString(RootParentSpelling); - -        Root = Parent; -        RootParentSpelling = clang_getCursorSpelling(Root); -        RootParentName = clang_getCString(RootParentSpelling); -        Parent = clang_getCursorSemanticParent(Root); -      } while (clang_getCursorType(Parent).kind == CXType_Record && -               !strcmp(RootParentName, "")); -      clang_disposeString(RootParentSpelling); -      /* if RootParentName is "", record is anonymous. */ +        Record = Parent; +        Parent = clang_getCursorSemanticParent(Record); +        RecordIsAnonymous = clang_Cursor_isAnonymous(Record); +        /* Recurse as long as the parent is a CXType_Record and the Record +           is anonymous */ +      } while ( clang_getCursorType(Parent).kind == CXType_Record && +                RecordIsAnonymous > 0);        { -        long long Offset = clang_Type_getOffsetOf(clang_getCursorType(Root), +        long long Offset = clang_Type_getOffsetOf(clang_getCursorType(Record),                                                    FieldName); -        printf(" [offsetof=%lld]", Offset); +        long long Offset2 = clang_Cursor_getOffsetOfField(cursor); +        if (Offset == Offset2){ +            printf(" [offsetof=%lld]", Offset); +        } else { +            /* Offsets will be different in anonymous records. */ +            printf(" [offsetof=%lld/%lld]", Offset, Offset2); +        }        }      }      clang_disposeString(FieldSpelling); | 
