summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorNoel Grandin <noel@peralex.com>2014-06-09 09:37:32 +0200
committerNoel Grandin <noel@peralex.com>2014-06-09 10:10:14 +0200
commit5d1e22d52a659b12fe7f6b5870bd12d07ddca0d8 (patch)
tree332102e4ff55b5414725c8613db3cb7847248bb9 /compilerplugins
parent184a00b96235f6432294ded63ce4a4a318effdb5 (diff)
improve safety of loplugin inlinesimplememberfunctions
don't try and move functions containing comments Change-Id: I2de8fc8be851af979acf9d1a91e7cdd9a5dc6a32
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/inlinesimplememberfunctions.cxx13
1 files changed, 13 insertions, 0 deletions
diff --git a/compilerplugins/clang/inlinesimplememberfunctions.cxx b/compilerplugins/clang/inlinesimplememberfunctions.cxx
index 4bee14c25200..cd5aa238b66e 100644
--- a/compilerplugins/clang/inlinesimplememberfunctions.cxx
+++ b/compilerplugins/clang/inlinesimplememberfunctions.cxx
@@ -171,6 +171,12 @@ bool InlineSimpleMemberFunctions::VisitCXXMethodDecl(const CXXMethodDecl * funct
"inlinesimpleaccessmethods",
functionDecl->getSourceRange().getBegin())
<< functionDecl->getSourceRange();
+ // display the location of the class member declaration
+ report(
+ DiagnosticsEngine::Note,
+ "inlinesimpleaccessmethods",
+ functionDecl->getCanonicalDecl()->getSourceRange().getBegin())
+ << functionDecl->getCanonicalDecl()->getSourceRange();
}
return true;
}
@@ -197,6 +203,7 @@ bool InlineSimpleMemberFunctions::isInUnoIncludeFile(SourceLocation spellingLoca
|| name.startswith(SRCDIR "/include/systools/")
|| name.startswith(SRCDIR "/include/typelib/")
|| name.startswith(SRCDIR "/include/uno/")
+ || name.startswith(SRCDIR "/workdir/")
|| name == SRCDIR "/include/comphelper/implbase_var.hxx");
}
@@ -239,6 +246,12 @@ bool InlineSimpleMemberFunctions::rewrite(const CXXMethodDecl * functionDecl) {
p1 = compiler.getSourceManager().getCharacterData( functionDecl->getBody()->getLocStart() );
p2 = compiler.getSourceManager().getCharacterData( functionDecl->getBody()->getLocEnd() );
std::string s1( p1, p2 - p1 + 1);
+
+ /* we can't safely move around stuff containing comments, we mess up the resulting code */
+ if ( s1.find("/*") != std::string::npos || s1.find("//") != std::string::npos ) {
+ return false;
+ }
+
// strip linefeeds and any double-spaces, so we have a max of one space between tokens
s1 = ReplaceString(s1, "\r", "");
s1 = ReplaceString(s1, "\n", "");