r305122 - Revert r305117

Alex Lorenz via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 9 15:06:36 PDT 2017


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);




More information about the cfe-commits mailing list