davrec added a comment.

If I understand this correctly: whenever isDivergent() is true, `getDecl()` or 
`getFoundDecl()` is an arbitrary choice between multiple candidate 
(re)declarations of a typedef or using decl.  In particular it will be the 
first redeclaration, //even though each different redeclaration can contain 
different sugar information//.

E.g. considering your examples:

  using X1 = int;
  using Y1 = int;
  
  using RPB1 = X1*;
  using RPX1 = RPB1;
  using RPB1 = Y1*; // redeclared
  using RPY1 = RPB1;
  
  namespace A { using type1 = X1*; };
  namespace C { using A::type1; };
  using UPX1 = C::type1;
  namespace A { using type1 = Y1*; };  // redeclared
  namespace C { using A::type1; };     // redeclared
  using UPY1 = C::type1;

So far so good: isDivergent() would be false for all the above TypedefTypes and 
UsingTypes, since the UnderlyingTypes and Decls/FoundDecls are consistent.  But 
these types are a different matter:

  auto t29 = 0 ? (RPX1){} : (RPY1){};
  auto t32 = 0 ? (UPX1){} : (UPY1){};

In the process of unifying the sugar to get the deduced type of t29/t32, we 
will compare their sugar, which has the same basic structure for each, but 
different decls/found decls; so unifying these types will simply involve 
unifying their decls; and getCommonDecl(X,Y) has been defined to will simply 
get the older declaration between them.  So, the TypedefType/UsingType sugar in 
t29/t32 will reference the X1 decls and friends, *not* the Y1s, as its 
Decls/FoundDecls.  (Right?)

The UnderlyingType however will not be as arbitrary, as it will use 
getCommonType to skip over everything the two don't have in common.

If I have this right, my question is: since the Decl/FoundDecl is an arbitrary 
choice, should we solve this by either

1. constructing these with a null Decl/FoundDecl for such types, or if that is 
problematic,
2. renaming `isDivergent` to `declIsArbitrary()` or something like that, to 
suggest that not only do the underlying type and decl diverge, it is the 
underlying type which is more meaningful, not the decl.





================
Comment at: clang/include/clang/AST/Type.h:4490
   UsingShadowDecl *getFoundDecl() const { return Found; }
+  bool isDivergent() const { return UsingBits.isDivergent; }
   QualType getUnderlyingType() const;
----------------
The name of this might be less important than just documenting it extremely 
well here, with an example.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D133468

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

Reply via email to