]> granicus.if.org Git - clang/commitdiff
pinpoint name/location of deprecated/unavailable enumerator
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 28 Nov 2011 19:45:58 +0000 (19:45 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 28 Nov 2011 19:45:58 +0000 (19:45 +0000)
whose enum has been made deprecated/unavailable in the warning.
// rdar://10201690

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145264 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExpr.cpp
test/Sema/attr-deprecated.c
test/Sema/attr-unavailable-message.c
test/SemaCXX/attr-deprecated.cpp

index e6e6e5f5e1ec45afdab379a8d290cb7b12bd5c48..cbfff9096556d3b6b1cd748bba2deaab2b2ba1c7 100644 (file)
@@ -68,6 +68,13 @@ static AvailabilityResult DiagnoseAvailabilityOfDecl(Sema &S,
   // See if this declaration is unavailable or deprecated.
   std::string Message;
   AvailabilityResult Result = D->getAvailability(&Message);
+  if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D))
+    if (Result == AR_Available) {
+      const DeclContext *DC = ECD->getDeclContext();
+      if (const EnumDecl *TheEnumDecl = dyn_cast<EnumDecl>(DC))
+        Result = TheEnumDecl->getAvailability(&Message);
+    }
+  
   switch (Result) {
     case AR_Available:
     case AR_NotYetIntroduced:
@@ -158,7 +165,7 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
       if (const EnumDecl *TheEnumDecl = dyn_cast<EnumDecl>(DC))
         DiagnoseAvailabilityOfDecl(*this,
                           const_cast< EnumDecl *>(TheEnumDecl), 
-                          Loc, UnknownObjCClass);
+                          D->getLocation(), UnknownObjCClass);
     }
   return false;
 }
index 2889f8fa11460aee373eea9c225fd08f51135a2d..86ee80ef06df7f3064cafe65dfdcf8e1a6d526d2 100644 (file)
@@ -109,7 +109,7 @@ enum __attribute__((deprecated)) Test20 {
 void test20() {
   enum Test20 f; // expected-warning {{'Test20' is deprecated}}
   f = test20_a; // expected-warning {{'test20_a' is deprecated}}
-  f = test20_b; // expected-warning {{'Test20' is deprecated}}
+  f = test20_b; // expected-warning {{'test20_b' is deprecated}}
 }
 
 char test21[__has_feature(attribute_deprecated_with_message) ? 1 : -1];
index 9b0c3debd8a70f6be3a101503e7695f4c5aac18d..208e0941b2a4658076600af9347a093a0278ad3c 100644 (file)
@@ -34,16 +34,16 @@ enum foo {
     c = 3
 }__attribute__((deprecated()));  
 
-enum fee { // expected-note {{declaration has been explicitly marked unavailable here}}
-    r = 1,
+enum fee { // expected-note {{declaration has been explicitly marked unavailable here}}
+    r = 1, // expected-note {{declaration has been explicitly marked unavailable here}}
     s = 2,
     t = 3
 }__attribute__((unavailable()));  
 
 enum fee f() { // expected-error {{error: 'fee' is unavailable}}
-    int i = a; // expected-warning {{'foo' is deprecated }}
+    int i = a; // expected-warning {{'a' is deprecated }}
 
     i = b; // expected-warning {{'b' is deprecated}}
 
-    return r; // expected-error {{'fee' is unavailable}}
+    return r; // expected-error {{'r' is unavailable}}
 }
index 945aff363eb154d3feb63c5160ed3616bb79d2a5..46568aabd6777c29b7147ae4251704fa95088df2 100644 (file)
@@ -198,7 +198,7 @@ namespace test6 {
   };
   void testA() {
     A x; // expected-warning {{'A' is deprecated}}
-    x = a0; // expected-warning {{'A' is deprecated}}
+    x = a0; // expected-warning {{'a0' is deprecated}}
   }
   
   enum B {
@@ -218,7 +218,7 @@ namespace test6 {
   };
   void testC() {
     C<int>::Enum x; // expected-warning {{'Enum' is deprecated}}
-    x = C<int>::c0; // expected-warning {{'Enum' is deprecated}}
+    x = C<int>::c0; // expected-warning {{'c0' is deprecated}}
   }
 
   template <class T> struct D {