================
@@ -3751,6 +3754,17 @@ QualType ASTContext::getCountAttributedType(
   return QualType(CATy, 0);
 }
 
+QualType ASTContext::getLateParsedAttrType(
+    QualType WrappedTy, LateParsedTypeAttribute *LateParsedAttr) const {
+  QualType CanonTy = getCanonicalType(WrappedTy);
+
+  auto *LPATy = new (*this, alignof(LateParsedAttrType))
+      LateParsedAttrType(WrappedTy, CanonTy, LateParsedAttr);
----------------
rapidsna wrote:

@efriedma-quic Thanks! I want to make sure we're aligned on the problem. After 
late parsing, LateParsedAttrType is replaced by CountAttributedType, which is 
also sugar that canonicalizes to the bare pointer, so canonical-type comparison 
already treats `int * __counted_by(n)` and plain `int *` as the same type. 
Bounds compatibility is checked by a separate pass that walks sugar.

The case I can see still being problematic is a sugar walker, e.g. the 
bounds-compatibility checker, or any consumer that asks "does this type carry 
__counted_by?", running during the late-parsing window. Such a walker would 
need to recognize LateParsedAttrType and treat it as "unresolved" rather than 
"no attribute here." Is that the scenario you're concerned about, or do you 
have a different one in mind?

If that's the right framing, the fix would be to make LateParsedAttrType its 
own canonical type and propagate a TypeDependence-style bit through composite 
types, similar to how dependent types work for templates. So any consumer can 
cheaply detect "unresolved late-parsed attribute somewhere inside" and defer.

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

Reply via email to