rsmith accepted this revision.
rsmith added a comment.
This revision is now accepted and ready to land.

Looks good. Some possible improvements to make the diagnostic a bit more 
precise, but I'd be happy if you want to address some of those as follow-ups 
after this change.



================
Comment at: clang/lib/Sema/SemaCast.cpp:1041
+                                   ASTContext &Context) {
+  if (SrcType->isPointerType() && DestType->isPointerType())
+    return true;
----------------
I think we should also treat references like pointers here, and similarly for 
block pointers and ObjC pointers. Perhaps using `hasPointerRepresentation()` 
would make sense?


================
Comment at: clang/lib/Sema/SemaCast.cpp:1044-1048
+  // Allow integral type mismatch if their size are equal.
+  if (SrcType->isIntegralType(Context) && DestType->isIntegralType(Context))
+    if (Context.getTypeInfoInChars(SrcType).Width ==
+        Context.getTypeInfoInChars(DestType).Width)
+      return true;
----------------
ychen wrote:
> rsmith wrote:
> > In addition to allowing the cases where the sizes are the same width, 
> > should we also allow cases where the promoted types are the same width (eg, 
> > `int` versus `short`)? What does GCC do?
> GCC does exactly that. I didn't find a way to do that by looking at 
> TargetInfo. Maybe there is a way for clang?
Hm. The right thing to do would be to call 
`ABIInfo::isPromotableIntegerTypeForABI`, but that's defined in `CodeGen` so we 
can't call it from here without violating layering. I suppose we could pull it 
up into the target info in `Basic`, if you're prepared to do that kind of 
refactoring, but maybe for now we can skip this check and emit a few warnings 
that GCC doesn't.


================
Comment at: clang/lib/Sema/SemaCast.cpp:1050-1055
+  llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls;
+  StructuralEquivalenceContext Ctx(
+      Context, Context, NonEquivalentDecls, StructuralEquivalenceKind::Default,
+      false /*StrictTypeSpelling*/, false /*Complain*/,
+      false /*ErrorOnTagTypeMismatch*/);
+  return Ctx.IsEquivalent(SrcType, DestType);
----------------
ychen wrote:
> rsmith wrote:
> > I think a "same type" check (`Context.hasSameUnqualifiedType(SrcType, 
> > DestType)`) would be more appropriate here than a structural equivalence 
> > check.
> Agreed.
Taking this a bit further: we could use `hasSimilarType` to allow changes in 
nested cv-qualifiers. But given that we've already allowed arbitrary 
differences in pointee types, I suppose this would only affect 
pointers-to-members, and it might be preferable to allow arbitrary changes 
between pointer-to-member types here (except in the MS ABI case where there are 
meaningful differences in pointer-to-member representations between classes).

What does GCC do with differences in pointer-to-member types in function 
parameter types?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D97831

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

Reply via email to