martong marked an inline comment as done.
martong added a comment.

In D68634#1700591 <https://reviews.llvm.org/D68634#1700591>, @a_sidorin wrote:

> Hello Balasz,
>  In my opinion, importing and setting the attributes should be handled by the 
> stuff used in InitializeImportedDecl(). Can we extend it or reuse the code? 
> It will allow us not to miss the required actions while importing a new 
> function too.


I was thinking about that too, but it turned out to be a way more intrusive 
change.

We have to work with the most recent existing decl (`PrevDecl`) of the 
FunctionDecl whose attribute we currently import.
We can get the `PrevDecl` only with the help of the lookup. We can't get it 
from the `ToD` param of `InitializeImportedDecl` because by the time when we 
call `InitializeImportedDecl` the redecl chain is not connected. So, we should 
pass `PrevDecl` then into `GetImportedOrCreateDecl`.  It would require to 
change all call expressions of `GetImportedOrCreateDecl` (58 occurences). 
Besides, we would use the `PrevDecl` only in case of inheritable attributes, 
only they require this special care. Note that there are a bunch of 
non-inheritable attributes which are already handled correctly in 
`InitializeImportedDecl`.



================
Comment at: clang/lib/AST/ASTImporter.cpp:7842
+// This implementation is inspired by Sema::mergeDeclAttributes.
+void ASTNodeImporter::CopyInheritedAttributes(FunctionDecl *Old,
+                                              FunctionDecl *New) {
----------------
shafik wrote:
> There are other attributes that [apply to functions as 
> well](https://en.cppreference.com/w/cpp/language/attributes): `nodiscard`, 
> `maybe_unused` and `deprecated`. Is there a reason not to support those as 
> well?
Different attributes require different handling.

E.g. C++11 [[noreturn]] requires diagnostics if the first declaration of a 
function does not specify a the attribute, but a later does:
```
void f();
[[noreturn]] void f(); // ERROR
```
If a function is declared with [[noreturn]] in one translation unit, and the 
same function is declared without [[noreturn]] in another translation unit, the 
program is ill-formed; no diagnostic required.

But this is not true to the GNU __attribute__((noreturn)).

Also, there are non-inheritable attributes, in their case we do not have to 
copy anything from the existing most-recent-decl.

Thus, I think I am going to change the patch's name to indicate we deal only 
with `__attribute__((noreturn))` and with `analyzer_noreturn`.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D68634



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

Reply via email to