[clang] [Clang] Implement P0963R3 "Structured binding declaration as a condition" (PR #130228)
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 10 06:21:17 PDT 2025
================
@@ -5218,18 +5218,31 @@ static bool EvaluateVarDecl(EvalInfo &Info, const VarDecl *VD) {
return true;
}
-static bool EvaluateDecl(EvalInfo &Info, const Decl *D) {
- bool OK = true;
+static bool EvaluateDecompositionDeclInit(EvalInfo &Info,
+ const DecompositionDecl *DD);
+static bool EvaluateDecl(EvalInfo &Info, const Decl *D,
+ bool EvaluateConditionDecl = false) {
if (const VarDecl *VD = dyn_cast<VarDecl>(D))
- OK &= EvaluateVarDecl(Info, VD);
+ if (!EvaluateVarDecl(Info, VD))
+ return false;
- if (const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(D))
- for (auto *BD : DD->flat_bindings())
- if (auto *VD = BD->getHoldingVar())
- OK &= EvaluateDecl(Info, VD);
+ if (const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(D);
+ EvaluateConditionDecl && DD)
+ if (!EvaluateDecompositionDeclInit(Info, DD))
+ return false;
- return OK;
+ return true;
+}
+
+static bool EvaluateDecompositionDeclInit(EvalInfo &Info,
+ const DecompositionDecl *DD) {
+ for (auto *BD : DD->flat_bindings())
+ if (auto *VD = BD->getHoldingVar())
+ if (!EvaluateDecl(Info, VD, /*EvaluateConditionDecl=*/true))
+ return false;
----------------
mizvekov wrote:
Nit:
```suggestion
for (auto *BD : DD->flat_bindings())
if (auto *VD = BD->getHoldingVar(); VD && !EvaluateDecl(Info, VD, /*EvaluateConditionDecl=*/true))
return false;
```
There are other instances in this patch where this is applicable as well.
https://github.com/llvm/llvm-project/pull/130228
More information about the cfe-commits
mailing list