================
@@ -23567,6 +23888,20 @@ static void checkMappableExpressionList(
       continue;
     }
 
+    // Check for unsupported structured bindings early.
+    if (!NoDiagnose) {
+      if (const auto *DRE = dyn_cast<DeclRefExpr>(SimpleExpr)) {
+        const DecompositionDecl *DD = nullptr;
+        if (const auto *BD = dyn_cast<BindingDecl>(DRE->getDecl())) {
+          DD = cast<DecompositionDecl>(BD->getDecomposedDecl());
+        } else if (const auto *D =
+                       dyn_cast<DecompositionDecl>(DRE->getDecl())) {
+          DD = D;
+        }
+        if (DD && !getOriginalVarOrDiagnose(SemaRef, DD, ELoc))
----------------
alexey-bataev wrote:

1. It calls getOriginalVarOrDiagnose for any BindingDecl in a map clause, 
tuple-like or not. If the tuple-like decomposition's source is itself a plain 
variable (auto [a,b] = existingPair; map(a)), getOriginalVar() happily returns 
that variable (non-null) since it's just a DeclRefExpr, so this new check 
doesn't fire - and MapBaseChecker::VisitDeclRefExpr's "fallback: redirect to 
DecompositionDecl for ... tuples" branch would then map the whole hidden 
decomposition object rather than reject it the way test_pair/test_tuple (which 
only test implicit body use, not map()) expect.
2. No test exercises map() on a tuple-like binding at all - worth adding.

https://github.com/llvm/llvm-project/pull/190832
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to