================
@@ -268,6 +268,40 @@ void Sema::inferLifetimeBoundAttribute(FunctionDecl *FD) {
   }
 }
 
+static bool IsPointerLikeType(QualType QT) {
+  QT = QT.getNonReferenceType();
+  if (QT->isPointerType())
+    return true;
+  auto *RD = QT->getAsCXXRecordDecl();
+  if (!RD)
+    return false;
+  RD = RD->getCanonicalDecl();
+  if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
+    RD = CTSD->getSpecializedTemplate()->getTemplatedDecl();
----------------
hokein wrote:

Thanks for the example. I think I understand what’s happening here.

The primary template Span is annotated with the gsl::Pointer attribute, so all 
its specializations should inherit this attribute.

However, in this example, at the point where we infer the `lifetime_capture_by` 
attribute for `vector`'s method, we don’t yet have a fully completed 
`ClassTemplateSpecializationDecl` for `Span<int>` (and therefore, no 
`PointerAttr`). This is likely because the instantiation of `Span<int>` isn’t 
required for the statement `std::vector<Span<int>> spans;`.

I think the following case would work without this special handling.
```
void use() {
  Span<int> abc({}); // trigger an instantiation of `Span<int>`.
  std::vector<Span<int>> spans;
  spans.push_back(std::vector<int>{1, 2, 3}); // warning.
}
```

I don’t have a better suggestion for addressing this issue directly. However, I 
think we should have a comment explaining it. (Should we do the same thing for 
the one in `CheckExprLifetime.cpp`?)


https://github.com/llvm/llvm-project/pull/117122
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to