[PATCH] D18765: [clang-tidy] Don't complain about const pass_object_size params in declarations

George Burgess IV via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 4 11:19:33 PDT 2016


george.burgess.iv created this revision.
george.burgess.iv added a reviewer: alexfh.
george.burgess.iv added a subscriber: cfe-commits.

This patch seems trivial, but I've never touched clang-tidy before, so I'm just making sure I didn't miss something obvious. :)

--

Clang has a parameter attribute called `pass_object_size`, which requires that its parameter's type be `const`. This restriction only applies at function definitions. e.g.

```
void foo(void *p __attribute__((pass_object_size(0))); // this is a decl; const isn't required.
void foo(void *const p __attribute__((pass_object_size(0))) {} // const is required; this is a def.
```

readability-avoid-const-params-in-decls will complain if you put `const` in the decl. Given that clang gives you an error unless you use `const` in the def, I don't think it's clearly a bad thing to use `const` in the decl. This patch makes said checker not complain about `const` params with the `pass_object_size` attribute.

http://reviews.llvm.org/D18765

Files:
  clang-tidy/readability/AvoidConstParamsInDecls.cpp
  test/clang-tidy/readability-avoid-const-params-in-decls.cpp

Index: test/clang-tidy/readability-avoid-const-params-in-decls.cpp
===================================================================
--- test/clang-tidy/readability-avoid-const-params-in-decls.cpp
+++ test/clang-tidy/readability-avoid-const-params-in-decls.cpp
@@ -65,6 +65,8 @@
 void NF6(const int *const) {}
 void NF7(int, const int) {}
 void NF8(const int, const int) {}
+// pass_object_size requires a const pointer param in definitions.
+void NF9(const char *const __attribute__((pass_object_size(0)))) {}
 
 // Do not match on other stuff
 void NF(const alias_type& i);
@@ -76,3 +78,6 @@
 void NF(const int*);
 void NF(const int* const*);
 void NF(alias_const_type);
+// While pass_object_size only requires a const pointer param in definitions,
+// it's probably best to not complain at users for using it in a decl.
+void NF(const char *const __attribute__((pass_object_size(0))));
Index: clang-tidy/readability/AvoidConstParamsInDecls.cpp
===================================================================
--- clang-tidy/readability/AvoidConstParamsInDecls.cpp
+++ clang-tidy/readability/AvoidConstParamsInDecls.cpp
@@ -31,7 +31,8 @@
 
 void AvoidConstParamsInDecls::registerMatchers(MatchFinder *Finder) {
   const auto ConstParamDecl =
-      parmVarDecl(hasType(qualType(isConstQualified()))).bind("param");
+      parmVarDecl(hasType(qualType(isConstQualified())),
+                  unless(hasAttr(clang::attr::PassObjectSize))).bind("param");
   Finder->addMatcher(functionDecl(unless(isDefinition()),
                                   has(typeLoc(forEach(ConstParamDecl))))
                          .bind("func"),


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18765.52581.patch
Type: text/x-patch
Size: 1635 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160404/f65e9a3a/attachment.bin>


More information about the cfe-commits mailing list