I’m trying to write a “use [[nodiscard]]” clang-tidy checker/fix-it to advise when a function might benefit from having [[nodiscard]] added
Mostly this is working working except I’m finding the wrong location for the place to put the [[nodiscard]] for functions which have const,inline or virtual kewords infront of the return type.
e.g.
test.cxx:18:5: warning: function ’ empty ’ should be made [[nodiscard]] [modernize-use-nodiscard]
bool empty() const
^
[[nodiscard]]
test.cxx:26:5: warning: function ’ empty’ should be made [[nodiscard]] [modernize-use-nodiscard]
bool empty(const A &val) const
^
[[nodiscard]]
test.cxx:50:11: warning: function ’ empty’ should be made [[nodiscard]] [modernize-use-nodiscard]
const bool empty() const
^
[[nodiscard]]
test.cxx:55:18: warning: function ’ empty ’ should be made [[nodiscard]] [modernize-use-nodiscard]
inline const bool empty() const
^
[[nodiscard]]
And some compilers don’t like the [[nodiscard] being placed in between those keywords and the return type (preferring them to be at the front of the function)
I’m currently using (following a series of trail and errors) to find the location just before the return type
MatchedDecl->getReturnTypeSourceRange().getBegin()
e.g.
// This function could be marked [[nodiscard]]
diag(MatchedDecl->getReturnTypeSourceRange().getBegin(),
“function %0 should be marked [[nodiscard]]”)
<< MatchedDecl
<< FixItHint::CreateInsertion(
MatchedDecl->getReturnTypeSourceRange().getBegin(),
"[[nodiscard]] ");
Does anyone know how I should correctly identify the position in front of all the keywords(virtual,inline,const)?
Especially in the case where the return type is on a different source code line
e.g.
virtual
const bool full()
Many thanks in advance, feel free to point out any other “errors of my ways” as this is my first ever checker.
MyDeveloperDay
a current copy of the current checker code is presented here for completeness