From: Alex Lorenz Date: Thu, 17 Aug 2017 14:22:27 +0000 (+0000) Subject: Unguarded availability diagnoser should use TraverseStmt instead of X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d4d128789d475f17fa1d04de15e491a4920f0e74;p=clang Unguarded availability diagnoser should use TraverseStmt instead of Base::TraverseStmt when visiting the then/else branches of if statements This ensures that the statement stack is correctly tracked and correct multi-statement fixit is generated inside of an if (@available) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@311088 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 41f8f9f0bc..3d58b9ae05 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -7695,8 +7695,7 @@ bool DiagnoseUnguardedAvailability::TraverseIfStmt(IfStmt *If) { // If we're using the '*' case here or if this check is redundant, then we // use the enclosing version to check both branches. if (CondVersion.empty() || CondVersion <= AvailabilityStack.back()) - return Base::TraverseStmt(If->getThen()) && - Base::TraverseStmt(If->getElse()); + return TraverseStmt(If->getThen()) && TraverseStmt(If->getElse()); } else { // This isn't an availability checking 'if', we can just continue. return Base::TraverseIfStmt(If); diff --git a/test/FixIt/fixit-availability.mm b/test/FixIt/fixit-availability.mm index f6a1855694..a566082532 100644 --- a/test/FixIt/fixit-availability.mm +++ b/test/FixIt/fixit-availability.mm @@ -108,6 +108,14 @@ void wrapDeclStmtUses() { // CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:24-[[@LINE-2]]:24}:"\n } else {\n // Fallback on earlier versions\n }" anotherFunction(y); anotherFunction(x); + + if (@available(macOS 10.1, *)) { + int z = function(); + (void)z; +// CHECK: fix-it:{{.*}}:{[[@LINE-2]]:5-[[@LINE-2]]:5}:"if (@available(macOS 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:13-[[@LINE-2]]:13}:"\n } else {\n // Fallback on earlier versions\n }" + anotherFunction(x); + } } #define API_AVAILABLE(X) __attribute__((availability(macos, introduced=10.12))) // dummy macro