[clang] [clang][Sema] Fix false positive -Wshadow with structured binding captures (PR #157667)
Mariya Podchishchaeva via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 11 02:52:03 PDT 2025
================
@@ -8508,18 +8511,29 @@ void Sema::CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl,
return;
}
}
- if (const auto *VD = dyn_cast<VarDecl>(ShadowedDecl);
- VD && VD->hasLocalStorage()) {
- // A variable can't shadow a local variable in an enclosing scope, if
- // they are separated by a non-capturing declaration context.
- for (DeclContext *ParentDC = NewDC;
- ParentDC && !ParentDC->Equals(OldDC);
- ParentDC = getLambdaAwareParentOfDeclContext(ParentDC)) {
- // Only block literals, captured statements, and lambda expressions
- // can capture; other scopes don't.
- if (!isa<BlockDecl>(ParentDC) && !isa<CapturedDecl>(ParentDC) &&
- !isLambdaCallOperator(ParentDC)) {
- return;
+ // Apply scoping logic to both VarDecl and BindingDecl with local storage
+ if (isa<VarDecl, BindingDecl>(ShadowedDecl)) {
+ bool HasLocalStorage = false;
+ if (const auto *VD = dyn_cast<VarDecl>(ShadowedDecl)) {
+ HasLocalStorage = VD->hasLocalStorage();
+ } else if (const auto *BD = dyn_cast<BindingDecl>(ShadowedDecl)) {
+ HasLocalStorage =
+ cast<VarDecl>(BD->getDecomposedDecl())->hasLocalStorage();
+ }
+
+ if (HasLocalStorage) {
+ // A variable can't shadow a local variable or binding in an enclosing
+ // scope, if they are separated by a non-capturing declaration
+ // context.
+ for (DeclContext *ParentDC = NewDC;
+ ParentDC && !ParentDC->Equals(OldDC);
+ ParentDC = getLambdaAwareParentOfDeclContext(ParentDC)) {
+ // Only block literals, captured statements, and lambda expressions
+ // can capture; other scopes don't.
+ if (!isa<BlockDecl>(ParentDC) && !isa<CapturedDecl>(ParentDC) &&
+ !isLambdaCallOperator(ParentDC)) {
+ return;
+ }
----------------
Fznamznon wrote:
```suggestion
!isLambdaCallOperator(ParentDC))
return;
```
https://github.com/llvm/llvm-project/pull/157667
More information about the cfe-commits
mailing list