[cfe-dev] handle __attribute__((deprecated))

Chris Lattner clattner at apple.com
Sat Mar 1 00:28:28 PST 2008


>>> BTW, I just saw how noreturn is handled (it enforces 0  
>>> parameters).  Do you prefer having this enforcement done in  
>>> deprecated as well as  other attributes?
>>
>> Yep, please.
>
> Ok, done in the patch.
>
> In the patch there's also code to handle nothrow+noreturn (including  
> codegen), partial format support (needs tweaking in the callexpr  
> sema), and adds a few more attributes that aren't used yet.
> Anyway, enough for today!

Wow, nice work Nuno!  Some minor critiques:

+class FormatAttr : public Attr {
+  std::string Type;
+  int formatIdx, firstArg;
+public:
+  FormatAttr(const std::string &type, int idx, int first) :  
Attr(Format), Type(type), formatIdx(idx), firstArg(first) {}

Please keep in 80 cols.

+/// DeclHasAttr - returns true if decl Declaration already has the  
target attribute
+static bool DeclHasAttr(const Decl *decl, const Attr *target) {

likewise.  Also, please end sentences with a period.  Here and in  
other comments.

+/// MergeAttributes - append attributes from the Old decl to the New  
one
+static void MergeAttributes(Decl *New, Decl *Old) {
+  for (const Attr *attr = Old->getAttrs(); attr; attr = attr- 
 >getNext()) {
+    if (!DeclHasAttr(New, attr)) {
+      New->addAttr(const_cast<Attr*>(attr));
+    }
+  }
+}

Doesn't this leave the old decl pointing to the attribute list?  This  
seems dangerous.  Please reset the attribute list on "old" to null.   
Also, if the attribute already exists, one of the two should be  
deleted (but be careful to set 'next' to null first, so that other  
attributes aren't deleted!).

+void Sema::HandleFormatAttribute(Decl *d, AttributeList *rawAttr) {
..
+  FunctionDecl *Fn = dyn_cast<FunctionDecl>(d);
+  if (!Fn) {
+    return;
+  }

Should this emit a diagnostic if it's not a function?  Ted, can you  
please review the rest of the 'HandleFormatAttribute' method?


+++ Driver/clang.cpp	(working copy)
@@ -865,6 +865,7 @@
      }

      AddPath("/usr/local/include", System, false, false, false,  
Headers);
+    AddPath("/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include", System,  
false, false, false, Headers); // nuno's laptop

Hopefully this isn't needed with the new CPATH envvar :)



+  if (FD->getAttr<NothrowAttr>())
+    ParamAttrsVec.push_back(
+     llvm::ParamAttrsWithIndex::get(ParamAttrsVec.size(),  
llvm::ParamAttr::NoUnwind));
+  if (FD->getAttr<NoReturnAttr>())
+    ParamAttrsVec.push_back(
+     llvm::ParamAttrsWithIndex::get(ParamAttrsVec.size(),  
llvm::ParamAttr::NoReturn));
+

More 80 col violations.  I think these attributes should always be  
applied to "0", the function itself, so the first arg should be 0, not  
ParamAttrsVec.size().  Try a function that is both noreturn and  
nounwind.

It would be nice to add "warn_unused_result" handling to -Wunused :),  
but that can clearly be a follow-on patch of course.

Incidentally, it would be nice if you could merge the test/CodeGen/ 
weak-function.c test/CodeGen/nothrow.c, etc testcases together.  While  
lots of little test cases is nice, if just one piece starts to fail,  
having larger tests that test multiple related things is useful  
because it makes the tests run faster.

Thanks again for working on this Nuno!

-Chris



More information about the cfe-dev mailing list