summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/overrideparam.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/overrideparam.cxx')
-rw-r--r--compilerplugins/clang/overrideparam.cxx16
1 files changed, 14 insertions, 2 deletions
diff --git a/compilerplugins/clang/overrideparam.cxx b/compilerplugins/clang/overrideparam.cxx
index aca1e952ba66..c9d836c91b4e 100644
--- a/compilerplugins/clang/overrideparam.cxx
+++ b/compilerplugins/clang/overrideparam.cxx
@@ -37,6 +37,7 @@ public:
private:
bool hasSameDefaultParams(const ParmVarDecl * parmVarDecl, const ParmVarDecl * superParmVarDecl);
+ bool evaluate(const Expr* expr, APSInt& x);
};
void OverrideParam::run()
@@ -155,8 +156,7 @@ bool OverrideParam::hasSameDefaultParams(const ParmVarDecl * parmVarDecl, const
return true;
}
APSInt x1, x2;
- if (defaultArgExpr->EvaluateAsInt(x1, compiler.getASTContext())
- && superDefaultArgExpr->EvaluateAsInt(x2, compiler.getASTContext()))
+ if (evaluate(defaultArgExpr, x1) && evaluate(superDefaultArgExpr, x2))
{
return x1 == x2;
}
@@ -186,6 +186,18 @@ bool OverrideParam::hasSameDefaultParams(const ParmVarDecl * parmVarDecl, const
#endif
}
+bool OverrideParam::evaluate(const Expr* expr, APSInt& x)
+{
+ if (expr->EvaluateAsInt(x, compiler.getASTContext()))
+ {
+ return true;
+ }
+ if (isa<CXXNullPtrLiteralExpr>(expr)) {
+ x = 0;
+ return true;
+ }
+ return false;
+}
loplugin::Plugin::Registration< OverrideParam > X("overrideparam");