vsapsai added a comment.

In D135472#3844688 <https://reviews.llvm.org/D135472#3844688>, @ChuanqiXu wrote:

> I guess the reason why we didn't check odr violation for attributes is that 
> the attributes was not a part of declarations in C++ before. But it is odd to 
> skip the check for attributes from the perspective of users.  So I think this 
> one should be good.

I think we haven't seen many problems with attribute mismatches because in 
existing code attributes are often hidden behind macros. And we have sugar 
`MacroQualifiedType` that causes the definitions

  #define NODEREF __attribute__((noderef))
  struct StructWithField {
    int NODEREF *i_ptr;
  };

  struct StructWithField {
    int __attribute__((noderef)) *i_ptr;
  };

to be treated as incompatible.

But the keyword `alignas` is used without macros and more attributes can be 
used in multiple compilers without macros. That's why I think it is useful to 
detect and to diagnose mismatches in attributes.

In D135472#3844688 <https://reviews.llvm.org/D135472#3844688>, @ChuanqiXu wrote:

> The only concern is that it misses too many checks for attributes. Do you 
> plan to add it in near future or in longer future?

In the near future I was planning to add various Objective-C and Swift 
attributes. For other attributes I don't know which are high-value. I 
definitely want to check attributes affecting the memory layout (alignment, 
packing) and believe I've addressed them (totally could have missed something).

In D135472#3844688 <https://reviews.llvm.org/D135472#3844688>, @ChuanqiXu wrote:

> And I guess we need to mention this in ReleaseNotes in `Potential Breaking 
> Changes` section.

Good idea, will do.



================
Comment at: clang/lib/AST/ODRDiagsEmitter.cpp:337-354
+    if (!LHS || !RHS || LHS->getKind() != RHS->getKind()) {
+      DiagError(AttributeKind)
+          << (LHS != nullptr) << LHS << FirstDecl->getSourceRange();
+      DiagNoteAttrLoc(LHS);
+      DiagNote(AttributeKind)
+          << (RHS != nullptr) << RHS << SecondDecl->getSourceRange();
+      DiagNoteAttrLoc(RHS);
----------------
ChuanqiXu wrote:
> I feel like we can merge these two statements.
Sorry, I don't really get what two statements you are talking about. Is it 
* `!LHS || !RHS || LHS->getKind() != RHS->getKind()`
* `ComputeAttrODRHash(LHS) != ComputeAttrODRHash(RHS)`
?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D135472

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

Reply via email to