davrec added inline comments.

================
Comment at: clang/lib/AST/ASTContext.cpp:12767
+        Ctx.getQualifiedType(Underlying),
+        ::getCommonDecl(EX->getOwnedTagDecl(), EY->getOwnedTagDecl()));
+  }
----------------
mizvekov wrote:
> davrec wrote:
> > This last argument should probably be omitted/nullptr passed, since
> > # We probably won't encounter any owned tag decls in the types passed to 
> > this function;
> > # Even if we did, it would not necessarily be true that they both have 
> > non-null owned tag decls, and I don't see any nullptr checks in 
> > getCommonDecl; and
> > # Even if we checked for nullptr there, and say passed the same argument to 
> > X and Y so EX==EY, and that had an owned tag decl, it is not clear to me it 
> > would be appropriate to construct a new type with the same owned tag decl 
> > as another type.
> 1. We can see, a one liner like this will do: `int e = true ? (struct S*)0 : 
> (struct S*)0;`
> 
> Though normally in an example like the above, you would only see the owned 
> decl on X, because when we get to Y the name has already been introduced into 
> the scope.
> 
> I have an idea for a test case, but it's a bit convoluted:
> 
> This also introduces an OwnedTagDecl: `(struct S<T>*)0`.
> 
> So with resugaring, if we resugar T, it might be possible to construct this 
> situatiation. Given if it's appropriate to keep the OwnedTagDecl when 
> resugaring, of course, which goes to 3)
> 
> 2. This is handled by `declaresSameEntity`, if either or both decls are null, 
> we say they are not the same decl.
> 
> 3. That I am not sure. I see that this OwnedTagDecl is only used by the type 
> printer, and it replaces printing the rest of the type by printing the 
> OwnedDecl instead. So why do you think it would not be appropriate that the 
> rebuilt type keeps this?
(Re #3) Because I think the sense ownership is respected in how ownedTagDecls 
are presently handled: at most one ElaboratedType owns a particular TagDecl, 
*and* that type does not seem to be reused elsewhere in the AST.  (This is 
relied on in https://reviews.llvm.org/D131685, which was on my mind when I 
looked at this.)

E.g. consider this expansion of your example:
```
auto e = true ? (struct S*)0 : (true ? (struct S*)0 : (struct S*)0);
```
The first ElaboratedType has an ownedTagDecl; the second is a distinct 
ElaboratedType without an ownedTagDecl, and the third equals the second.  

Now in practice what this means is that `getCommonDecl` when used on binary 
expressions of this sort will always be nullptr, so no harm done.  But suppose 
it is called with X=Y=some ET with an ownedTagDecl (which is the only time I 
believe we could see a non null getCommonDecl result here).  Should the type 
that is returned have that same owned tag decl?  I think that would violate the 
sense of the original type "owning" that decl that seems to be respected 
elsewhere in the AST.

Re type printing, I believe that ownedTagDecls only affects printing of defined 
TagDecls like `struct S { int i; } x;` (which is what I was mostly thinking re 
ownedTagDecls - I don't think we will see those here); for undefined ones like 
`struct S x;`, printing should be unaffected whether there is an ownedTagDecl 
or not.



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D130308/new/

https://reviews.llvm.org/D130308

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to