]> granicus.if.org Git - clang/commitdiff
Don't emit 'unavailable' errors inside an unavailable function. rdar://9623855.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 17 Jun 2011 17:28:30 +0000 (17:28 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 17 Jun 2011 17:28:30 +0000 (17:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133264 91177308-0d34-0410-b5e6-96231b3b80d8

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

index e3fde7cfc984c3dd080c08cf7e08c8cc0ea4fe08..98bfe87aab1f342e4d2c613c2be201b43cd8e42e 100644 (file)
@@ -104,18 +104,20 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
     break;
 
   case AR_Unavailable:
-    if (Message.empty()) {
-      if (!UnknownObjCClass)
-        Diag(Loc, diag::err_unavailable) << D->getDeclName();
-      else
-        Diag(Loc, diag::warn_unavailable_fwdclass_message) 
-             << D->getDeclName();
-    }
-    else 
-      Diag(Loc, diag::err_unavailable_message) 
-        << D->getDeclName() << Message;
-    Diag(D->getLocation(), diag::note_unavailable_here) 
-      << isa<FunctionDecl>(D) << false;    
+    if (cast<Decl>(CurContext)->getAvailability() != AR_Unavailable) {
+      if (Message.empty()) {
+        if (!UnknownObjCClass)
+          Diag(Loc, diag::err_unavailable) << D->getDeclName();
+        else
+          Diag(Loc, diag::warn_unavailable_fwdclass_message) 
+               << D->getDeclName();
+      }
+      else 
+        Diag(Loc, diag::err_unavailable_message) 
+          << D->getDeclName() << Message;
+      Diag(D->getLocation(), diag::note_unavailable_here) 
+        << isa<FunctionDecl>(D) << false;
+    }
     break;
   }
 
index a1e047c8176bf5258311c5c06225d0635b6990a4..9f663fc4efd4bff86333724e73dce0803993d707 100644 (file)
@@ -16,3 +16,13 @@ void test_foo() {
 }
 
 char test2[__has_feature(attribute_unavailable_with_message) ? 1 : -1];
+
+// rdar://9623855
+void unavail(void)  __attribute__((__unavailable__));
+void unavail(void) {
+  // No complains inside an unavailable function.
+  int ir = foo(1);
+  double dr = dfoo(1.0);
+  void (*fp)() = &bar;
+  double (*fp4)(double) = dfoo;
+}