AaronBallman wrote:

> I concluded that the local queue introduced in the previous commits isn’t 
> necessary in C mode. Since attribute equivalence is currently checked only 
> for C23, I removed the code entirely.
> 
> If we later enable attribute equivalence checking in C++ mode, we may need to 
> revisit this and adopt a similar approach. For example, without a separate 
> queue, clang will diagnose the attribute but fail to report the mismatch in 
> the type of member `a` when attempting to merge the following struct:
> 
> ```
> struct GuardedBy {
>   int b __attribute__((guarded_by(lock)));
>   // The pair of S is added to NonEquivalentDecls, but the pair of Lock 
> isn't. 
>   struct __attribute__ ((lockable)) Lock {
>     struct S {
> #ifdef D1
>       unsigned a;
> #else
>       int a;
> #endif
>     } s;
>   } lock;
> };
> ```
> 
> $ clang -cc1 -std=c++20 -emit-pch -o f1.ast -x c++ test.h $ clang -cc1 
> -std=c++20 -emit-pch -o f2.ast -DD1 -x c++ test.h $ clang -cc1 -std=c++20 
> -ast-merge f1.ast -ast-merge f2.ast -x c++ test.cpp

CC @ChuanqiXu9 @Bigcheese as C++ modules maintainers. I am under the impression 
we need this for both C++ modules support and C23's redefinition checking. If 
we don't need the more complicated approach right now, I think the current 
approach is reasonable for C (but CC @erichkeane for awareness of the tablegen 
changes), I just want to make sure we're not making further work harder for 
ourselves.

https://github.com/llvm/llvm-project/pull/168769
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to