ChuanqiXu added inline comments.

================
Comment at: clang/lib/Serialization/ASTReaderDecl.cpp:2925-2926
   for (unsigned I = 0, E = readInt(); I != E; ++I)
-    Attrs.push_back(readAttr());
+    if (auto *Attr = readAttr())
+      Attrs.push_back(Attr);
 }
----------------
tahonermann wrote:
> Interesting, this looks like a pre-existing issue. It looks like 
> `readBTFTypeTagAttr()` in 
> `clang/include/clang/Serialization/ASTRecordReader.h` has an assumption that 
> `readAttr()` always returns non-null. I wonder if that should be modified to 
> use `cast_or_null` rather than `cast`. I don't see any need to address that 
> issue (if it actually exists) in this review though.
Yeah, it surprises me too.


================
Comment at: clang/lib/Serialization/ASTWriter.cpp:4353
+  // https://github.com/llvm/llvm-project/issues/56490 for example.
+  if (!A || (isa<PreferredNameAttr>(A) && Writer->isWritingNamedModules()))
     return Record.push_back(0);
----------------
tahonermann wrote:
> ChuanqiXu wrote:
> > The `Writer->isWritingNamedModules()` part is necessary. Otherwise we would 
> > break the 
> > https://github.com/llvm/llvm-project/blob/main/clang/test/PCH/decl-attrs.cpp
> >  test. The reason why the bug is not found by the user of PCH or clang 
> > modules is that a header generally would be guarded by `#ifndef ... 
> > #define` fashion. And if we remove the guard, the compiler would emit an 
> > error for duplicated definition. So the problem only lives in C++20 Named 
> > Modules.
> Correct me if I'm mistaken, but I think this issue only occurs because, in 
> the test, both modules have the problematic declarations in the global module 
> fragment; thus creating duplicate definitions that have to be merged which 
> then exposes the ODR mismatch.
> 
> I'm suspicious that this actually fixes all possible scenarios. For example:
>   //--- X1.cpp
>   #include "foo.h"
>   import A;
> 
>   //--- X2.cpp
>   import A;
>   #include "foo.h"
> 
> I would expect the proposed change to cause an ODR issue in these scenarios 
> since the definition from the module still needs to be merged in non-modular 
> TUs, but now the imported module will lack the attribute present in the 
> non-modular TUs.
> Correct me if I'm mistaken, but I think this issue only occurs because, in 
> the test, both modules have the problematic declarations in the global module 
> fragment; thus creating duplicate definitions that have to be merged which 
> then exposes the ODR mismatch.

I am not sure if I followed. If you are referring to why this problem only 
exists in C++20 Named Modules, I think you are correct. Other modules (Clang 
modules, C++20 Header units) don't have global modules.

> I'm suspicious that this actually fixes all possible scenarios. For example:

I've added the two examples below. I understand this is confusing at the first 
sight. There are two cases.
(1) For `X1.cpp`, we do ODR checks in ASTReaders by calling 
`ASTContext::isSameEntity.` And  `ASTContext::isSameEntity` wouldn't check for 
attributes.  (Another defect?)
(2) For `X2.cpp`, we do ODR checks in Sema. And it would emit a warning as the 
tests shows.

So as a conclusion, the current implementation works 'not bad' currently. But I 
agree that it might bad in the future. Especially WG21 are going to disallow 
the compilers to ignore the semantics of attributes.



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

https://reviews.llvm.org/D130331

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

Reply via email to