From: Douglas Gregor Date: Sat, 17 Mar 2012 06:39:06 +0000 (+0000) Subject: When determining the availability of an enum constant, also consider X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8e42f2782338666ec67eab2e709e18b92060eeba;p=clang When determining the availability of an enum constant, also consider the availability of the enumeration type itself. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@152977 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/CodeCompleteConsumer.cpp b/lib/Sema/CodeCompleteConsumer.cpp index 0796c0a185..ad5829e75e 100644 --- a/lib/Sema/CodeCompleteConsumer.cpp +++ b/lib/Sema/CodeCompleteConsumer.cpp @@ -400,11 +400,19 @@ PrintingCodeCompleteConsumer::ProcessOverloadCandidates(Sema &SemaRef, } } +/// \brief Retrieve the effective availability of the given declaration. +static AvailabilityResult getDeclAvailability(Decl *D) { + AvailabilityResult AR = D->getAvailability(); + if (isa(D)) + AR = std::max(AR, cast(D->getDeclContext())->getAvailability()); + return AR; +} + void CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) { switch (Kind) { - case RK_Declaration: + case RK_Declaration: { // Set the availability based on attributes. - switch (Declaration->getAvailability()) { + switch (getDeclAvailability(Declaration)) { case AR_Available: case AR_NotYetIntroduced: Availability = CXAvailability_Available; @@ -436,6 +444,7 @@ void CodeCompletionResult::computeCursorKindAndAvailability(bool Accessible) { CursorKind = CXCursor_NotImplemented; } break; + } case RK_Macro: Availability = CXAvailability_Available; diff --git a/test/Index/complete-enums.c b/test/Index/complete-enums.c index 33a4cd4281..713e24f798 100644 --- a/test/Index/complete-enums.c +++ b/test/Index/complete-enums.c @@ -1,22 +1,22 @@ // Note: the run lines follow their respective tests, since line/column // matter in this test. -enum Color { +enum __attribute__((deprecated)) Color { Color_Red = 17, Color_Green, Color_Blue }; int Greeby(); -void f(Color color) { +void f(enum Color color) { switch (color) { case Red: } } // RUN: c-index-test -code-completion-at=%s:11:1 %s | FileCheck -check-prefix=CHECK-CC1 %s -// CHECK-CC1: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Red} +// CHECK-CC1: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Red} (65) (deprecated) // RUN: c-index-test -code-completion-at=%s:12:8 %s | FileCheck -check-prefix=CHECK-CC2 %s -// CHECK-CC2: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Blue} (7) -// CHECK-CC2-NEXT: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Green} (7) -// CHECK-CC2-NEXT: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Red} (7) +// CHECK-CC2: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Blue} (7) (deprecated) +// CHECK-CC2-NEXT: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Green} (7) (deprecated) +// CHECK-CC2-NEXT: EnumConstantDecl:{ResultType enum Color}{TypedText Color_Red} (7) (deprecated)