mizvekov added inline comments.

================
Comment at: clang/lib/AST/ASTContext.cpp:11551-11552
+    if (Unqualified && !Ctx.hasSameType(X, Y)) {
+      assert(Ctx.hasSameUnqualifiedType(X, Y));
+      auto XQuals = X.getCVRQualifiers(), YQuals = Y.getCVRQualifiers();
+      X.addFastQualifiers(YQuals & ~XQuals);
----------------
rsmith wrote:
> What should happen if there's a qualifier difference other than a CVR 
> qualifier? Eg, address space or ObjC lifetime.
I have updated the `ASContext::getCommonSugaredType` to accept an `Unqualified` 
parameter to handle this case.
We will strip qualifiers from each other until the types are the same.


================
Comment at: clang/lib/AST/ASTContext.cpp:11578
+  default:
+    return X;
+  }
----------------
rsmith wrote:
> For `TemplateArgument::ArgKind::Declaration`, I think it'd make sense to take 
> the common type of the `getParamTypeForDecl`s.
Yeah, but this has been dead code since we went back to canonical template 
parameter / arguments.
I have removed it and put some unreachables in place.
We will circle back around to add it with this suggestion later.


================
Comment at: clang/lib/AST/ASTContext.cpp:11790-11801
+    if (EPIX.ExceptionSpec.Exceptions.size() ==
+        EPIY.ExceptionSpec.Exceptions.size()) {
+      auto E = getCommonTypeArray(Ctx, EPIX.ExceptionSpec.Exceptions,
+                                  EPIY.ExceptionSpec.Exceptions);
+      EPIX.ExceptionSpec.Exceptions = E;
+      return Ctx.getFunctionType(R, P, EPIX);
+    } else {
----------------
rsmith wrote:
> This seems a bit suspicious: `getCommonTypeArray` assumes the two arrays 
> contain the same types in the same order, but if the arrays can be different 
> sizes, is it really correct to assume that they contain the same types if 
> they're the same size?
> 
> Can we make this work the same way that the conditional expression handling 
> deals with differing lists of exception types?
Handled this with a new `ASTContext::mergeTypeLists` that does what the 
conditional expression handling did, while getting the common sugar of types 
when they occur in both lists.


================
Comment at: clang/lib/AST/ASTContext.cpp:11861
+               *IY = cast<InjectedClassNameType>(Y);
+    assert(IX->getDecl() == IY->getDecl());
+    return Ctx.getInjectedClassNameType(
----------------
rsmith wrote:
> I think this should probably be a `declaresSameEntity` check: we might be 
> comparing injected class names from two different merged modules with two 
> different declarations for the same class definition. The right declaration 
> to use is the one that is chosen to be "the" definition.
Implemented this with a new getCommonDecl function, which for now will just 
fall back to the canonical decl if they differ.

Wonder if there is a cheap way to determine which of the two decls was declared 
earlier. Have to look this up, but would a simple pointer comparison be 
guaranteed to work? Eg would the earliest declaration, since being created 
earlier and allocated earlier, be guaranteed by design to have a lower (or 
greater) pointer value?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D111283

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

Reply via email to