From dd4ce29ba053c530cab3a68b8ba9dfae60e4a271 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Fri, 9 Jun 2017 22:06:36 +0000 Subject: [PATCH] Revert r305117 It caused `Index/availability.c` test failure on Linux git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@305122 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Index/availability.c | 18 +++--- tools/libclang/CIndex.cpp | 120 ++++++++++++-------------------------- 2 files changed, 46 insertions(+), 92 deletions(-) diff --git a/test/Index/availability.c b/test/Index/availability.c index 50b5d3150f..b9d2c6f449 100644 --- a/test/Index/availability.c +++ b/test/Index/availability.c @@ -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) diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index f920961950..1ccf6cbd32 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -7216,11 +7216,15 @@ static CXVersion convertVersion(VersionTuple In) { return Out; } -static void getCursorPlatformAvailabilityForDecl( - const Decl *D, int *always_deprecated, CXString *deprecated_message, - int *always_unavailable, CXString *unavailable_message, - SmallVectorImpl &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(A)) { HadAvailAttr = true; @@ -7232,7 +7236,7 @@ static void getCursorPlatformAvailabilityForDecl( } continue; } - + if (UnavailableAttr *Unavailable = dyn_cast(A)) { HadAvailAttr = true; if (always_unavailable) @@ -7243,71 +7247,38 @@ static void getCursorPlatformAvailabilityForDecl( } continue; } - + if (AvailabilityAttr *Avail = dyn_cast(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(D)) return getCursorPlatformAvailabilityForDecl( - cast(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(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(CXCursor cursor, int *always_deprecated, if (!D) return 0; - SmallVector 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); -- 2.40.0