summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorLuboš Luňák <l.lunak@suse.cz>2012-10-26 19:24:24 +0200
committerLuboš Luňák <l.lunak@suse.cz>2012-10-26 19:26:11 +0200
commit5646906f5be7d3a0909fc2d2c29b0904324d574c (patch)
tree6d9d4603fe2fa249ba5f2873c94b55777170a286 /compilerplugins
parent0956d2639160a70b3a0f88d911b6b0c5a5c279e0 (diff)
do not warn about missing area in SAL_DEBUG
Change-Id: I99314136cac7f47a5adf8e0e29093ec9fbf4fd90
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/sallogareas.cxx30
1 files changed, 23 insertions, 7 deletions
diff --git a/compilerplugins/clang/sallogareas.cxx b/compilerplugins/clang/sallogareas.cxx
index 1a4a8b25c3c2..016e004a9669 100644
--- a/compilerplugins/clang/sallogareas.cxx
+++ b/compilerplugins/clang/sallogareas.cxx
@@ -11,6 +11,7 @@
#include "sallogareas.hxx"
#include <clang/Basic/SourceManager.h>
+#include <clang/Lex/Lexer.h>
#include <fstream>
@@ -54,15 +55,15 @@ bool SalLogAreas::VisitCallExpr( CallExpr* call )
string qualifiedName = func->getQualifiedNameAsString();
if( qualifiedName == "sal_detail_log" || qualifiedName == "sal::detail::log" )
{
+ // The SAL_DETAIL_LOG_STREAM macro expands to two calls to sal::detail::log(),
+ // so do not warn repeatedly about the same macro (the area->getLocStart() of all the calls
+ // from the same macro should be the same).
+ SourceLocation expansionLocation = context.getSourceManager().getExpansionLoc( call->getLocStart());
+ if( expansionLocation == lastSalDetailLogStreamMacro )
+ return true;
+ lastSalDetailLogStreamMacro = expansionLocation;
if( const StringLiteral* area = dyn_cast< StringLiteral >( call->getArg( 1 )->IgnoreParenImpCasts()))
{
- // The SAL_DETAIL_LOG_STREAM macro expands to two calls to sal::detail::log(),
- // so do not warn repeatedly about the same macro (the area->getLocStart() of all the calls
- // from the same macro should be the same).
- SourceLocation expansionLocation = context.getSourceManager().getExpansionLoc(area->getLocStart());
- if( expansionLocation == lastSalDetailLogStreamMacro )
- return true;
- lastSalDetailLogStreamMacro = expansionLocation;
if( area->getKind() == StringLiteral::Ascii )
checkArea( area->getBytes(), area->getExprLoc());
else
@@ -72,6 +73,21 @@ bool SalLogAreas::VisitCallExpr( CallExpr* call )
}
if( inFunction->getQualifiedNameAsString() == "sal::detail::log" )
return true; // This function only forwards to sal_detail_log, so ok.
+ if( call->getArg( 1 )->isNullPointerConstant( context, Expr::NPC_ValueDependentIsNotNull ) != Expr::NPCK_NotNull )
+ { // If the area argument is a null pointer, that is allowed only for SAL_DEBUG.
+ const SourceManager& source = context.getSourceManager();
+ for( SourceLocation loc = call->getLocStart();
+ loc.isMacroID();
+ loc = source.getImmediateExpansionRange( loc ).first )
+ {
+ StringRef inMacro = Lexer::getImmediateMacroName( loc, source, context.getLangOpts());
+ if( inMacro == "SAL_DEBUG" )
+ return true; // ok
+ }
+ report( DiagnosticsEngine::Warning, "missing log area [loplugin]",
+ call->getArg( 1 )->IgnoreParenImpCasts()->getLocStart());
+ return true;
+ }
report( DiagnosticsEngine::Warning, "cannot analyse log area argument (plugin needs fixing?) [loplugin]",
call->getLocStart());
}