diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2021-08-22 19:00:43 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-13 20:39:49 +0000 |
commit | fe6060f10f634930ff71b7c50291ddc610da2475 (patch) | |
tree | 1483580c790bd4d27b6500a7542b5ee00534d3cc /contrib/llvm-project/clang/lib/Sema/SemaAvailability.cpp | |
parent | b61bce17f346d79cecfd8f195a64b10f77be43b1 (diff) | |
parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) |
Diffstat (limited to 'contrib/llvm-project/clang/lib/Sema/SemaAvailability.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/Sema/SemaAvailability.cpp | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/contrib/llvm-project/clang/lib/Sema/SemaAvailability.cpp b/contrib/llvm-project/clang/lib/Sema/SemaAvailability.cpp index 74c4b9e16f74..bb704b1066cf 100644 --- a/contrib/llvm-project/clang/lib/Sema/SemaAvailability.cpp +++ b/contrib/llvm-project/clang/lib/Sema/SemaAvailability.cpp @@ -666,13 +666,6 @@ public: SemaRef.Context.getTargetInfo().getPlatformMinVersion()); } - bool TraverseDecl(Decl *D) { - // Avoid visiting nested functions to prevent duplicate warnings. - if (!D || isa<FunctionDecl>(D)) - return true; - return Base::TraverseDecl(D); - } - bool TraverseStmt(Stmt *S) { if (!S) return true; @@ -686,17 +679,11 @@ public: bool TraverseIfStmt(IfStmt *If); - bool TraverseLambdaExpr(LambdaExpr *E) { return true; } - // for 'case X:' statements, don't bother looking at the 'X'; it can't lead // to any useful diagnostics. bool TraverseCaseStmt(CaseStmt *CS) { return TraverseStmt(CS->getSubStmt()); } - bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) { - if (PRE->isClassReceiver()) - DiagnoseDeclAvailability(PRE->getClassReceiver(), PRE->getReceiverLocation()); - return true; - } + bool VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *PRE) { return true; } bool VisitObjCMessageExpr(ObjCMessageExpr *Msg) { if (ObjCMethodDecl *D = Msg->getMethodDecl()) { @@ -919,6 +906,17 @@ void Sema::DiagnoseUnguardedAvailabilityViolations(Decl *D) { DiagnoseUnguardedAvailability(*this, D).IssueDiagnostics(Body); } +FunctionScopeInfo *Sema::getCurFunctionAvailabilityContext() { + if (FunctionScopes.empty()) + return nullptr; + + // Conservatively search the entire current function scope context for + // availability violations. This ensures we always correctly analyze nested + // classes, blocks, lambdas, etc. that may or may not be inside if(@available) + // checks themselves. + return FunctionScopes.front(); +} + void Sema::DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs, const ObjCInterfaceDecl *UnknownObjCClass, @@ -941,11 +939,8 @@ void Sema::DiagnoseAvailabilityOfDecl(NamedDecl *D, // We need to know the @available context in the current function to // diagnose this use, let DiagnoseUnguardedAvailabilityViolations do that // when we're done parsing the current function. - if (getCurFunctionOrMethodDecl()) { - getEnclosingFunction()->HasPotentialAvailabilityViolations = true; - return; - } else if (getCurBlock() || getCurLambda()) { - getCurFunction()->HasPotentialAvailabilityViolations = true; + if (FunctionScopeInfo *Context = getCurFunctionAvailabilityContext()) { + Context->HasPotentialAvailabilityViolations = true; return; } } |