Author: arphaman Date: Fri Jun 9 17:06:36 2017 New Revision: 305122 URL: http://llvm.org/viewvc/llvm-project?rev=305122&view=rev Log: Revert r305117
It caused `Index/availability.c` test failure on Linux Modified: cfe/trunk/test/Index/availability.c cfe/trunk/tools/libclang/CIndex.cpp Modified: cfe/trunk/test/Index/availability.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/availability.c?rev=305122&r1=305121&r2=305122&view=diff ============================================================================== --- cfe/trunk/test/Index/availability.c (original) +++ cfe/trunk/test/Index/availability.c Fri Jun 9 17:06:36 2017 @@ -8,15 +8,13 @@ enum { enum { old_enum_plat -} __attribute__((availability(macosx,introduced=10.4,deprecated=10.5,obsoleted=10.7))); +} __attribute__((availability(macosx,introduced=10.4,deprecated=10.5,obsoleted=10.7) -void bar(void) __attribute__((availability(macosx,introduced=10.4))) __attribute__((availability(macosx,obsoleted=10.6))) __attribute__((availability(ios,introduced=3.2))) __attribute__((availability(macosx,deprecated=10.5,message="use foobar"))); +// RUN: c-index-test -test-load-source all %s > %t +// RUN: FileCheck -check-prefix=CHECK-1 %s < %t +// RUN: FileCheck -check-prefix=CHECK-2 %s < %t +// CHECK-1: (ios, introduced=3.2, deprecated=4.1) +// CHECK-2: (macos, introduced=10.4, deprecated=10.5, obsoleted=10.7) -void bar2(void) __attribute__((availability(macosx,introduced=10.4,deprecated=10.5,obsoleted=10.7))) __attribute__((availability(ios,introduced=3.2,deprecated=10.0))) __attribute__((availability(macosx,introduced=10.4,deprecated=10.5,obsoleted=10.7))) __attribute__((availability(ios,introduced=3.2,deprecated=10.0))); - -// RUN: c-index-test -test-load-source all %s | FileCheck %s -// CHECK: FunctionDecl=foo:3:6 {{.*}} (ios, introduced=3.2, deprecated=4.1) (macos, introduced=10.4, deprecated=10.5, obsoleted=10.7) -// CHECK: EnumConstantDecl=old_enum:6:3 (Definition) (deprecated) -// CHECK: EnumConstantDecl=old_enum_plat:10:3 {{.*}} (macos, introduced=10.4, deprecated=10.5, obsoleted=10.7) -// CHECK: FunctionDecl=bar:13:6 {{.*}} (ios, introduced=3.2) (macos, introduced=10.4, deprecated=10.5, obsoleted=10.6, message="use foobar") -// CHECK: FunctionDecl=bar2:15:6 {{.*}} (ios, introduced=3.2, deprecated=10.0) (macos, introduced=10.4, deprecated=10.5, obsoleted=10.7) +// CHECK-2: EnumConstantDecl=old_enum:6:3 (Definition) (deprecated) +// CHECK-2: EnumConstantDecl=old_enum_plat:10:3 {{.*}} (macos, introduced=10.4, deprecated=10.5, obsoleted=10.7) Modified: cfe/trunk/tools/libclang/CIndex.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=305122&r1=305121&r2=305122&view=diff ============================================================================== --- cfe/trunk/tools/libclang/CIndex.cpp (original) +++ cfe/trunk/tools/libclang/CIndex.cpp Fri Jun 9 17:06:36 2017 @@ -7216,11 +7216,15 @@ static CXVersion convertVersion(VersionT return Out; } -static void getCursorPlatformAvailabilityForDecl( - const Decl *D, int *always_deprecated, CXString *deprecated_message, - int *always_unavailable, CXString *unavailable_message, - SmallVectorImpl<AvailabilityAttr *> &AvailabilityAttrs) { +static int getCursorPlatformAvailabilityForDecl(const Decl *D, + int *always_deprecated, + CXString *deprecated_message, + int *always_unavailable, + CXString *unavailable_message, + CXPlatformAvailability *availability, + int availability_size) { bool HadAvailAttr = false; + int N = 0; for (auto A : D->attrs()) { if (DeprecatedAttr *Deprecated = dyn_cast<DeprecatedAttr>(A)) { HadAvailAttr = true; @@ -7232,7 +7236,7 @@ static void getCursorPlatformAvailabilit } continue; } - + if (UnavailableAttr *Unavailable = dyn_cast<UnavailableAttr>(A)) { HadAvailAttr = true; if (always_unavailable) @@ -7243,71 +7247,38 @@ static void getCursorPlatformAvailabilit } continue; } - + if (AvailabilityAttr *Avail = dyn_cast<AvailabilityAttr>(A)) { - AvailabilityAttrs.push_back(Avail); HadAvailAttr = true; + if (N < availability_size) { + availability[N].Platform + = cxstring::createDup(Avail->getPlatform()->getName()); + availability[N].Introduced = convertVersion(Avail->getIntroduced()); + availability[N].Deprecated = convertVersion(Avail->getDeprecated()); + availability[N].Obsoleted = convertVersion(Avail->getObsoleted()); + availability[N].Unavailable = Avail->getUnavailable(); + availability[N].Message = cxstring::createDup(Avail->getMessage()); + } + ++N; } } if (!HadAvailAttr) if (const EnumConstantDecl *EnumConst = dyn_cast<EnumConstantDecl>(D)) return getCursorPlatformAvailabilityForDecl( - cast<Decl>(EnumConst->getDeclContext()), always_deprecated, - deprecated_message, always_unavailable, unavailable_message, - AvailabilityAttrs); - - if (AvailabilityAttrs.empty()) - return; - - std::sort(AvailabilityAttrs.begin(), AvailabilityAttrs.end(), - [](AvailabilityAttr *LHS, AvailabilityAttr *RHS) { - return LHS->getPlatform() > RHS->getPlatform(); - }); - ASTContext &Ctx = D->getASTContext(); - auto It = std::unique( - AvailabilityAttrs.begin(), AvailabilityAttrs.end(), - [&Ctx](AvailabilityAttr *LHS, AvailabilityAttr *RHS) { - if (LHS->getPlatform() != RHS->getPlatform()) - return false; - - if (LHS->getIntroduced() == RHS->getIntroduced() && - LHS->getDeprecated() == RHS->getDeprecated() && - LHS->getObsoleted() == RHS->getObsoleted() && - LHS->getMessage() == RHS->getMessage() && - LHS->getReplacement() == RHS->getReplacement()) - return true; - - if ((!LHS->getIntroduced().empty() && !RHS->getIntroduced().empty()) || - (!LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) || - (!LHS->getObsoleted().empty() && !RHS->getObsoleted().empty())) - return false; - - if (LHS->getIntroduced().empty() && !RHS->getIntroduced().empty()) - LHS->setIntroduced(Ctx, RHS->getIntroduced()); - - if (LHS->getDeprecated().empty() && !RHS->getDeprecated().empty()) { - LHS->setDeprecated(Ctx, RHS->getDeprecated()); - if (LHS->getMessage().empty()) - LHS->setMessage(Ctx, RHS->getMessage()); - if (LHS->getReplacement().empty()) - LHS->setReplacement(Ctx, RHS->getReplacement()); - } - - if (LHS->getObsoleted().empty() && !RHS->getObsoleted().empty()) { - LHS->setObsoleted(Ctx, RHS->getObsoleted()); - if (LHS->getMessage().empty()) - LHS->setMessage(Ctx, RHS->getMessage()); - if (LHS->getReplacement().empty()) - LHS->setReplacement(Ctx, RHS->getReplacement()); - } - - return true; - }); - AvailabilityAttrs.erase(It, AvailabilityAttrs.end()); + cast<Decl>(EnumConst->getDeclContext()), + always_deprecated, + deprecated_message, + always_unavailable, + unavailable_message, + availability, + availability_size); + + return N; } -int clang_getCursorPlatformAvailability(CXCursor cursor, int *always_deprecated, +int clang_getCursorPlatformAvailability(CXCursor cursor, + int *always_deprecated, CXString *deprecated_message, int *always_unavailable, CXString *unavailable_message, @@ -7329,29 +7300,14 @@ int clang_getCursorPlatformAvailability( if (!D) return 0; - SmallVector<AvailabilityAttr *, 8> AvailabilityAttrs; - getCursorPlatformAvailabilityForDecl(D, always_deprecated, deprecated_message, - always_unavailable, unavailable_message, - AvailabilityAttrs); - for (const auto &Avail : - llvm::enumerate(llvm::makeArrayRef(AvailabilityAttrs) - .take_front(availability_size))) { - availability[Avail.index()].Platform = - cxstring::createDup(Avail.value()->getPlatform()->getName()); - availability[Avail.index()].Introduced = - convertVersion(Avail.value()->getIntroduced()); - availability[Avail.index()].Deprecated = - convertVersion(Avail.value()->getDeprecated()); - availability[Avail.index()].Obsoleted = - convertVersion(Avail.value()->getObsoleted()); - availability[Avail.index()].Unavailable = Avail.value()->getUnavailable(); - availability[Avail.index()].Message = - cxstring::createDup(Avail.value()->getMessage()); - } - - return AvailabilityAttrs.size(); + return getCursorPlatformAvailabilityForDecl(D, always_deprecated, + deprecated_message, + always_unavailable, + unavailable_message, + availability, + availability_size); } - + void clang_disposeCXPlatformAvailability(CXPlatformAvailability *availability) { clang_disposeString(availability->Platform); clang_disposeString(availability->Message); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits