summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2016-04-21 17:27:43 +0200
committerStephan Bergmann <sbergman@redhat.com>2016-04-21 17:27:43 +0200
commit8c423eeb49606087243fb6bbf31c0981c55dc773 (patch)
tree8bc107fcda78cff488e79e37cfe1e640de87a81f /compilerplugins
parent4f92eb777ab17e0a2ee478572a46d060742902e1 (diff)
Use Sequence ctor taking initializer_list
needed adapting loplugin:implicitboolconversion to not warn about Sequence<sal_Bool> arBool({true, false, true}); Change-Id: I971918aab7c958ef8f1e4e0548a84314e95f8325
Diffstat (limited to 'compilerplugins')
-rw-r--r--compilerplugins/clang/implicitboolconversion.cxx39
1 files changed, 39 insertions, 0 deletions
diff --git a/compilerplugins/clang/implicitboolconversion.cxx b/compilerplugins/clang/implicitboolconversion.cxx
index 9fa073c43fd7..226f49db6f1b 100644
--- a/compilerplugins/clang/implicitboolconversion.cxx
+++ b/compilerplugins/clang/implicitboolconversion.cxx
@@ -293,6 +293,8 @@ public:
bool TraverseBinXorAssign(CompoundAssignOperator * expr);
+ bool TraverseCXXStdInitializerListExpr(CXXStdInitializerListExpr * expr);
+
bool TraverseReturnStmt(ReturnStmt * stmt);
bool TraverseFunctionDecl(FunctionDecl * decl);
@@ -766,6 +768,43 @@ bool ImplicitBoolConversion::TraverseBinXorAssign(CompoundAssignOperator * expr)
return bRet;
}
+bool ImplicitBoolConversion::TraverseCXXStdInitializerListExpr(
+ CXXStdInitializerListExpr * expr)
+{
+ // Must be some std::initializer_list<T>; check whether T is sal_Bool (i.e.,
+ // unsigned char) [TODO: check for real sal_Bool instead]:
+ auto t = expr->getType();
+ if (auto et = dyn_cast<ElaboratedType>(t)) {
+ t = et->desugar();
+ }
+ auto ts = t->getAs<TemplateSpecializationType>();
+ if (ts == nullptr
+ || !ts->getArg(0).getAsType()->isSpecificBuiltinType(
+ clang::BuiltinType::UChar))
+ {
+ return RecursiveASTVisitor::TraverseCXXStdInitializerListExpr(expr);
+ }
+ // Avoid warnings for code like
+ //
+ // Sequence<sal_Bool> arBool({true, false, true});
+ //
+ auto e = dyn_cast<InitListExpr>(
+ ignoreParenAndTemporaryMaterialization(expr->getSubExpr()));
+ if (e == nullptr) {
+ return RecursiveASTVisitor::TraverseCXXStdInitializerListExpr(expr);
+ }
+ nested.push(std::vector<ImplicitCastExpr const *>());
+ bool ret = RecursiveASTVisitor::TraverseCXXStdInitializerListExpr(expr);
+ assert(!nested.empty());
+ for (auto i: nested.top()) {
+ if (!std::find(e->begin(), e->end(), i)) {
+ reportWarning(i);
+ }
+ }
+ nested.pop();
+ return ret;
+}
+
bool ImplicitBoolConversion::TraverseReturnStmt(ReturnStmt * stmt) {
nested.push(std::vector<ImplicitCastExpr const *>());
bool bRet = RecursiveASTVisitor::TraverseReturnStmt(stmt);